2

我有一本这样的字典:

dict = {in : [0.01, -0.07, 0.09, -0.02], and : [0.2, 0.3, 0.5, 0.6], to : [0.87, 0.98, 0.54, 0.4]}

我想计算每个单词之间的余弦相似度,我为此编写了一个带有两个向量的函数。首先,它将为 'in' 和 'and' 取值,然后它应该为 'in' 和 'to' 取值等等。

我希望它将结果存储在另一个字典中,其中“in”应该是键,值应该是计算余弦相似度后返回的值。同样,我也想要字典。

这是我计算余弦相似度的函数:

import math
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)

vec1 和 vec2 可以是两个列表,例如:[0.01, -0.07, 0.09, -0.02][0.2, 0.3, 0.5, 0.6],它返回的结果如下:0.14

如何以这种方式为每个键计算它并以这种方式将结果存储在字典中?:

{in : {and : 0.4321, to : 0.218}, and : {in : 0.1245, to : 0.9876}, to : { in : 0.8764, and : 0.123}}
4

2 回答 2

1
import math
inputDict = {"in" : [0.01, -0.07, 0.09, -0.02], "and" : [0.2, 0.3, 0.5, 0.6], "to" : [0.87, 0.98, 0.54, 0.4]}
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)


result = {}
for key,value in inputDict.items():
    temp,tempDict= 0,{}
    for keyC,valueC in inputDict.items():
        if keyC == key:
            continue
        temp = cosine_similarity(value,valueC)
        tempDict[keyC] =temp
    result[key]= tempDict


print(result)

输出:

{'in': {'and': 0.14007005254378826, 'to': -0.11279001655020567}, 'and': {'in': 0.14007005254378826, 'to': 0.7719749900051109}, 'to': {'in': -0.11279001655020567, 'and': 0.7719749900051109}}
于 2014-11-04T18:09:49.133 回答
0

首先你可以从字典中计算一个列表,然后这个列表用于计算&在计算之后你可以将结果分配给那个字典,比如

import math
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)

dictio = {"in" : [0.01, -0.07, 0.09, -0.02], "and" : [0.2, 0.3, 0.5, 0.6], "to" : [0.87, 0.98,     0.54, 0.4]}

L = []
A = []
B = []

for i in dictio:
    L.append(dictio[i])

for i in range(len(L)):
    for j in range(len(L)):
        if ( i != j):
            B.append(cosine_similarity(L[i],L[j]))
    A.append(B)
    B=[]

c=0
for i in dictio:
    dictio[i]= A[c]
    c = c + 1
于 2014-11-04T18:43:29.657 回答