2014-02-19 4 views
-2

다양한 학생간에 식량 벡터의 코사인 유사성을 수행하려고합니다. 나는이 포함 된 CSV 파일이 :Python - 중첩 된 사전 구조와의 코사인 유사도

Student food  amount 
John  apple  15 
John  banana  20 
John  orange  1 
John  grape  3 
Ben  apple  2 
Ben  orange  4 
Ben  strawberry 8 
Andrew apple  10 
Andrew watermelon 3 

다음 코드 :

import csv 
from collections import defaultdict 
data = defaultdict(dict) 
with open('data.csv', 'r') as file: 
    reader = csv.DictReader(file) 
    for row in reader: 
     data[row['Student']][row['food']] = row['amount'] 

나에게이 같은 구조를 제공합니다

{'John': {'apple': 15, 'banana': 20, 'orange': 1, 'grape': 3}, 
'Ben': {'apple': 2, 'orange': 4, 'strawberry': 8}, #etc. 
} 

내가 벡터로 이러한 사전을 켜려는를 어디에 벡터의 길이는 고유 한 식품 항목의 수이고 학생이 섭취하지 않은 음식 항목은 0으로 기본 설정되어 다음과 같이됩니다.

for John: [15,20,1,3,0] corresponds to [apple,banana,orange,grape,strawberry,watermelon] 
for Ben: [2,0,4,0,8,0] corresponds to [apple,banana,orange,grape,strawberry,watermelon] #etc 

그러면 각 학생간에 코사인 유사성 매트릭스가 출력됩니다. 시간을내어 읽어 주셔서 감사합니다. 어떤 도움이라도 대단히 감사하겠습니다. 모든 고유 키

>>> all_keys = sorted({k for i in D for k in D[i]}) 
>>> all_keys 
['apple', 'banana', 'grape', 'orange', 'strawberry'] 

의 목록을함으로써

+0

공통 대한 그 키를 통해 루프 수) 가능성이 이미 시도 할 수 이전 단계에 대해 물어 본 지난 질문 이후 많은 부분 (정확한 대답을 수락하지 않은 곳) – deinonychusaur

+0

지금까지 코드는 어디에 있습니까? 그게 뭐가 잘못 되었 니? – jonrsharpe

답변

0
>>> D = {'John': {'apple': 15, 'banana': 20, 'orange': 1, 'grape': 3}, 
... 'Ben': {'apple': 2, 'orange': 4, 'strawberry': 8}, #etc. 
... } 

시작은 이제 각 사람

>>> {k:[D[k].get(i, 0) for i in all_keys] for k in D} 
{'John': [15, 20, 3, 1, 0], 'Ben': [2, 0, 0, 4, 8]}