2014-11-04 45 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