TypeError:列表索引必须是整数或切片,而不是Windows 10上的str



我正试图找出福尔摩斯故事列表的反向文档频率。看看代码:

反向文档频率是衡量一个单词在多个文档中的常见程度或罕见程度的指标。

因此,这意味着反向文档频率(简称idf(衡量一个词在特定文档中的常见程度,而在其他文档中则不那么常见。

idf的公式为:log x(Total_Documents/Te_Number_Of_Documents_Conting(word((

main.py

import math
import nltk
import os
import sys

def main():
if len(sys.argv) != 2:
sys.exit("Usage: python main.py corpus")
print("Loading data...")
corpus = load_data(sys.argv[1])
words = set()
for filename in corpus:
words.update(corpus[filename])
idfs = list()
for word in words:
f = sum(word in corpus[filename] for filename in corpus)
idf = math.log(len(corpus) / f)
idfs[word] = idf
tfidfs = dict()
for filename in corpus:
tfidfs[filename] = []
for word in corpus[filename]:
tf = corpus[filename][word]
tfidfs[filename].append((word, tf * idfs[word]))
for filename in corpus:
tfidfs[filename].sort(key=lambda tfidf: tfidf[1], reverse=True)
tfidfs[filename] = tfidfs[filename][:5]
print()
for filename in corpus:
print(filename)
for term, score in tfidfs[filename]:
print(f"    {term}: {score:.4f}")

def load_data(directory):
files = dict()
for filename in os.listdir(directory):
with open(os.path.join(directory, filename)) as f:
contents = [
word.lower() for word in
nltk.word_tokenize(f.read())
if word.isalpha()
]
frequencies = dict()
for word in contents:
if word not in frequencies:
frequencies[word] = 1
else:
frequencies[word] += 1
files[filename] = frequencies
return files

if __name__ == "__main__":
main()

但是当我在Powershell中运行python .main.py .shelock_holmes时,

我得到这个令人困惑的错误:

Loading data...
Traceback (most recent call last):
File ".main.py", line 65, in <module>
main()
File ".main.py", line 22, in main
idfs[word] = idf
TypeError: list indices must be integers or slices, not str

有人能帮帮我吗?

您将idfs定义为一个列表:

idfs = list()

如果udfs是一个列表,则在此分配中:

idfs[word] = idf

word必须是一个整数,因为它指定了列表中的索引或位置。

words似乎是str的列表,因此在迭代中:

for word in words:

CCD_ 8是CCD_。由于str不是整数,因此行

idfs[word] = idf

导致您出现错误,原因正是它所解释的。也许idfs应该是一个dict,而不是一个列表,定义如下:

idfs = dict()

然后行:

idfs[word] = idf

word解释为字典中的关键字并且将idf分配为该关键字在dict中的值。字典键可以是任何对象,而且通常是字符串,所以这很有道理。

实际上idfs是一个列表。idfs[word] = idf像字典一样为其添加键值。所以你应该把idfs = list()改成idfs = {}的字典。否则,如果您需要列表,则使用.append()将项目添加到末尾。

最新更新