7

本文档中,有使用nltk.collocations.BigramAssocMeasures()BigramCollocationFindernltk.collocations.TrigramAssocMeasures()和的示例TrigramCollocationFinder

有示例方法 find nbest 基于 pmi 用于二元组和三元组。例子:

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

我知道BigramCollocationFinderTrigramCollocationFinder继承自AbstractCollocationFinder.WhileBigramAssocMeasures()TrigramAssocMeasures()继承自NgramAssocMeasures.

我如何使用 4-gram、5-gram、6-gram、....、n-gram 中的方法(例如)(例如轻松使用二元组和三元组)nbest()AbstractCollocationFinderNgramAssocMeasures

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

谢谢。

4

2 回答 2

10

如果你想找到超过 2 或 3 克的克数,你可以使用scikit 包和 Freqdist 函数来获取这些克数。我试过用 nltk.collocations 来做这个,但我认为我们不能找到超过 3 克的分数。所以我宁愿决定用克数计算。我希望这可以帮助你一点点。谢谢

这是代码

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer
from nltk.collocations import *
from nltk.probability import FreqDist
import nltk

query = "This document gives a very short introduction to machine learning problems"
vect = CountVectorizer(ngram_range=(1,4))
analyzer = vect.build_analyzer()
listNgramQuery = analyzer(query)
listNgramQuery.reverse()
print "listNgramQuery=", listNgramQuery
NgramQueryWeights = nltk.FreqDist(listNgramQuery)
print "\nNgramQueryWeights=", NgramQueryWeights

这将输出为

listNgramQuery= [u'to machine learning problems', u'introduction to machine learning', u'short introduction to machine', u'very short introduction to', u'gives very short introduction', u'document gives very short', u'this document gives very', u'machine learning problems', u'to machine learning', u'introduction to machine', u'short introduction to', u'very short introduction', u'gives very short', u'document gives very', u'this document gives', u'learning problems', u'machine learning', u'to machine', u'introduction to', u'short introduction', u'very short', u'gives very', u'document gives', u'this document', u'problems', u'learning', u'machine', u'to', u'introduction', u'short', u'very', u'gives', u'document', u'this']

NgramQueryWeights= <FreqDist: u'document': 1, u'document gives': 1, u'document gives very': 1, u'document gives very short': 1, u'gives': 1, u'gives very': 1, u'gives very short': 1, u'gives very short introduction': 1, u'introduction': 1, u'introduction to': 1, ...>
于 2013-10-02T09:14:22.700 回答
6

已编辑

当前的 NLTK 有一个硬编码函数,QuadCollocationFinder但是为什么你不能简单地创建一个NgramCollocationFinder静止的立场,你必须从根本上改变from_words()函数中的公式以适应不同的 ngram 顺序。


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

这是因为from_words()不同 ngram 的差异。您会看到只有 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'

所以from_words()在 TrigramCF 中给出了这个:

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 或 3 克窗口基于搭配模式构建模型,那么您还将面临稀疏问题。

于 2013-09-10T12:53:32.517 回答