【问题标题】:Finding top bigrams across multiple large files跨多个大文件查找顶级二元组
【发布时间】:2017-04-26 22:08:11
【问题描述】:

从 nltk “How To”指南中,我知道我可以使用 Python 来查找文件中的前 x 个二元组/三元组,方法如下:

>>> 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)。因此,如果我想搜索前 X 个二元组,我必须通过文件来完成,但是我会遇到在我的输出中重复二元组的问题。我也将错过其他共同出现在前 X 个二元组中但不在我的其他文件中的二元组。

有什么方法可以使用 nltk 库来完成此操作,或者这只是我必须解决的限制?或者是否有其他库或方法可以实现同样的目标?

【问题讨论】:

  • KenLM 来救援!! kheafield.com/code/kenlm/estimation
  • 我之前研究过,但是在让所有依赖项在我的机器上工作时遇到了一些问题。我可能会在某个时候再次研究它

标签: python nltk


【解决方案1】:

将您的数据拆分为 N 个文件,这样 N 就足够大,可以将每个文件读入 RAM 并对其进行整体处理。 N=25 或 50 可能是一个不错的选择。对于这些文件中的每一个,找到 X 个最常见的二元组并将它们组合在一个列表 L0 中。然后选择列表中最小的频率 f0。

在第二遍时,再次遍历所有文件,并收集任何文件中频率至少为 f0/N 的二元组(这让他们有希望进入前 X)。

最后,计算每个收集到的二元组的总频率,插入到L0中,选出前X个二元组。

如果每个文件中的二元组频率遵循 Zipf 定律,那么您应该能够使用有限的 RAM 提取前 X 个二元组。

【讨论】:

  • 谢谢,这对我有用。我从不知道 Zipf 定律,所以我没有意识到我可以只从每个结果列表中取出前 X。
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多