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()
将项目添加到末尾。
我正在尝试找出夏洛克·福尔摩斯故事列表的逆文档频率。看看代码:
反向文档频率是衡量一个词在多个文档中出现的频率。
因此,这意味着反向文档频率或简称 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()
将项目添加到末尾。