<p>当 ngram 大于给定句子的最大 ngrams 时,nltk.translate.bleu_score 给出错误结果</p>

创建于 2016-12-09  ·  5评论  ·  资料来源: nltk/nltk

给定权重 = [0.25, 0.25, 0.25, 0.25](默认值),
sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'c']) = 0
而sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'd']) = 0.7598
显然前面的分数应该大于后面的,或者两个分数都应该是0

最有用的评论

如果参考/假设的长度小于n ,则原始论文没有考虑p_n可以为 0 的事实,请参阅http://www.aclweb 的第 2.3 节中的等式n的可能性。

如果我们查看 2.3 节中的公式,它需要exp(log(p_n))并且当p_n为 0 时,它会进入数学域错误,因为对数函数(即y = log x )在 x = 0 处有一个渐近线,因此 x 的范围必须大于 0。

因此,如果我们要实现原始的 BLEU,只要出现数学域错误,用户就会收到一条警告,内容类似于“无法计算 BLEU”。 所以更高版本的 BLEU 试图用几个不同的黑客来修复它,版本的历史可以在https://github.com/moses-smt/mosesdecoder/blob/master/scripts/generic/mteval-v13a上找到

请注意,最新版本的 BLEU 带有 Chen 和 Cherry (2014) 论文中的平滑函数,但mteval.pl的摩西版本中没有。

我希望解释有帮助。

所有5条评论

您使用的是哪个版本的代码?

$ python
>>> import nltk
>>> nltk.__version__
'3.2.1'

BLEU 实现最近刚刚修复,#1330 已解决。 如果您使用的是develop的分支nltk ,这应该是输出:

>>> import nltk
>>> from nltk import bleu
>>> ref = hyp = 'abc'
>>> bleu([ref], hyp)
1.0
>>> from nltk import bleu
>>> ref, hyp = 'abc', 'abd'
>>> bleu([ref], hyp)
0.7598356856515925

由于字符串是一个字符列表,并且nltksentence_bleu()导入到顶级导入中,因此上面的代码与以下代码相同:

>>> from nltk.translate.bleu_score import sentence_bleu
>>> sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'c'])
1.0
>>> sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'd'])
0.7598356856515925

要安装最新的develop分支,请尝试:

pip install https://github.com/nltk/nltk/archive/develop.zip

注意develop分支有_更多意外bug_,建议用户安装master或者官方版本


在一个相关的注释中,但不直接涉及bleu的当前nltk实现,没有 #1330 修复的先前实现会受到流行的multi-bleu.perl的相同缺陷的影响。 也许您可能会发现为什么它在没有最近修复的情况下返回 0 会很有趣: https :

谢谢@alvations 。 我使用的 nltk 的原始版本是 3.2。 我现在已经将它更新到 3.2.1,它现在正在引发 ZeroDivisionError。 我使用了 Python 3.5.2

BLEU 的唯一稳定版本位于develop分支中。 请等待它在 NLTK 3.2.2 中发布或安装develop分支(但请注意,开发分支可能存在未经测试的错误)。

行。 我将等待。 但是在你上面提到的情况下,如果权重为[0.25, 0.25, 0.25, 0.25],结果sentence_bleu([['a', 'b', 'c']], ['a', 'b ', 'c']) 和 sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'd']) 都应该是 0,根据原始论文

如果参考/假设的长度小于n ,则原始论文没有考虑p_n可以为 0 的事实,请参阅http://www.aclweb 的第 2.3 节中的等式n的可能性。

如果我们查看 2.3 节中的公式,它需要exp(log(p_n))并且当p_n为 0 时,它会进入数学域错误,因为对数函数(即y = log x )在 x = 0 处有一个渐近线,因此 x 的范围必须大于 0。

因此,如果我们要实现原始的 BLEU,只要出现数学域错误,用户就会收到一条警告,内容类似于“无法计算 BLEU”。 所以更高版本的 BLEU 试图用几个不同的黑客来修复它,版本的历史可以在https://github.com/moses-smt/mosesdecoder/blob/master/scripts/generic/mteval-v13a上找到

请注意,最新版本的 BLEU 带有 Chen 和 Cherry (2014) 论文中的平滑函数,但mteval.pl的摩西版本中没有。

我希望解释有帮助。

此页面是否有帮助?
0 / 5 - 0 等级