2014-11-04 77 views
1

我有一个字典是这样的:如何迭代字典键以使用值计算余弦相似度?

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) 

VEC 1及VEC 2可以是两个列表,如:[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}} 
+0

是否要将三个结果存储在同一个字典或不同的字典中?另外,列表的顺序是不是[[0.4321,0.218]](可以是[0.218,0.4321]')? – 2014-11-04 17:57:10

+0

你确定你的计算? 给定矢量的余弦模拟应该是'0.14'。 – axiom 2014-11-04 17:58:23

+0

@ajcr:我想将三个结果存储到同一个字典中,顺序无关紧要。 – 2014-11-04 18:02:00

回答

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}} 
+0

非常感谢! :) – 2014-11-04 18:21:17

+0

是否可以将结果作为词典的词典返回?我编辑了我的问题以表明我的意思。 – 2014-11-04 18:27:52

+0

@MarthaPears是的,这是可能的。我的问题是每个答案应该只包含两个元素,对吗? – galaxyan 2014-11-04 21:16:09

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