nltk 无法评估KneserNey插值和WittenBell插值语言模型的困惑度和熵,

pgvzfuti  于 6个月前  发布在  其他
关注(0)|答案(3)|浏览(151)

在nltk 3.6.2的google colab环境中,代码

lm = KneserNeyInterpolated(n)
lm.fit(train_ngrams, vocab)

test_sentences = list(flatten(pad_both_ends(sent, n=n) for sent in test_corpus))
entropy = lm.entropy(test_sentences)

报错:
/usr/local/lib/python3.7/dist-packages/nltk/lm/smoothing.py in alpha_gamma(self, word, context)
49 def alpha_gamma(self, word, context):
50 prefix_counts = self.counts[context]
---> 51 prefix_total_ngrams = prefix_counts.N()
52 alpha = max(prefix_counts[word] - self.discount, 0.0) / prefix_total_ngrams
53 gamma = (
AttributeError: 'int' object has no attribute 'N'
MLE和Laplace可以正常工作。谢谢。

a11xaf1n

a11xaf1n1#

有任何解决方案吗?

lbsnaicq

lbsnaicq2#

我认为这个问题在有人坐下来调查之前就已经关闭了。我会重新打开,但很可能要等到11月才能调查。

jecbmhm3

jecbmhm33#

请注意,抛出的异常来自 #2709 之前。也就是说,这个问题可能会持续存在。
以下方法将使用 KneserNey 进行调用:
nltk/nltk/lm/smoothing.py
第100行到第109行
| | defalpha_gamma(self, word, context): |
| | prefix_counts=self.counts[context] |
| | word_continuation_count, total_count= ( |
| | (prefix_counts[word], prefix_counts.N()) |
| | iflen(context) +1==self._order |
| | elseself.continuation_counts(word, context) |
| | ) |
| | alpha=max(word_continuation_count-self.discount, 0.0) /total_count |
| | gamma=self.discount*count_values_gt_zero(prefix_counts) /total_count |
| | returnalpha, gamma |
self.counts 是一个 NgramCounter,可以像 self.counts[context] 一样访问。这会调用
nltk/nltk/lm/counter.py
第144行到第151行
| | def__getitem
(self, item): |
| | """用户友好的 ngram 计数访问方式.""" |
| | ifisinstance(item, int): |
| | returnself._counts[item] |
| | elifisinstance(item, str): |
| | returnself._counts.getitem(1)[item] |
| | elifisinstance(item, Sequence): |
| | returnself._counts.getitem(len(item) +1)[tuple(item)] |
这个函数根据 context 的类型返回非常不同的结果。如果给定一个整数或一个序列,它将返回一个 FreqDist,在上面可以调用 .N()。然而,如果 context 是字符串,那么它只会返回一个整数。我认为这就是错误的原因。毕竟,你不能在一个整数上调用 .N()
话虽如此,我不知道什么时候 alpha_gamma 会被用 context 作为字符串而不是字符串序列来调用 - 我还没有找到这样的情况。我无法重现确切的问题,否则我可以更容易地追踪这个问题。
话虽如此,也许这条评论会对你有帮助,Ilia。

相关问题