1. BLEU
1.1 BLEU公式
评价机器翻译结果通常使⽤BLEU来评价,对于模型预测序列中任意的⼦序列,BLEU考察这个⼦序列是否出现在标签序列中。它的本质是考察机器翻译的结果与参考翻译之间的相似度,相似度越高,BLEU得分越高.
具体来说,设词数为 n n n的⼦序列的精度为 p n p_n pn,他是预测序列_与_标签序列_匹配词数为 n n n的子序列的数量_与_预测序列中词数为 n n n 的_子序列的数量之比。
举个例子,假设标签序列为A, B, C, D, E, F,预测序列为A, B, B, C, D,那么
p
1
=
4
/
5
p_1=4/5
p1=4/5,
p
2
=
3
/
4
p_2=3/4
p2=3/4,
p
3
=
1
/
3
,
p
4
=
0
p_3=1/3, p_4=0
p3=1/3,p4=0。 另
l
e
n
l
a
b
e
l
len_{label}
lenlabel和
l
e
n
p
r
e
d
len_{pred}
lenpred分别为标签序列和预测序列的词数,那么BLEU的定义为:
B
L
E
U
=
exp
(
min
(
0,
1
−
l
e
n
label
len
pred
)
)
∏
n
=
1
k
p
n
1/
2
n
BLEU=\exp \left( \min \left( \text{0,}1-\frac{len_{\text{label }}}{\text{len}_{\text{pred }}} \right) \right) \prod_{n=1}^k{p_{n}^{\text{1/}2^n}}
BLEU=exp(min(0,1−lenpred lenlabel ))n=1∏kpn1/2n
其中 k k k是我们希望匹配的子序列的最大词数(或者说是n-gram中的n),可以发现当预测序列和标签序列完全一致时BLEU值为1。
因为匹配较⻓⼦序列⽐匹配较短⼦序列更难,BLEU对匹配较⻓⼦序列的精度赋予了更⼤权重。例如,当 p n p_n pn固定为0.5时, 随着n增大, 0. 5 1 / 2 ≈ 0.7 , 0. 5 1 / 4 ≈ 0.84 , 0. 5 1 / 8 ≈ 0.92 , 0. 5 1 / 16 ≈ 0.96 0.5^{1/2}\approx0.7,0.5^{1/4}\approx0.84,0.5^{1/8}\approx0.92,0.5^{1/16}\approx0.96 0.51/2≈0.7,0.51/4≈0.84,0.51/8≈0.92,0.51/16≈0.96 。
另外,模型预测较短序列往往会得到较⾼ p n p_n pn值。因此,上式中连乘项前⾯的系数是为了惩罚较短的输出⽽设置的。例如,当 k = 2 k=2 k=2时,假设标签序列为A, B, C, D, E, F,而预测序列为A, B。虽然 p 1 = p 2 = 1 p_1 = p_2 = 1 p1=p2=1,但是惩罚系数 exp ( 1 − 6 / 2 ) ≈ 0.14 \exp(1-6/2)\approx0.14 exp(1−6/2)≈0.14, 因此BLEU结果接近0.14
1.2 BLEU的其他格式
BLEU计算公式很多地方会给出如下形式:
B
L
E
U
=
B
P
exp
(
∑
n
=
1
N
w
n
log
p
n
)
BLEU=BP\exp \left( \sum_{n=1}^N{w_n}\log p_n \right)
BLEU=BPexp(n=1∑Nwnlogpn)其中
BP
=
{
1
if
c
>
r
e
(
1
−
r
/
c
)
if
c
≤
r
\text{BP}=\left\{ \begin{matrix} 1& \,\,\text{if }c>r\\ e^{\left( 1-r/c \right)}& \,\,\text{if }c\le r\\ \end{matrix} \right.
BP={1e(1−r/c)if c>rif c≤r
c
c
c是预测序列的长度,
r
r
r是标签序列的长度
该公式和上面的公式其实是一样的,此处的
B
P
BP
BP就相当于上面的
e
x
p
(
min
(
0,
1
−
l
e
n
label
len
pred
)
)
exp\left( \min \left( \text{0,}1-\frac{len_{\text{label }}}{\,\,\text{len}_{\text{pred}}\,\,} \right) \right)
exp(min(0,1−lenpredlenlabel )),剩下部分推导如下:
exp
(
∑
n
=
1
N
w
n
ln
p
n
)
=
∏
n
=
1
N
exp
(
ω
n
ln
p
n
)
=
∏
n
=
1
N
exp
(
ln
p
n
w
n
)
=
∏
n
=
1
N
p
n
w
n
\exp \left( \sum_{n=1}^N{w_n}\ln p_n \right) =\prod_{n=1}^N{\exp \left( \omega _n\ln p_n \right)}=\prod_{n=1}^N{\exp \left( \ln p_{n}^{w_n} \right)}=\prod_{n=1}^N{p_{n}^{w_n}}
exp(n=1∑Nwnlnpn)=n=1∏Nexp(ωnlnpn)=n=1∏Nexp(lnpnwn)=n=1∏Npnwn其中
ω
n
=
1
2
n
\omega _n=\frac{1}{2^n}
ωn=2n1
BLEU的取值范围是[0,1],0最差,1最好;在第1节公式中 k k k一般取4左右,一般不大于4
1.3 BLEU编程实现
def bleu(pred_tokens, label_tokens, k):
len_pred, len_label = len(pred_tokens), len(label_tokens)
score = math.exp(min(0, 1-len_label/len_pred))
for n in range(1, k+1):
num_matches, label_subs = 0, collections.defaultdict(int)
for i in range(len_label-n+1):
label_subs[" ".join(label_tokens[i:i+n])] += 1
for i in range(len_pred-n+1):
if label_subs[" ".join(pred_tokens[i:i+n])] > 0:
num_matches += 1
label_subs[" ".join(pred_tokens[i:i+n])] -= 1
score *= math.pow(num_matches/(len_pred-n+1), math.pow(0.5, n))
return score
if __name__ == '__main__':
import math
import collections
score = bleu(['The', 'cat', 'sat', 'on', 'the', 'mat'], ['The', 'cat', 'is', 'on', 'the', 'mat'], 3)
print(score)
输出:
0.6756000774035172
[Finished in 0.1s]
注意k值不能取太大
2. ROUGE
ROUGE值是用于衡量自然语言生成中句子流畅性的一个指标。ROUGE最开始是对文本自动摘要进行效果评估,它把自动生成的摘要和人工生成的参考摘要相比较,计算出的得分表示两者之间的相似性。ROUGE和BLEU一样是一种基于n-gram的对生成句子的评价指标,ROUGE中有一些变体,比如有ROUGE-N(n-gram中的n,可以取值1,2,3,4等)ROUGE-L,ROUGE-S,ROUGE-W,ROUGE-SU等。本文中,选择了ROUGE-N和ROUGE-L进行详细讲解。
ROUGE-N的定义如式(2-1)所示,其中,分母为人工摘要中n-gram的数量,分子为人工摘要和机器摘要重合的n-gram数量。此处定义的ROUGE-N与召回率极其相似。ROUGE-N直观简洁的反映生成句子和参考句子之间的相似度,但是区分能力不强,对于与生成句子同义但不同的表达方式无法区分,造成得分很低,此外当N>3时,ROUGE-N的值通常都比较小。
ROUGE − N = ∑ S ∈ { ReferenceSummaries } ∑ gram n ∈ S Count match ( gram n ) ∑ S ∈ { ReferenceSummaries ⟩ ∑ gram n ∈ S Count ( gram n ) ( 2 − 1 ) \text { ROUGE }-N=\frac{\sum_{S \in\{\text { ReferenceSummaries }\}} \sum_{\text {gram }_{n} \in S} \operatorname{Count}_{\text {match }}\left(\text { gram }_{n}\right)}{\sum_{S \in\{\text { ReferenceSummaries }\rangle} \sum_{\text {gram }_{n} \in S} \text { Count }\left(\text { gram }_{n}\right)} \,\,\,\,\,(2-1) ROUGE −N=∑S∈{ ReferenceSummaries ⟩∑gram n∈S Count ( gram n)∑S∈{ ReferenceSummaries }∑gram n∈SCountmatch ( gram n)(2−1)
ROUGE-L和ROUGE-N不同,ROUGE-L是基于最长公共子序列来定义的,ROUGE-L的定义如式(2-2)到式(2-4)所示。
R l c s = L C S ( X , Y ) m ( 2 − 2 ) P l c s = L C S ( X , Y ) n ( 2 − 3 ) F l c s = ( 1 + β 2 ) R l c s P l c s R l c s + β 2 P l c s ( 2 − 4 ) \begin{gathered} R_{l c s}=\frac{L C S(X, Y)}{m} \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,(2-2)\\ \\ P_{l c s}=\frac{L C S(X, Y)}{n} \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,(2-3)\\ \\ F_{l c s}=\frac{\left(1+\beta^{2}\right) R_{l c s} P_{l c s}}{R_{l c s}+\beta^{2} P_{l c s}} \,\,\,\,\,\,\,(2-4) \end{gathered} Rlcs=mLCS(X,Y)(2−2)Plcs=nLCS(X,Y)(2−3)Flcs=Rlcs+β2Plcs(1+β2)RlcsPlcs(2−4)
其中, L C S ( X , Y ) LCS(X, Y) LCS(X,Y)表示序列X和序列Y的最长公共子序列的长度,m,n分别表示参考回复和系统生成的回复的词的个数。 R l c s R_{lcs} Rlcs和 P l c s P_{lcs} Plcs分别表示召回率和精确率,最后的 F l c s F_{lcs} Flcs即ROUGE-L的表达式。由式(2-4)所示可知ROUGE-L就是最长公共子序列的 f 1 f_1 f1值。ROUGE-L的优点是一定程度上评估了句子中词序的顺序匹配,但是,由于只计算一个最长子序列而忽略其他子序列这样的考虑并不完整。
3. METEOR
METEOR是Lavir发现基于召回率的评价指标比只基于精确率的评价指标的评价结果更好的结果提出来的,基于召回率的评价指标和人工评价的结果更为相似。METEOR解决了BLEU中没有使用召回率Recall的缺陷,同时用了更高阶的n-grams。
METEOR提出了三种统计共现词出现次数的方法,即精确方法,词根方法,语义方法。
-
其中精确方法是统计系统生成句子和参考句子中完全相同的单词的数目,例如“computers”和“computers”相对应,而不是“computer”;
-
词根方法是统计系统生成句子和参考句子中词根相同的单词数目,例如“computers”和“computers”及“computer”都是共现词对;
-
语义方法是统计生成回复和参考回复中的同义词数量。
在用这三种方法统计共现词时是按顺序来的,默认的顺序是首先用精确模式,然后用词干模式,最后用同义模式。通过上面三个方式统计完共现词的数量后,然后计算共现词对数目与系统生成句子中单词的数目之比,即精度precision,再计算共现词对数与标签句子中单词数目之比,即召回率,然后根据精度和召回率的调和平均计算 F m e a n F_{mean} Fmean,如式(3-1)所示。
F mean = ( 1 + β 2 ) P R R + β P ( 3 − 1 ) F_{\text {mean }}=\frac{\left(1+\beta^{2}\right) P R}{R+\beta P} \,\,\,\,\,\, (3-1) Fmean =R+βP(1+β2)PR(3−1)
大多数情况下会将recall的权重设置的比较大,所以取3。以上是匹配一个单词,对更长的匹配,METEOR对较短的匹配进行了惩罚,将位于系统生成的句子中相邻位置,且在参考句子中也位于相邻位置的词称为一个块,这样n-gram越长,组成的块的数量越少,惩罚系数计算如式(3-2)所示。例如系统生成句子是“the president spoke to the audience”
,且参考句子是“the president then spoke to the audience”
,则此处有两个块,分别是“the president”
和“spoke to the audience”
。
P e n a l t y = γ ( chunks u n i g r a m s _ m a t c h e d ) θ ( 3 − 2 ) Penalty=\gamma\left(\frac{\text { chunks }}{unigrams\_matched}\right)^{\theta} \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, (3-2) Penalty=γ(unigrams_matched chunks )θ(3−2)
在式(3-2)中, γ \gamma γ通常取0.5, θ \theta θ取3。可以看到,随着块chunks的增多,惩罚系数penalty逐渐增大,最大是0.5;随着块的数目减少,惩罚系数也减少。最后METEOR得分计算如式(3-3)所示。
METEOR = F mean ( 1 − Penalty ) ( 3 − 3 ) \text { METEOR }=F_{\text {mean }}(1-\text { Penalty }) \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, (3-3) METEOR =Fmean (1− Penalty )(3−3)
METEOR考虑了整个语料库上的准确率和召回率,同时考虑了句子流畅性和同义词对语义的影响但是METEOR和BLEU一样对于长度是比较敏感的。