NLP评价指标:BLEU和ROUGE

简介

综合转载于:

BLEU

给定一句话,假设两个翻译工具的结果为:

这个句子的参考翻译为:(由于一个话的翻译可以有种风格,参考翻译一般为多个,当然也可以只有一个)

一个很直观的想法,谁和参考翻译更接近,谁就翻译的更好。那么怎么评估接近呢?可以考虑机器翻译的每一个词是否出现在参考译文组中。比如翻译后的句子有5个单词,如果3个单词出现在了参考译文组中,那么单词级别的Precision = 3/5。可以更进一步的考虑N-gram级别的Precision,比如Bigram,即把两个单词(it is)当成一个元素是否出现在参考翻译组中。

下面一个例子,是假设翻译工具翻译出的全部是the,单词级别的Precision为7/7,这个值与实际情况不符,我们修正刚才的计算公式,对分子截断为一个参考译文中,出现的最大次数,比如the在Reference 1中出现的次数最多,为2次,修正后单词级别的Precision为2/7。

下图展示了对人的翻译和机器的翻译分别用截断n-gram Precision (1, 2, 3, 4)进行评价,可以发现这种指标可以轻易地区分人的翻译和机器的翻译(也就是轻易地区分好的翻译和一般的翻译)。

上面的指标偏爱过短的翻译。比如翻译工具是of the, 这个翻译的unigram是2/2和bigram是1/1。但是却召回了过少的词。

精度往往与召回结对,来对结果进行评价。但在机器翻译中,召回全部的词并不是一个好的翻译。比如翻译I always invariably perpetually do. 比I always do.召回了参考译文组中更多的词,但翻译结果却不如后者好。

我们加一个过短惩罚系数BP(brevity penalty)。假定参考译文的长度为r, 候选翻译长度为c,当c >= r时,我们不进行惩罚,设置BP为1,当c <r时,我们进行惩罚。

最终我们得到了BLEU的计算公式:

N取值为4,表示计算1-gram, 2-gram, 3-gram, 4-gram的截断精度,取log然后加权求和,其中$w_1$, $w_2$, $w_3$, $w_4$均取值为1/4。之所以取log,是因为$p_1$,$p_2$,$p_3$,$p_4$指数下降,取log后也BLEU分数与人工评估也更加吻合。

我们对500个句子计算BLEU分数,结果如下,人工H1,H2比系统(机器)S1, S2, S3要高(人工翻译比机器翻译好)。

我们将500个句子分成20个组,每组25个句子,对每组求BLEU,然后求Mean和StdDev,结果也变化不大。说明只要收集少量的句子,就可以区分不同的系统。

下图是BLEU评估和人工评估,可以看到BLEU和人工评估相关性很高。

ROUGE

ROUGE指标是在机器翻译、自动摘要、问答生成等领域常见的评估指标。ROUGE通过将模型生成的摘要或者回答与参考答案(一般是人工生成的)进行比较计算,得到对应的得分。ROUGE指标与BLEU指标非常类似,均可用来衡量生成结果和标准结果的匹配程度,不同的是ROUGE基于召回率,BLEU更看重准确率。在论文中主要提到了4种方法,分别是$\text{Rouge}-N、\text{Rouge}-L、\text{Rouge}-W、\text{Rouge}-S$。

ROUGE-N

Rouge-N实际上是将模型生成的结果和标准结果按N-gram拆分后,计算召回率。比如有2个句子(一般模型生成的成为hypothesis,简写hyp;标准结果称为reference,简写为ref):

模型生成(hyp):the cat was found under the bed

标准结果(ref):the cat was under the bed

按1-gram和2-gram拆分后,可表示为一下表格:

# hyp 1-gram ref 1-gram hyp 2-gram ref 2-gram
1 the the the cat the cat
2 cat cat cat was cat was
3 was was was found was under
4 found under found under under the
5 under the under the the bed
6 the bed the bed
7 bed
count 7 6 6 5

在原论文中,ROUGE-N的公式为:

论文中第一个求和项条件中,Refermce应该是写错了,这里改成了Reference

分子表示所有样本的标准结果按N-gram拆分后与生产结果按N-gram拆分后匹配上个数的和;分母表示所有样本的标准结果,按N-gram拆分后的和。这样很容易计算,$\text {Rouge}-1=\frac{6}{6}=1.0$,同样$\text {Rouge}-2=\frac{4}{5}=0.8$。以此类推,一般来说N越大,分值容易越小。前面提到的都是单个reference的情况,对于多个reference的情况,论文中也有提到,两两计算取最大值。

ROUGE-L

Rouge-L的L表示: Longest Common Subsequence,Rouge-L的计算利用了最长公共子序列(区别一下最长公共子串,这个是连续的,子序列不一定连续,但是二者都是有词的顺序的)。论文中Rouge-L的公式可以表示为:

上面的公式中,$X$表示标准答案,也就是上面两个句子中的ref,$Y$表示生产答案,也就是上面两个句子中的hyp。$m$表示$X$的长度,$n$表示$Y$的长度。$L C S(X, Y)$表示X和Y的最长公共子序列,$\beta$是一个超参数,需要自己设置,论文中提到这个值一般的比较大。沿用上面的例子则可以得到:

