Python NLTK中有BLEU分数的实现,nltk.translate.bleu_score.corpus_bleu
但我不确定它是否与mtevalv13a.pl脚本相同。
它们之间有什么区别?
回答:
简而言之
评估机器翻译系统时,请使用https://github.com/mjpost/sacrebleu。
简短回答
不,NLTK中的BLEU与mteval-13a.perl
并不完全相同。
但它可以非常接近,请参见https://github.com/nltk/nltk/issues/1330#issuecomment-256237324
nltk.translate.corpus_bleu
在四阶ngram上与mteval-13a.pl
对应,但存在一些浮点数差异
比较的详细信息和使用的数据集可以从https://github.com/nltk/nltk_data/blob/gh-pages/packages/models/wmt15_eval.zip下载,或者:
主要区别如下:
详细说明
mteval-13a.pl
和nltk.translate.corpus_bleu
之间有几个区别:
-
第一个区别是,
mteval-13a.pl
带有自己的NIST分词器,而NLTK版本的BLEU是度量标准的实现,假定输入已经预分词。- 顺便说一下,这个正在进行的PR将弥合NLTK和NIST分词器之间的差距
-
另一个主要区别是,
mteval-13a.pl
期望输入为.sgm
格式,而NLTK BLEU接受Python字符串列表的列表,参见此处zipball中的README.txt以获取有关如何将文本文件转换为SGM的更多信息。 -
mteval-13a.pl
期望ngram顺序至少为1-4。如果句子/语料库的最小ngram顺序小于4,它将返回0概率,这是一个math.log(float('-inf'))
。为了模拟这种行为,NLTK设置了一个_emulate_multibleu
标志: -
mteval-13a.pl
能够生成NIST分数,而NLTK没有NIST分数实现(至少目前没有)- NLTK中的NIST分数在此PR中即将推出
除了这些区别外,NLTK BLEU分数还包含了更多功能:
-
处理原始BLEU(Papineni, 2002)所忽视的边缘情况
-
处理最大ngram顺序小于4的边缘情况时,个别ngram精度的均匀权重将被重新加权,使得权重总和为1.0
-
虽然NIST有几何序列平滑方法,但NLTK有相同平滑方法的等效对象,甚至还有更多平滑方法来处理来自Chen和Collin, 2014的句子级BLEU
最后,为了验证NLTK版本的BLEU中添加的功能,添加了一个回归测试来验证这些功能,参见https://github.com/nltk/nltk/blob/develop/nltk/test/unit/translate/test_bleu.py