2014-11-23 87 views
1

試圖運行下面的代碼,我收到了關鍵錯誤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]應返回

+0

我運行你的代碼,但在第12行出錯。你真的在第18行得到它嗎? – wanderlust 2014-11-23 17:23:09

+0

沒有抱歉有差異! – DannyBoy 2014-11-23 17:47:35

+0

現在改了:) – DannyBoy 2014-11-23 17:47:57

回答

1
sizeFileVec = {} 
    for word, innerDict in wordFrequency.iteritems(): 
     for fileNum, appearances in innerDict.iteritems(): 
      sizeFileVec[fileNum] += appearances ** 2 

這是錯誤的,因爲該鍵不存在,所以Python會不知道該怎麼遞增到appearance**2

你可以做類似的事情,

sizeFileVec = {} 
    for word, innerDict in wordFrequency.iteritems(): 
     for fileNum, appearances in innerDict.iteritems(): 
      if not sizeFileVec.has_key(filenum): 
       sizeFileVec[filenum] = 0 #your default value 
      sizeFileVec[fileNum] += appearances ** 2 

(或使用setdefault內建的方法效果相同)。您需要在第18行進行相同的更改,重複上述錯誤。

+0

這仍然在for fileNum裏面,出現......? – DannyBoy 2014-11-23 17:51:22

+0

@DannyBoy是的,我希望現在更清楚。 – pad 2014-11-23 17:56:39

+0

是的,現在工作,謝謝。我喜歡Python,但有時候可能有點棘手!你看不到結果= []部分有什麼問題? – DannyBoy 2014-11-23 18:05:03