2014-11-04 5 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) 

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

3 개의 결과를 같은 사전 또는 다른 사전에 저장 하시겠습니까? 또한,리스트 [0.4321, 0.218]의 순서가 중요합니까 ([0.218, 0.4321]'일 수 있습니까)? –

+0

계산이 확실합니까? 주어진 벡터의 코사인 시뮬레이션은 '0.14'이어야합니다. – axiom

+0

@ajcr : 세 가지 결과를 같은 사전에 저장하고 순서는 중요하지 않습니다. –

답변

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

고마워요! :) –

+0

결과를 사전의 사전으로 반환 할 수 있습니까? 나는 내 질문을 편집하여 내 뜻을 보여 주었다. –

+0

@ MarthaPears 예 가능합니다. 내 질문은 각 대답은 두 요소 만 포함해야합니다. 맞습니까? – galaxyan

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