Pythonでの2つの辞書の類似性に基づいて「類似スコア」を返しますか?

シェーン・スミスコル

次の関数を使用すると、2つの文字列がどれほど類似しているかを返すことができることを知っています。

from difflib import SequenceMatcher
def similar(a, b):
    output=SequenceMatcher(None, a, b).ratio()
    return output

In [37]: similar("Hey, this is a test!","Hey, man, this is a test, man.")
Out[37]: 0.76
In [38]: similar("This should be one.","This should be one.")
Out[38]: 1.0

しかし、キーとそれに対応する値の類似性に基づいて2つの辞書をスコアリングすることは可能ですか?共通のキーの数や共通のキーでなく、上記の文字列の例のように0から1までのスコア。

この辞書で、ratings ['Shane']とratings ['Joe']の類似スコアを見つけようとしています。

ratings={'Shane': {'127 Hours': 3.0, 'Avatar': 4.0, 'Nonstop': 5.0}, 'Joe': {'127 Hours': 5.0, 'Taken 3': 4.0, 'Avatar': 5.0, 'Nonstop': 3.0}}

Python2.7.10を使用しています

バックトラック
import math

ratings={'Shane': {'127 Hours': 3.0, 'Avatar': 4.0, 'Nonstop': 5.0}, 'Joe': {'127 Hours': 5.0, 'Taken 3': 4.0, 'Avatar': 5.0, 'Nonstop': 3.0}}

def cosine_similarity(vec1,vec2):
        sum11, sum12, sum22 = 0, 0, 0
        for i in range(len(vec1)):
            x = vec1[i]; y = vec2[i]
            sum11 += x*x
            sum22 += y*y
            sum12 += x*y
        return sum12/math.sqrt(sum11*sum22)

list1 = list(ratings['Shane'].values())
list2 =  list(ratings['Joe'].values())

sim = cosine_similarity(list1,list2)
print(sim)

出力

o/p : 0.9205746178983233

使用時に更新

ratings={'Shane': {'127 Hours': 5.0, 'Avatar': 4.0, 'Nonstop': 5.0},
         'Joe': {'127 Hours': 5.0, 'Taken 3': 4.0, 'Avatar': 5.0, 'Nonstop': 3.0}}

出力:0.9574271077563381

Update2:正規化された長さと考慮されるキー

from math import*


ratings={'Shane': {'127 Hours': 5.0, 'Avatar': 4.0, 'Nonstop': 5.0},
         'Joe': {'127 Hours': 5.0, 'Taken 3': 4.0, 'Avatar': 5.0, 'Nonstop': 3.0},
         'Bob': {'Panic Room':5.0,'Nonstop':5.0}}


def square_rooted(x):

    return round(sqrt(sum([a*a for a in x])),3)

def cosine_similarity(x,y):

    input1 = {}
    input2 = {}
    vector2 = []
    vector1 =[]

    if len(x) > len(y):
        input1 = x
        input2 = y
    else:
        input1 = y
        input2 = x


    vector1 = list(input1.values())

    for k in input1.keys():    # Normalizing input vectors. 
        if k in input2:
            vector2.append(float(input1[k]))
        else :
            vector2.append(float(0))


    numerator = sum(a*b for a,b in zip(vector2,vector1))
    denominator = square_rooted(vector1)*square_rooted(vector2)
    return round(numerator/float(denominator),3)


print("Similarity between Shane and Joe")
print (cosine_similarity(ratings['Shane'],ratings['Joe']))

print("Similarity between Joe and Bob")
print (cosine_similarity(ratings['Joe'],ratings['Bob']))

print("Similarity between Shane and Bob")
print (cosine_similarity(ratings['Shane'],ratings['Bob']))

出力:

Similarity between Shane and Joe
0.887
Similarity between Joe and Bob
0.346
Similarity between Shane and Bob
0.615

ジャッカードとコサインの間の素晴らしい説明https//datascience.stackexchange.com/questions/5121/applications-and-differences-for-jaccard-similarity-and-cosine-similarity

私はPython3.4を使用しています

:不足している値に0を割り当てました。ただし、適切な値を割り当てることもできます。参照:http//www.analyticsvidhya.com/blog/2015/02/7-steps-data-exploration-preparation-building-model-part-2/

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

キーを除く類似性に基づいて2つの辞書をマージします

分類Dev

PySparkでの値の類似性に基づいて、キーと値のペアを減らします

分類Dev

Sparkでの値の類似性に基づいて、キーと値のペアをマップします

分類Dev

類似性の基本に基づいて画像を分類する

分類Dev

dplyr-列名の類似性に基づいて数式を変更します

分類Dev

他の2つの辞書から類似性のある辞書を作成します

分類Dev

類似性について2つのパスを比較する

分類Dev

