TypeError: list indices must be integers or slices, not str on a Windows 10

TypeError: list indices must be integers or slices, not str on a Windows 10

我正在尝试找出夏洛克·福尔摩斯故事列表的逆文档频率。看看代码:

反向文档频率是衡量一个词在多个文档中出现的频率。

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

idf 的公式为: log x (Total_Documents/The_Number_Of_Documents_Containing(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:

word 是一个 str。由于 str 不是整数,因此行

idfs[word] = idf

正是由于它解释的原因导致你得到的错误。也许 idfs 应该是一个 dict 而不是一个列表,定义如下:

idfs = dict()

然后是行:

idfs[word] = idf

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

实际上idfs是一个列表。 idfs[word] = idf 像字典一样向其中添加 key-values。所以你应该把它变成 idfs = {} 而不是 idfs = list() 字典。否则,如果您需要列表,请使用 .append() 将项目添加到末尾。