Python脚本中的键错误

时间:2014-11-23 16:37:41

标签: python dictionary text-processing

尝试运行以下代码我得到了一个关键错误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(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]

1 个答案:

答案 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行进行相同的更改,重复上述错误。