【笔记】双语评估替补
🍅
1)介绍
BLEU (Bilingual Evaluation Understudy)是一种用于机器翻译任务的评价指标;发布在ACL:《 BLEU: a Method for Automatic Evaluation of Machine Translation 》;understudy译作替补,指替代人工审核进行评估; 本质上讲BLEU 就是用来衡量机器翻译文本与参考文本之间的相似程度的指标,取值范围在0-1, 取值越靠近1表示机器翻译结果越好
举个例子:有两个句子,一个是标准答案,一个是模型生成的;如何评价模型生成的句子好不好?
reference:there is a cat on the desk
candidate: a cat is on the desk
上面reference是标准答案,candidate为生成的结果;我想要得到一个指标度量生成的结果好不好,最直接的思想就是比较两个句子的相似度,相似度越高,结果越好。
2)原理(原始精度)
BLEU使用词频作为相似度的度量方法;计算方法是: 对于candidate的每一个词,计算其是否在Reference文档中出现过,如果出现过,命中计数加1, 最后使用命中累计数除以candidate的词长,即可计算得到candidate的BLEU取值;这里介绍的概念称为原始多元精度;
例如:
Candidate | the | the | the | the | the | the | the |
---|---|---|---|---|---|---|---|
Reference1 | the | cat | is | on | the | mat | |
Reference2 | there | is | a | cat | on | the | mat |
在这个例子中,candidate中的每一个词都在参考文档中出现,所以其准确率值为 P = 7 7 = 1 P=\frac{7}{7}=1 P=77=1;这个值叫做原始一元精度;
看到这里,已经能看出问题了;虽然使用词频作为统计相似度很简单快捷,但是他忽略了语言顺序,单纯靠词是不行的;所以需要对这种方法进行修正;
改良型的BLEU引入将多个词组合在一起形成一个gram的思想, 比如上述的Bleu的计算可以看做一个单词构成的gram(这是一种特殊情况), 这种特殊组合被叫做uni-gram
, 两个单词的组合叫做bi-gram
以此类推. 因此就可以构成1个单词长度到n个单词长度的多种单词组合(每一种单词长度可能存在不同的组合)。每一种长度的gram都可以计算出一个相应的precision
P
N
P_N
PN. 对于该种长度gram 的precision我们还需要把它们整合起来, 一般使用加权集合平均的方法将n个计算出的precision整合成一个precision;
使用N-gram方法基本思路和上述例子相同,只不过这里不再是一个词,而是gram组合词;例如:
the cat is on the mat
可以拆分成2-gram:
[“the cat”,“cat is”, “is on”," on the", “the mat”]
N-gram实际上是引入了次序的位置信息,从而使得度量指标符合语义; 一般情况,1-gram可以代表原文有多少词被单独翻译出来,可以反映译文的充分性,2-gram以上可以反映译文的流畅性,它的值越高说明可读性越好。
不同的n-gram表示不同的n元精度;
3)改进(改进精度)
在上述的例子中,candidate出现常用词the,导致其1-gram得分很高,此问题为常用词干扰;需要对这个方法进行完善,这里介绍改进多元精度;以上述为例,常用词命中的概率肯定高,换种说法,在参考文档中,词频高的词可以认为是常用词,那我们把它的权重降低;将命中统计值和词频联系起来;
计算方法如下:
c
o
u
n
t
w
=
m
i
n
(
C
w
,
R
w
)
count_w = min(C_w, R_w)
countw=min(Cw,Rw)
其中
C
w
C_w
Cw表示n-gram在candidate中出现的次数,
R
w
R_w
Rw表示n-gram词在Reference中出现的最大次数;取两者比较的最小值作为命中词频; 然后在把这个匹配结果除以机器翻译译文的N-gram个数 ;
最终译文的准去率等于各n-gram的加权平均;
P
a
v
g
=
e
x
p
(
∑
n
W
n
⋅
l
o
g
P
n
)
P_{avg} = exp(\sum_{n}W_n \cdot logP_n)
Pavg=exp(n∑Wn⋅logPn)
上面的算法已经足够有效的评估翻译了,但是还存在一个问题,当candidate很短, 且部分匹配的时候,会出现匹配分数很高的状况,为了避免这种偏向性,BLEU中引入了短句惩罚因子 BP;
如果candidate句子大于reference, BP=1; 否则 B P = e ( 1 − l e n ( r e f e r e n c e ) / l e n ( c a n d i d a t e ) ) BP=e^{(1-len(reference)/len(candidate))} BP=e(1−len(reference)/len(candidate))
最终BLEU的计算公式为:
B
L
E
U
=
B
P
⋅
P
a
v
g
=
B
P
⋅
e
x
p
(
∑
n
W
n
⋅
l
o
g
P
n
)
BLEU= BP\cdot P_{avg} = BP \cdot exp(\sum_{n}W_n \cdot logP_n)
BLEU=BP⋅Pavg=BP⋅exp(n∑Wn⋅logPn)
总结一下:BLEU值其实也就是“改进版的n-gram”加上“过短惩罚因子”。
4)代码实现
Python自然语言工具包库NLTK
提供了BLEU得分的计算实现;使用的时候,candidate和reference都必须用一列写token表示;
from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)
print(score)
NLTK
中允许传入参数weight来设定不同的N-grams
的权重来计算累计BLEU;
from nltk.translate.bleu_score import sentence_bleu
reference = [['人', '最','大','的', '烦', '恼', '就', '是', '记', '性', '太', '好']]
candidate = ['人', '的', '烦', '恼', '就', '是', '记', '性', '太', '好']
print('1-gram score = ', sentence_bleu(reference, candidate, weights=[1,0,0,0]))
print('2-gram score = ', sentence_bleu(reference, candidate, weights=[0,1,0,0]))
print('3-gram score = ', sentence_bleu(reference, candidate, weights=[0,0,1,0]))
print('4-gram score = ', sentence_bleu(reference, candidate, weights=[0,0,0,1]))
通常情况下, 我们会统计BLEU1
到BLEU4
的累积值作为评估 文本生成系统(text generation system) 的效果.