尝试运行以下代码我得到了一个关键错误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个文件和搜索之间完成的,并存储在列表中。
然后按照最相关的顺序返回列表。
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(19 ^ 2 + 4 ^ 2 + 0 ^ 2)* sqrt(1 ^ 2 + 3 ^ 2 + 5 ^ 2)= 0.26987
sim(4,S)=(0 * 1)+(5 * 3)+(0 * 5)/ sqrt(0 ^ 2 + 5 ^ 2 + 0 ^ 2)* sqrt(1 ^ 2 + 3 ^ 2 + 5 ^ 2)= 0.507
因此应返回[4,1,3,2]
答案 0 :(得分: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行进行相同的更改,重复上述错误。