BLEU(bilingual evaluation understudy),是一种翻译结果的评估方法,主要概念来自于这篇Bleu: a method for automatic evaluation of matchin translatrion论文,本文主要学习和总结该论文及相关材料。
BLEU的思想基于一个前提:机器翻译的结果越接近专业人士的翻译,结果越好。为了评估翻译质量,需要将翻译结果与一个或多个人工翻译结果的接近程度量化。因此,评估系统需要两个维度:
其中接近程度的计算参考了语音识别中的单词错误率(word error rate)的度量方法,不过需要针对两个方面在算法上做修改:1、评估可能基于多条参考语料。2、允许一定范围的单词或者词序不同。算法改进的主要思想是使用不同长度短语与参考语料的匹配情况的加权平均。让我们从最简单的度量方法开始。
给定一个句子,会存在多个很好的翻译。这些翻译或选词不同或词序不同,但是我们还是可以很容易的区分出好的和不好的翻译。如:
candidate 1: It is a guide to action which ensures that the military always obeys the commands of the party.
candidate 2: It is to insure the troops forever hearing the activity gudiebook that party direct.
他们表达的都是同一内容,但是区别很大。作为对比,这里也给出3个人工翻译:
reference 1: It is a gudie to action that ensures that the military will forever head Party commands.
reference 2: It is the guiding principle whichi guarantees the military forces always being under the command of the Party.
reference 3: It is the practical guide for the army always to heed the directions of the Party.
对照一下,很容易看出,好的翻译candidate1与参考语料有很多词或者短语重合,而candidate2则没有。对于candidate1,“It is a guide to action”与reference1重合,“which”与reference2重合,“ensures that the military”与reference1重合,“always”与reference2和3重合,“commands"与reference1重合,”of the party“与reference2重合。相反,candidate2与参考翻译重合的非常少。
对于BLEU方法,程序主要是算出机器翻译的n-grams和参考翻译的n-grams的匹配情况并且取得匹配总数。这些匹配是位置无关的(position-independent)。匹配的越多,那这个翻译结果就越好。让我们先看下unigramd的匹配情况。
(这里的n-grams就是指短语长度,如2-gram(bigram), 就是两个单词长度的短语。起初看的时候,以为用到自然语言处理里的n-grams概念,结果不是。)
一般的准确率方法:计算机器翻译结果中在参考翻译中出现的单词的个数,然后去除机器翻译的单词总数。但是这种方法有缺陷,如:
candidate: the the the the the the the
reference 1: The cat is on the mat.
reference 2: There is a cat ont he mat.
在这种情况下,unigram准确率会很高7/7,但是结果肯定是不好的。改进版的n-gram准确率计算方法主要就是为了解决这种情况。计算步骤(以unigram为例):
计算参考语料每个单词出现的次数, 如存在多条参考语料,取次数最多的数值。
max(ref_cnt1,ref_cnt2…)
将机翻结果每个单词的出现次数修正为参考语料中对应的单词的最大次数。min(count,max_ref_count)
计算修正后的单词总数,去除机翻的单词总数。
使用该方法计算上面的例子,得到unigram准确率2/7.
n-gram的计算与此类似,只是单词换为n长的短语。如上例中的2-gram准确率为0.
该方法能够捕捉翻译结果的两个方面:adequacy和fluency. (/(ㄒoㄒ)/~~adequacy真不知道怎么翻译才好,索性都不翻了吧。。。)。1-gram能计算adequacy,更长的n-gram可以计算fluency。
尽管典型的机翻评估系统是基于整篇文档,但是我们的基本输入单元是单个句子。因此在批量文本的情况下,我们依然基于句子来计算。
p n = ∑ C ϵ { c a n d i d a t e s } ∑ n − g r a m ϵ C C o u n t c l i p ( n - g r a m ) ∑ C ϵ { c a n d i d a t e s } ∑ n − g r a m ′ ϵ C C o u n t ( n - g r a m ′ ) \Large p_n=\frac {\sum_{C\epsilon \{candidates\}} \sum_{n-gram \epsilon C} Count_{clip}(n\text-gram)} {\sum_{C\epsilon \{candidates\}} {\sum_{n-gram^{'} \epsilon C} {Count(n\text-gram^{'})}}} pn=∑Cϵ{candidates}∑n−gram′ϵCCount(n-gram′)∑Cϵ{candidates}∑n−gramϵCCountclip(n-gram)
机器翻译的结果,不应该太长,也不应该太短。在一定程度上,改进版的n-gram准确率计算方法能处理这种情况。如单词(短语)没有出现,或者单词(短语)数量超过参考句子的对应单词(短语)的数量;但是没有处理单词(短语)过少的情况。如:
candidate: of the
reference 1: It is a guide to action that ensures that the military will forever heed Party commands.
reference 2: It is the gudiing principle which guarantees the military forces always being under the command of the Party.
reference 3: It is the practical guide for the army always to heed the directions of the Party.
对于这种情况,unigram准确率为2/2,bigram准确率为1/1,但是该翻译肯定是不合理的。
通常,准确率计算会结合召回来解决类似的长度相关的问题。但是,BLEU需要考虑多个参考翻译的情况,每个参考翻译都可能会选择不同的词来翻译同一个句子。一般情况下,一个好的翻译通常会使用参考中的某个候选词,而不是全部。如果使用了所有候选,肯定不是一个好的翻译。如:
candidate 1: I always invariably perpetually do.
candidate 2: I always do.
reference 1: I always do.
reference 2: I invariably do.
reference 3: I perpetually do.
candidate1使用了比参考翻译更多的词,但是明显它比candidate2更差。因此,原始的召回计算不适用于这种场景。
因此,我们引入一个短句惩罚因子(brevity pentlty factor)。引入该因子后,一个高评分的机器翻译结果,应同时在长度、词选择以及词序上与参考翻译相匹配。注意:不管是短句惩罚还是改进版n-gram都不是直接引用原句的长度做计算,而是使用在参考语句上的长度区间。
如果翻译结果与参考语句长度相等,则惩罚因子设为1.0。如参考语句长度分别为12、15、17,而翻译结果为12,则惩罚因子为1. 我们称最接近的参考语句长度为"最佳匹配长度"(best match length)
还有一点需要考虑:如果逐个语句计算惩罚因子然后计算平均值,那么对于短句的长度偏差,惩罚会很严厉。因此,我们在整个语料上计算惩罚因子,从而在句子这个层面一定的冗余空间。计算步骤:
根据前面讨论,可以得出BLEU的计算公式:
B P = { 1 , c > r e ( 1 − r / c ) , c ≤ r BP=\begin{cases} 1,\quad c > r \\ e^{(1-r/c)}, \quad c\leq r \end{cases} BP={1,c>re(1−r/c),c≤r
B L E U = B P ∗ e x p ( ∑ n = 1 N w n l o g ( p n ) ) BLEU=BP*exp\Bigg(\sum_{n=1}^N w_nlog(p_n)\Bigg) BLEU=BP∗exp(n=1∑Nwnlog(pn))
其中BP为惩罚因子,N为n-gram的最大长度取值,一般为4, w n w_n wn一般取1/N.
从tensorflow中找到两种BLEU的实现,nmt/bleu和tensor2tensor/bleu_hook. 主要实现差不多,这里简要说下不同点。
其中nmt版本的compute_bleu实现中, 入参是一个translation对应多个reference,与论文中描述的算法一致。 但是计算长度的时候不是按照"best match length"来取的。不知道是代码实现错误还是对算法的修改(个人倾向认为是个错误,但是可能在样本数据比较多的情况下,影响会比较小而已。了解的同学请给我留言),按照算法,这样取值会对惩罚因子的计算有影响。
for (references, translation) in zip(reference_corpus,
translation_corpus):
reference_length += min(len(r) for r in references) // 一对多。但是长度不是取最佳匹配长度。
translation_length += len(translation)
还有geo_mean的计算,这个判断对于n-gram的情况,是很容易得到0的结果啊,同样不太理解(懂的同学请留言)。
if min(precisions) > 0:
p_log_sum = sum((1. / max_order) * math.log(p) for p in precisions)
geo_mean = math.exp(p_log_sum)
else:
geo_mean = 0
(如:
candidate: i like apple.
reference: i like organe. 这种情况,对于3-gram, p 3 p_3 p3=0, 按照上述公式bleu最终会是0)
虽然引入了smooth(这块还没看),为True的情况会修正上述错误,但是默认为False。可能该版本的实现更多的是针对文档级别的计算吧,不然我真看不懂。
tensor2tensor的实现比nmt版本的正常,但是也有点疑问。从逻辑上看,compute_bleu的实现是针对translation与reference一对一的关系的,也就是说该版本的实现不支持多reference的bleu计算的。
for (references, translations) in zip(reference_corpus, translation_corpus):
reference_length += len(references) // 这种计算方法,无论从哪个角度看都决定了是一对一关系。
translation_length += len(translations)
而geo_mean的实现就不是nmt版本的那个写法,这个能不能从侧面证明nmt版本的实现是错误的?
if max(precisions) > 0:
p_log_sum = sum(math.log(p) for p in precisions if p)
geo_mean = math.exp(p_log_sum/max_order)
这篇论文来回看了好几遍才理解作者的用意,学习经典的东西还是要花时间的。另外,smooth-bleu还有一个wiki上提到的HyTer评估方法,需要看下。另外,还有n-grams,虽然跟这个无关,也需要了解下。
【附录】