Pythonでコサイン類似性を使用して2つの辞書を比較するときにエラーを入力する

分類Dev

2つの辞書をすばやく比較して、類似点を新しい辞書に追加するにはどうすればよいですか?

分類Dev

類似のタグに基づいてSQLで類似のニュースを検索する

分類Dev

パンダ-2つのセルの類似した内容に基づいて行をマージします

分類Dev

類似性の尺度(コサイン類似性など)に基づいて、Holoviewsヒートマップの列と行を並べ替えます。

分類Dev

Postgresql:ブール列に基づいて2つの類似した行から選択します

分類Dev

Python-時間情報(インスタント、間隔)に基づいてアイテム間の類似性を計算します

分類Dev

列名と文字列の類似性に基づいて2つのtxtファイルをマージするにはどうすればよいですか?

分類Dev

属性に基づいて、2つのオブジェクト間の類似性を評価するためのメトリックはありますか?

分類Dev

id列に基づいてデータフレーム内のいくつかの値の類似性を確認します

分類Dev

Elixirの類似性について2つのリストを比較する

分類Dev

mysqlでの結合操作とともに、3つの列(city + streetaddress + state)の値に基づいて類似の住所レコードを選択します

分類Dev

列の条件に基づいて、新しい列に配置された2つの行の類似性

分類Dev

Prolog:類似性について2つのリストをテストする

分類Dev

いくつかの類似した属性に基づいて類似したタプルを分離する方法は?

分類Dev

いくつかの類似した属性に基づいて類似したタプルを分離する方法は?

分類Dev

行レベルで他の列名を持ついくつかの要素の類似性に基づいて、列のセル値パンダ更新する方法

分類Dev

2つのキャンバス要素を比較して類似性を確認し、結果を返します

分類Dev

特徴ベクトルを使用して2つの画像間の類似度スコアを計算するにはどうすればよいですか?

分類Dev

意味的類似性/関連性に基づいてリストから重複を削除します

分類Dev

KnnMatchを使用して2つの画像間の類似性を返す

分類Dev

Python類似性について文字列の2つのリストを比較する

Related 関連記事

  1. 1

    キーを除く類似性に基づいて2つの辞書をマージします

  2. 2

    PySparkでの値の類似性に基づいて、キーと値のペアを減らします

  3. 3

    Sparkでの値の類似性に基づいて、キーと値のペアをマップします

  4. 4

    類似性の基本に基づいて画像を分類する

  5. 5

    dplyr-列名の類似性に基づいて数式を変更します

  6. 6

    他の2つの辞書から類似性のある辞書を作成します

  7. 7

    類似性について2つのパスを比較する

  8. 8

    Pythonでコサイン類似性を使用して2つの辞書を比較するときにエラーを入力する

  9. 9

    2つの辞書をすばやく比較して、類似点を新しい辞書に追加するにはどうすればよいですか?

  10. 10

    類似のタグに基づいてSQLで類似のニュースを検索する

  11. 11

    パンダ-2つのセルの類似した内容に基づいて行をマージします

  12. 12

    類似性の尺度(コサイン類似性など)に基づいて、Holoviewsヒートマップの列と行を並べ替えます。

  13. 13

    Postgresql:ブール列に基づいて2つの類似した行から選択します

  14. 14

    Python-時間情報(インスタント、間隔)に基づいてアイテム間の類似性を計算します

  15. 15

    列名と文字列の類似性に基づいて2つのtxtファイルをマージするにはどうすればよいですか?

  16. 16

    属性に基づいて、2つのオブジェクト間の類似性を評価するためのメトリックはありますか?

  17. 17

    id列に基づいてデータフレーム内のいくつかの値の類似性を確認します

  18. 18

    Elixirの類似性について2つのリストを比較する

  19. 19

    mysqlでの結合操作とともに、3つの列(city + streetaddress + state)の値に基づいて類似の住所レコードを選択します

  20. 20

    列の条件に基づいて、新しい列に配置された2つの行の類似性

  21. 21

    Prolog:類似性について2つのリストをテストする

  22. 22

    いくつかの類似した属性に基づいて類似したタプルを分離する方法は?

  23. 23

    いくつかの類似した属性に基づいて類似したタプルを分離する方法は?

  24. 24

    行レベルで他の列名を持ついくつかの要素の類似性に基づいて、列のセル値パンダ更新する方法

  25. 25

    2つのキャンバス要素を比較して類似性を確認し、結果を返します

  26. 26

    特徴ベクトルを使用して2つの画像間の類似度スコアを計算するにはどうすればよいですか?

  27. 27

    意味的類似性/関連性に基づいてリストから重複を削除します

  28. 28

    KnnMatchを使用して2つの画像間の類似性を返す

  29. 29

    Python類似性について文字列の2つのリストを比較する

ホットタグ

アーカイブ