从文本文件创建字典

0 投票
2 回答
538 浏览
提问于 2025-04-18 12:20

我有一个文件 f1,里面有一些单词和对应的情感值(范围从 +6 到 -6)。

normal  0
sad -2
happy   4

还有另一个文件 f2,里面是一些文本(推文),每行大约有 4 或 5 个单词。

我想逐行读取 f2 中的文本,对于每一行的每一个单词,我需要去 f1 中查找这个单词是否存在。如果存在,就取出它的情感值并加起来。这样,我就能计算出每句话中所有单词的情感值总和,并打印出来。

所以打印的结果应该像这样(比如说前面三行的结果):

3
0
-2

我有一段代码,但我遇到了一个错误:“值错误:混合迭代和读取方法会丢失数据”。请帮我修正这段代码,或者至少给我一个新的方法来实现这个功能。

f2=open("file2.txt","r")
for line in f2:
    l=f2.readline()
    afinn = dict(map(lambda (k,v): (k,int(v)),[ line.split('\t') for line in open("file1.txt") ]))
    value= sum(map(lambda word: afinn.get(word, 0), l.lower().split()))
    print value
f1.close()
f2.close()

2 个回答

0

看起来你在使用我的词汇表 AFINN,下载地址是 http://www2.compute.dtu.dk/pubdb/views/edoc_download.php/6010/zip/imm6010.zip

请注意,在“单词”和它的值之间有一个制表符(tab),而且有些“单词”并不是单个词,而是像“not good”这样的短语。你应该使用其他的分隔符。可以参考并修改 Tim Pitzcker 的代码:

with open("AFINN-111.txt") as f1: words = {} for line in f1: word, score = line.split('\t') words[word] = float(score)

你的代码和 Tim Pitzcker 的代码可能在处理第二个文件时也会有问题,比如下面的代码实际上是不能正常工作的,因为默认情况下,split 是按空格分割的,忽略了逗号:

line = 'It what bad, plain and simply bad.' contents = line.split() value = sum(words.get(word, 0) for word in contents)

你可能需要看看 re.split() 或者 nltk.word_tokenize,同时把单词转换成小写。

2

你的代码有几个问题:

for line in f2:
    l=f2.readline()

你在同时隐式和显式地遍历文件,这样做不好。在第一次循环中,line会包含文件的第一行,而l会包含第二行。在下一次循环中,linel会分别包含第三行和第四行(依此类推)。你需要选择一种方式 - 我建议你选择第一种方式,去掉readline()的调用。

然后,在你用列表推导式读取file1.txt的时候,你又重新赋值给了line。这意味着你在覆盖line,而且在每次循环中都在重复读取file1.txt - 这样做非常浪费。只需读取一次,存储起来,在循环中引用它。

此外,dict(map(lambda(...)))的写法有点不符合Python的风格 - 我们有字典推导式可以用。不过在这种情况下,简单的写法可能更好:

这就是你可以填充words字典的方式(你也可以用一行代码实现,但可读性很重要,所以我们保持简单):

with open("file1.txt") as f1:
    words = {}
    for line in f1:
        word, score = line.split()
        words[word] = int(score)

现在你可以去读取你的输入文件了:

with open("file2.txt") as f2:
    for line in f2:
        contents = line.split()
        value = sum(words.get(word, 0) for word in contents)
        print value

撰写回答