試圖運行下面的代碼,我收到了關鍵錯誤LN 12:關鍵錯誤
import math
from collections import Counter
def retrieve():
wordFrequency = {'bit':{1:3,2:4,3:19,4:0},'red':{1:0,2:0,3:15,4:0},'dog':{1:3,2:0,3:4,4:5}}
search = {'bit':1,'dog':3,'shoe':5}
sizeFileVec = {}
for word, innerDict in wordFrequency.iteritems():
for fileNum, appearances in innerDict.iteritems():
sizeFileVec[fileNum] += appearances ** 2
for fileNum in sizeFileVec:
sizeFileVec[fileNum] = math.sqrt(sizeFileVec[fileNum])
results = []
for word, occurrences in search.iteritems():
file_relevancy = Counter()
for fileNum, appear_in_file in wordFrequency.get(word, {}).iteritems():
file_relevancy[fileNum] += (occurrences * appear_in_file)/sizeFileVec[fileNum]
results = [fileNum for (fileNum, count) in file_relevancy.most_common()]
return results
print retrieve()
的代碼應該採取wordFrequency的內部字典,然後總結我有一個錯誤的每個文件數值的平方平方根(有4個文件),即對於文件1,它是sqrt(3^2 + 0^2 + 3^2)。
- 編輯
結果[]
應該返回基於查詢最相關的順序的4個文件的列表。因此,在這個例子中:
bit dog shoe
File 1 3 3 0
File 2 4 0 0
File 3 19 4 0
File 4 0 5 0
Search 1 3 5
SIM(1,S)=(3 * 1)+(3×3)+(0 * 5)/ SQRT(3^2 + 3^2 + 0^2 )* sqrt(1^2 + 3^2 + 5^2)= 0.478
採用每項的標量積,然後除以文件大小和搜索量的乘積。
這是在其他3個文件和搜索之間完成的,並存儲在一個列表中。
然後按照與最不相關的順序返回列表。
- 編輯2
SIM(2,S)=(4 * 1)+(0 * 3)+(0 * 5)/ SQRT(4^2 + 0^2 + 0^2)* sqrt(1^2 + 3^2 + 5^2)= 0.169
sim(3,S)=(19 * 1)+(4 * 3)+(0 * 5)/ sqrt (4,S)=(0 * 1)+(5 * 2)* sqrt(1^2 + 3^2 + 5^2)= 0.26987
3)+(0 * 5)/ sqrt(0^2 + 5^2 + 0^2)* sqrt(1^2 + 3^2 + 5^2)= 0.507
因此[4,1,3,2]應返回
我運行你的代碼,但在第12行出錯。你真的在第18行得到它嗎? – wanderlust 2014-11-23 17:23:09
沒有抱歉有差異! – DannyBoy 2014-11-23 17:47:35
現在改了:) – DannyBoy 2014-11-23 17:47:57