公式中的 $F_{l c s}$ 就是ROUGE-L的得分,因为 $\beta$ 设置的比较大,所以最终 $F_{l c s}$ 还是受召回率 $\left(R_{l c s}\right)$的影响更大,也符合ROUGE一开始的初衷。

ROUGE-W

先举一个例子,下面三句话中, $X$ 是reference, $Y_1, Y_2$ 是hypothesis:

我看可以看到三个例子,用Rouge-L去计算的时候,他们都有相同的最长公共子序列 $\boldsymbol{A} 、 \boldsymbol{B} 、 \boldsymbol{C}、 \boldsymbol{D}$ 。这个例子中它们有相同的ROUGE一L分。但是这种情况下,应该是 $Y_1$ 要好于 $Y_2$ 的,因为 $Y_1$ 有 更多的连续匹配。Rouge-W就是所做的工作就是给连续的匹配给到更多的权重,让连续匹配的比 非连续匹配的有更高的分数。论文中给出的计算公式是:

$F_{w l c s}$ 就是Rouge-W分数,上面公式中, $W L C S(X, Y)$ 是根据连续匹配情况加权后的最长公共 子序列长度 (叫分值更合适) 。在论文中,这两个例子算出来的Rouge-W分数是不一样的:Rouge $-W_{Y_1}=0.571$, Rouge $-W_{Y_2}=0.286$ 。总的来说Rouge-W的实现比前面的要复杂,更多的细节可以参考原始论文《ROUGE: A Package for Automatic Evaluation of Summaries》

ROUGGE-S

Rouge-S的S表示:Skip-Bigram Co-Occurrence Statistics,这其实是Rouge-N的一种扩展,N-gram是连续的,Skip-bigram是允许跳过中间的某些词,同时结合了Rouge-L的计算方式。论文中给到的公式是:

结合几个简单的句子作为例子说明一下:

S1(ref):police killed the gunman

S2(hyp):police kill the gunman

S3(hyp):the gunman kill police

S4(hyp):the gunman police killed

S5(hyp):gunman the killed police

其中 $C(m, 2) 、 C(n, 2)$ 分别表示reference、hypothesis句子中,skip-bigram的组合的个数。 对于 $\mathrm{S} 1, \mathrm{~S} 2$ 来说 $C\left(S_{1 / 2}, 2\right)$ ,具体组合为:

【S1】:police killed、police the、police gunman、killed the、killed gunman、the gunman

【S2】:police kill、police the、police gunman、kill the 、kill gunman、the gunman

两句话的skip-bigram都是6个 $(C(4,2)=6)$ ,共同的部分为 “ police the”, “police gunman”, “the gunman”, 所以 $S K I P 2(S 1, S 2)=3$ 。所以当 $\beta=1$ 时,代入上面的公式:

有一个比较特别的情况,可以看到S5,它与 $S 1$ 出现的单词是一样的,但由于顺序不同,其 $S K I P 2(S 1, S 5)=0$ ,为了区分 $S 5$ 这种情况和没有单个单词与 $S 1$ 共现的情况,提出了Rouge 一SU。Rouge-SU,Extension of Rouge-s,在Rouge-S的基础上增加了unigram。

优缺点

缺点是这种方法只能在单词、短语的角度去衡量两个句子的形似度。并不能支持同义词、近义词等语意级别去衡量。比如:

ref = “I’m very happy!”

hyp = “I’m very sad!”

hyp1 = “I’m very cheerful!”

hyp1和hyp2的rouge得分是一样的。但显然hyp1才是与ref更相近的。

好处是这种方式计算高效,在忽略近义词等情况下,做到比较合理的判断。

Rouge的实现

在github上面,关于Rouge的实现有pyrouge,files2rouge,rouge,py-rouge,其中rouge,files2rouge是同一个人开发的,笔者使用了rouge,其开源地址是:http://github.com/pltrdy/rouge。作为一个python包提供给python开发者调用,安装和使用都比较友好。

安装

1
pip install rouge

使用

举一个简单例子,更多可以去开源地址的README中查看。

1
2
3
4
5
6
7
8
from rouge import Rouge 

hypothesis = "the #### transcript is a written version of each day 's cnn student news program use this transcript to he lp students with reading comprehension and vocabulary use the weekly newsquiz to test your knowledge of storie s you saw on cnn student news"

reference = "this page includes the show transcript use the transcript to help students with reading comprehension and vocabulary at the bottom of the page , comment for a chance to be mentioned on cnn student news . you must be a teac her or a student age # # or older to request a mention on the cnn student news roll call . the weekly newsquiz tests students ' knowledge of even ts in the news"

rouger = Rouge()
scores = rouger.get_scores(hypothesis, reference)

输出是json格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[
{
"rouge-1": {
"f": 0.4786324739396596,
"p": 0.6363636363636364,
"r": 0.3835616438356164
},
"rouge-2": {
"f": 0.2608695605353498,
"p": 0.3488372093023256,
"r": 0.20833333333333334
},
"rouge-l": {
"f": 0.44705881864636676,
"p": 0.5277777777777778,
"r": 0.3877551020408163
}
}
]
一分一毛,也是心意。