如何遍历字典键以使用值计算余弦相似度?
我有一个字典,内容大概是这样的:
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}}
2 个回答
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
0
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}}