使用词频生成“顶部列表”的算法

时间:2009-07-26 05:53:47

标签: algorithm frequency text-processing phrases

我收集了大量人工生成的内容。我想找到最常出现的单词或短语。有效的方法是什么?

6 个答案:

答案 0 :(得分:4)

不要重新发明轮子。使用全文搜索引擎,例如Lucene

答案 1 :(得分:3)

简单/天真的方式是使用哈希表。翻阅单词并随时增加计数。

在流程结束时按键计数键/值对。

答案 2 :(得分:3)

基本思想很简单 - 在可执行的伪代码中,

from collections import defaultdict

def process(words):
  d = defaultdict(int)
  for w in words: d[w] += 1
  return d

当然,魔鬼在细节中 - 你如何将大集合变成一个产生单词的迭代器?是否足够大,你不能在一台机器上处理它,而是需要mapreduce方法,例如通过hadoop?等等NLTK可以帮助解决语言方面的问题(隔离不能完全分离它们的语言中的单词)。

在单机执行(netreduce的网络)上,可能出现的一个问题是,这个简单的想法会给你太多的单身人士(一次或几次出现单词),这会填补记忆。一个概率性的反驳就是做两个过程:一个随机抽样(只得十分之一,或一百分之一)制作一组作为最高等级候选的单词,然后是第二个通过跳过单词不在候选人集合中。根据您抽样的单词数量以及结果中您想要的数量,可以计算出以这种方式错过重要单词的概率的上限(以及合理的数字和任何自然语言) ,我向你保证,你会没事的。)

一旦你的词典将单词映射到出现次数,你只需要按出现次数选择前N个单词 - 如果字典太大而无法按整个事件排序,那么堆排队就会有所帮助(例如,在我最喜欢的可执行伪代码中,heapq.nlargest将执行此操作,例如)。

答案 3 :(得分:1)

查看Apriori algorithm。它可用于查找频繁项目和/或频繁项目集。

就像维基百科的文章所述,有更高效的算法可以做同样的事情,但这可能是一个很好的开始,看看这是否适用于你的情况。

答案 4 :(得分:0)

答案 5 :(得分:-1)

为什么不是一个简单的地图,其中键作为单词而计数器作为值。 它将通过采用高值计数器给出最常用的单词。 这只是一个O(N)操作。