Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用这些值迭代字典键来计算余弦相似性?_Python_Cosine Similarity - Fatal编程技术网

Python 如何使用这些值迭代字典键来计算余弦相似性?

Python 如何使用这些值迭代字典键来计算余弦相似性?,python,cosine-similarity,Python,Cosine Similarity,我有一本这样的字典: 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”应该是键,值应该是计算余弦相似性后返回的值。同样地,我也需要字典来查找

我有一本这样的字典:

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}}
输出:

{'in': {'and': 0.14007005254378826, 'to': -0.11279001655020567}, 'and': {'in': 0.14007005254378826, 'to': 0.7719749900051109}, 'to': {'in': -0.11279001655020567, 'and': 0.7719749900051109}}

首先,您可以从字典中计算一个列表,然后使用该列表进行计算&计算后,您可以将结果分配到该字典中,如

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.218,0.4321]
)?您确定您的计算结果吗?给定向量的余弦sim应为
0.14
@ajcr:我想将三个结果存储到同一个字典中,顺序无关紧要。@axiom:这只是一个示例,不是实际结果。是否可以将结果作为字典返回?我编辑了我的问题来说明我的意思。@marthapeares是的,这是可能的。我的问题是每个答案应该只包含两个元素,对吗?字典可以有任意数量的元素,我只是举个例子。通常,内部字典应该是一个字典,其值不是特定键。比如,如果key是and,那么在内部字典中,它应该是:{in:0.34,to:0.5},如下所示。
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