文本文件中的字典

时间:2014-07-07 12:41:35

标签: python python-2.7 text-mining

我的文件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 :(得分:2)

您的代码存在一些问题:

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

您同时显式地在文件中隐式迭代 - 这不是一个好主意。在第一次迭代中,line将包含文件的第一行,l将包含第二行。在下一次迭代中,linel将分别包含第三行和第四行(依此类推)。选一个 - 我会选择第一个并放弃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以及小写字样。