我正在尝试编写一个脚本来计算文件集合中给定令牌列表的出现次数。 到目前为止,我有以下内容:
for text in posts:
words = wordpunct_tokenize (text)
tags = nltk.pos_tag (words)
list_tags=defaultdict(int)
for a,b in tags:
tags3.append(b)
for t in tags3:
if t in tags_list:
list_tags[t]+=1
print list_tags
问题是,如果在上一篇文章中找到该程序,程序不会清除令牌,并且每个帖子只计算一次。 在最后一篇文章中,它声称在一个500字的帖子中发现了70,000个给定标记的出现。
有没有人知道我做错了什么?
答案 0 :(得分:4)
您将元组附加到列表中:
list_words.append(("foo", "bar", "tiger"))
由于您将text
拆分为单个字词,因此永远不会成为words
中有w in list_words
True
为list_words2
的三个字的元组。因此,如果您的计数达到70.000并不是真的,那么代码如图所示,只会给您一个空的list_words = ["foo", "bar", "tiger"]
字典。
直接定义列表:
set
或者更好的是,使用set_words = {"foo", "bar", "tiger"}
进行快速成员资格测试:
collections.Counter()
如果您使用from collections import Counter
set_words = {"foo", "bar", "tiger"}
for text in posts:
list_words2 = Counter(word for word in text.split() if word in set_words)
print list_words2
代替,则您的代码将更容易阅读:
tags3
使用真实代码更新您更改的问题:
您正在使用新标记的字词更新列表text
,方法是在不清除列表的情况下附加它们。对于您处理的每个tags3
,tags3
会增长,但您会在循环中的每次迭代中从开始处理tags
。你的70.000是一个阶乘数;首先处理400个令牌,然后处理另外300个标签,共计700个,然后再处理100个单词,所以现在循环tags3
800次等等。
清除tags3 = []
以避免此问题(例如1}} 在循环中),或者更好的是,直接在tags
上循环并执行根本不追加:
for text in posts:
words = wordpunct_tokenize (text)
tags = nltk.pos_tag (words)
list_tags = Counter(b for a, b in tags if b in tags_list)
print list_tags
确保tags_list
确实是一个集合,否则b in tags_list
测试必须遍历每个标记的tags_list
元素。