我收集了大量人工生成的内容。我想找到最常出现的单词或短语。有效的方法是什么?
答案 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)操作。