this documentation中,有一个使用nltk.collocations.BigramAssocMeasures()BigramCollocationFindernltk.collocations.TrigramAssocMeasures()TrigramCollocationFinder的示例。

有一个基于pmi的bigram和trigram查找方法nbest的示例方法。
例子:

finder = BigramCollocationFinder.from_words(
...     nltk.corpus.genesis.words('english-web.txt'))
>>> finder.nbest(bigram_measures.pmi, 10)

我知道BigramCollocationFinderTrigramCollocationFinderAbstractCollocationFinder.继承而BigramAssocMeasures()TrigramAssocMeasures()NgramAssocMeasures.继承

如何在nbest()AbstractCollocationFinder中为4克,5克,6克,....,n克使用方法(例如NgramAssocMeasures)(就像轻松地使用bigram和trigram一样)?

我应该创建继承AbstractCollocationFinder的类吗?

谢谢。

最佳答案

已编辑

当前的 NLTK 有一个硬编码器函数,最多可用于 QuadCollocationFinder ,但您不能简单地创建 NgramCollocationFinder 的原因仍然存在,您必须从根本上更改 from_words() 函数中的公式以用于不同的 ngram 顺序。

简短的回答,不,如果你想找到超过 2- 和 3-gram 的搭配,你不能简单地创建一个 AbstractCollocationFinder (ACF) 来调用 nbest() 函数。

这是因为不同 ngram 的 from_words() 不同。您会看到只有 ACF 的子类(即 BigramCF 和 TrigramCF)具有 from_words() 函数。

>>> finder = BigramCollocationFinder.from_words(nltk.corpus.genesis.words('english-web.txt'))
>>> finder = AbstractCollocationFinder.from_words(nltk.corpus.genesis.words('english-web.txt',5))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'AbstractCollocationFinder' has no attribute 'from_words'

因此,鉴于 TrigramCF 中的这个 from_words():
from nltk.probability import FreqDist
@classmethod
def from_words(cls, words):
    wfd, wildfd, bfd, tfd = (FreqDist(),)*4

    for w1,w2,w3 in ingrams(words,3,pad_right=True):
      wfd.inc(w1)

      if w2 is None:
        continue
      bfd.inc((w1,w2))

      if w3 is None:
        continue
      wildfd.inc((w1,w3))
      tfd.inc((w1,w2,w3))

    return cls(wfd, bfd, wildfd, tfd)

您可以以某种方式破解它并尝试为 4-gram 关联查找器进行硬编码:
@classmethod
def from_words(cls, words):
    wfd, wildfd = (FreqDist(),)*2
    bfd, tfd ,fofd = (FreqDist(),)*3

    for w1,w2,w3,w4,w5 in ingrams(words,5,pad_right=True):
      wfd.inc(w1)

      if w2 is None:
        continue
      bfd.inc((w1,w2))

      if w3 is None:
        continue
      wildfd.inc((w1,w3))
      tfd.inc((w1,w2,w3))

      if w4 is None:
        continue
      wildfd.inc((w1,w4))
      wildfd.inc((w2,w4))
      wildfd.inc((w3,w4))
      wildfd.inc((w1,w3))
      wildfd.inc((w2,w3))
      wildfd.inc((w1,w2))
      ffd.inc((w1,w2,w3,w4))

    return cls(wfd, bfd, wildfd, tfd, ffd)

然后,您还必须更改分别使用从 cls 返回的 from_words 的代码部分。

所以你要问,找到搭配的最终目的是什么?
  • 如果您正在寻找在较大的搭配中检索单词
    比 2 或 3 克窗口,那么你最终会得到很多
    单词检索中的噪音。
  • 如果您要使用 2 构建基于搭配模式的模型
    或 3grams 窗口,那么您还将面临稀疏问题。
  • 关于python - 如何在python nltk中获取n-gram搭配和关联?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18672082/

    10-12 22:49