来自nltk"如何"指南,我知道我可以使用Python在文件中使用类似的东西找到顶部x个bigrams / trigrams:
>>> import nltk
>>> from nltk.collocations import *
.....
>>> text = inputFile.read()
>>> tokens = nltk.wordpunct_tokenize(text)
>>> bigram_measures = nltk.collocations.BigramAssocMeasures()
>>> finder = BigramCollocationFinder.from_documents(filename)
>>> finder.nbest(bigram_measures.pmi, 10)
这个问题是我必须将文件加载到内存中,这只能在我将需要的文本拆分成多个较小的块时才起作用。我绝对没有足够的内存来将所有文件组合成一个文件或一个字符串进行搜索(总大小约为25GB)。因此,如果我想搜索前30位的双字母组合,我必须按文件进行操作,但是我会在输出中遇到重复的双字母问题。我还会错过其他一些总共出现在最重要的双胞胎中的双胞胎,但是不能在我的其他文件中进行剪辑。
有没有办法使用nltk库来实现这一目标,还是仅仅是我必须解决的限制?或者是否有其他库或方法来实现同样的目标?
答案 0 :(得分:2)
将数据拆分为N个文件,这样N足够大,可以将每个文件读入RAM并完整处理。 N = 25或50可能是一个不错的选择。对于这些文件中的每一个,找到X最常见的双字母并将它们组合在一个列表L0中。然后选择列表中的最小频率f0。
在第二遍时,再次浏览所有文件并收集任何文件中频率至少为f0 / N的双字母组合(这使他们有希望将其放入顶部X)。
最后,计算每个收集的二元组的总频率,将它们插入L0,然后选择前X个双字母组。
如果每个文件中的双字母频率都遵循Zipf定律,那么你应该能够使用你拥有的任何有限RAM来提取顶级X双字母。