Python脚本中的密钥错误

2024-06-16 10:48:39 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试运行以下代码时,我在第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个文件和搜索之间完成的,并存储在一个列表中。在

然后按最相关的顺序返回列表。在

  • 编辑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(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]


Tags: 文件代码in列表forsimsqrtresults
1条回答
网友
1楼 · 发布于 2024-06-16 10:48:39
   sizeFileVec = {}
   for word, innerDict in wordFrequency.iteritems():
       for fileNum, appearances in innerDict.iteritems():
           sizeFileVec[fileNum] += appearances ** 2

这是错误的,因为这个键还不存在,所以python不知道应该增加到appearance**2

你可以做些类似的事情

^{pr2}$

(或使用setdefault内置方法获得相同效果)。您需要在第18行中进行相同的更改,在第18行中重复上述错误。在

相关问题 更多 >