在this documentation中,有一个使用nltk.collocations.BigramAssocMeasures()
,BigramCollocationFinder
,nltk.collocations.TrigramAssocMeasures()
和TrigramCollocationFinder
的示例。
有一个基于pmi的bigram和trigram查找方法nbest的示例方法。
例子:
finder = BigramCollocationFinder.from_words(
... nltk.corpus.genesis.words('english-web.txt'))
>>> finder.nbest(bigram_measures.pmi, 10)
我知道
BigramCollocationFinder
和TrigramCollocationFinder
从AbstractCollocationFinder.
继承而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 克窗口,那么你最终会得到很多
单词检索中的噪音。
或 3grams 窗口,那么您还将面临稀疏问题。
关于python - 如何在python nltk中获取n-gram搭配和关联?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18672082/