-1

我正在尝试编写一个脚本来计算文件集合中给定标记列表的出现次数。到目前为止,我有以下内容:

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 次给定标记的出现。

有谁知道我做错了什么?

4

1 回答 1

4

您在列表中附加了一个元组

list_words.append(("foo", "bar", "tiger")) 

因为您拆分text为单个单词,所以永远不会有一个包含三个单词的元组wordsfor which w in list_wordsis True。因此,您声称您的计数达到 70.000 的说法是不正确的,如图所示,代码只会给您一个空list_words2字典。

直接定义列表即可:

list_words = ["foo", "bar", "tiger"]

或者更好的是,使用 aset进行快速成员资格测试:

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 从一开始就处理你循环中的每次迭代。你的 70.000 是一个阶乘数;首先你处理 400 个标记,然后你处理另外 300 个标签,总共 700 个,然后你处理 100 个额外的单词,所以现在你循环超过tags800 次,等等。

清楚,tags3为了避免这个问题(例如tags3 = [] 循环内),或者更好的是,直接循环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每个标签的元素。

于 2013-05-15T16:50:46.890 回答