使用Python计算文本中的单词频率,但忽略停用词。

4
这段代码可以统计文本中单词的频率:
 fullWords = re.findall(r'\w+', allText)

 d = defaultdict(int)

 for word in fullWords :
          d[word] += 1

 finalFreq = sorted(d.iteritems(), key = operator.itemgetter(1), reverse=True)

 self.response.out.write(finalFreq)

这也会给我一些无用的词,比如“the”、“an”、“a”。
我的问题是,Python 中是否有可用的停用词库可以删除所有这些常见词?我想在 Google 应用引擎上运行它。

1
你想参加 https://dev59.com/knA75IYBdhLWcg3wrbC_ 的竞赛吗? - John K
4个回答

5
你可以从各种格式的文件中下载停用词列表,例如从这里 -- Python只需要读取该文件(这些文件是csv格式,可以使用csv模块轻松读取),创建一个集合,并使用该集合中的成员资格(可能需要一些标准化,例如转换为小写)来排除计数中的单词。

3

通过稍微修改您拥有的代码可以轻松处理这个问题(根据John的评论进行编辑):

stopWords = set(['a', 'an', 'the', ...])
fullWords = re.findall(r'\w+', allText)
d = defaultdict(int)
for word in fullWords:
    if word not in stopWords:
        d[word] += 1
finalFreq = sorted(d.iteritems(), key=lambda t: t[1], reverse=True)
self.response.out.write(finalFreq)

这种方法分两步构建排序列表:首先过滤掉你所需的“停用词”列表中的任何单词(已转换为set以提高效率),然后对剩余条目进行排序。


2
嗯:为什么要插入停用词然后再将它们删除?只需要两行代码就可以解决问题:if word not in stopwords: d[word] += 1,接着使用 finalFreq = d.items() 即可。 - John Machin
@John:我错过了。虽然停用词的数量在定义上是有限的,所以这并不是什么大问题。 - David Z
关于您最新的编辑:您不需要使用 []sorted() 可以接受任何可迭代对象),而 (k,v) for k,v in d.iteritems() 等同于 d.iteritems() - John Machin

2
我知道NLTK有一个包含语料库和许多语言的停用词列表,包括英语,详见这里获取更多信息。NLTK还有一个词频计数器,它是自然语言处理中一个不错的模块,你应该考虑使用它。

0
stopwords = set(['an', 'a', 'the']) # etc...
finalFreq = sorted((k,v) for k,v in d.iteritems() if k not in stopwords,
                      key = operator.itemgetter(1), reverse=True)

这将过滤掉任何在stopwords集合中的键。


看看我在DavidZ的回答中的评论,你的也有同样的问题。 - John Machin
从性能上来说,这并不是一个问题 - 对于每个结果键,您正在交换一次集合查找,以便进行正则表达式匹配的每个单词都进行一次集合查找。哪种更有效取决于问题集的参数。无论如何,您已经在迭代要输出的结果键集,因此用于过滤的生成器表达式不涉及太多额外的开销 - 没有创建额外的列表,并且字典没有被修改(因此您实际上并没有“将它们拆除”;只是过滤它们,使其永远不会进入排序列表)。 - Amber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接