尝试运行以下代码时,我在第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()
我遇到错误的代码应该取单词频率的内部字典,然后求每个文件编号的值的平方和,然后求这个值的平方根(有4个文件),也就是说,对于文件1,它是sqrt(3^2+0^2+3^2)。在
结果[]
应该返回4个文件的列表,根据查询结果按最相关的顺序排列。所以在这个例子中:
^{pr2}$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]
这是错误的,因为这个键还不存在,所以python不知道应该增加到
appearance**2
你可以做些类似的事情
^{pr2}$(或使用
setdefault
内置方法获得相同效果)。您需要在第18行中进行相同的更改,在第18行中重复上述错误。在相关问题 更多 >
编程相关推荐