已编辑
当前的 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
。
所以你要问找到搭配的最终目的是什么?