我的文件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()
答案 0 :(得分:2)
您的代码存在一些问题:
for line in f2:
l=f2.readline()
您同时显式地在文件中隐式迭代和 - 这不是一个好主意。在第一次迭代中,line
将包含文件的第一行,l
将包含第二行。在下一次迭代中,line
和l
将分别包含第三行和第四行(依此类推)。选一个 - 我会选择第一个并放弃readline()
来电。
然后,您在列表理解中重新分配行,即file1.txt
。这意味着你要覆盖line
,并且在每次迭代中你一次又一次地阅读file1.txt
- 这是一个巨大的浪费。读一次,存储它并在循环中引用它。
此外,dict(map(lambda(...)))
相当于单声道 - 我们确实对此有理解。但在这种情况下,更简单的版本可能更好:
这就是你填写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
答案 1 :(得分:0)
您似乎正在使用http://www2.compute.dtu.dk/pubdb/views/edoc_download.php/6010/zip/imm6010.zip
中的单词列表AFINN请注意,''之间有一个制表符。和价值以及一些'单词'不是单个单词,而是诸如“不好”之类的短语。您应该使用另一个拆分字符。复制和修改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以及小写字样。