Rouge——机器翻译Metric

学习笔记——Rouge

ROUGE是2004年由ISI的Chin-Yew Lin提出的一种自动摘要评价方法,是评估自动文摘和机器翻译的一组指标。与BLEU差不多,但是BLEU计算的是精确率,而ROUGE计算的是准确率。下面我们将从原理介绍,公式解析,代码实现来展示Rouge的实现。

1.简介

Rouge全称为Recall-Oriented Understudy for Gisting Evaluation,是在机器翻译、自动摘要、问答生成等领域常见的评估指标。它通过将自动生成的摘要或翻译与一组参考摘要(通常是人工生成的)进行比较,统计二者之间重叠的基本单元(n元语法、词序列和词对)的数目,来评价摘要的质量得出相应的分值,以衡量自动生成的摘要或翻译与参考摘要之间的相似度。

  • 核心:Rouge的核心是召回率,与BLEU一样,其指标区间是[0,1]之间,越接近1说明准确越高。直接点来说,当机器翻译过的句子中的词组,也就是预测出来的词组,越多覆盖标准译文中的词组,那Rouge指标就越高。
  • 为了下面介绍方便,我们现在明文规定,给出的标准译文(也就是专业的或者业余翻译员翻译的句子)的名称是reference,而神经网络生成的句子是prediction

Rouge有许多变种,我们在这里介绍Rouge-N,以及Rouge-L两种。

Rouge-N

  • Rouge-N实际上是将模型生成的结果和标准结果按N-gram拆分后,计算召回率。比如有2个句子:
模型生成(prediction):the cat was found under the bed

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

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

# prediction 1-gram reference 1-gram prediction 2-gram reference 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

分子表示所有样本的标准结果按N-gram拆分后与生产结果按N-gram拆分后匹配上个数的和;分母表示所有样本的标准结果,按N-gram拆分后的和。这样很容易计算, R o u g e − 1 = 6 6 = 1.0 Rouge−1=\frac{6}{6}=1.0 Rouge1=66=1.0,同样 R o u g e − 2 = 4 5 = 0.8 Rouge−2=\frac{4}{5}=0.8 Rouge2=54=0.8。以此类推,一般来说N越大,分值容易越小。

ROUGE-L

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

  • 优点:反应句子级别顺序,不需要制定n-gram的长度
  • 缺点:只考虑了最长子序列的长度,忽略了其他子序列

2.公式详解

ROUGE-N

Rouge-N的公式和Bleu极其类似:
R o u g e _ N = ∑ S ∈ R e f e r e n c e ∑ n − g r a m ∈ S C o u n t m a t c h ( n − g r a m ) ∑ S ′ ∈ R e f e r e n c e ∑ n − g r a m ′ ∈ S ′ C o u n t ( n − g r a m ) Rouge\_N = \frac{\sum_{S\in{Reference}}\sum_{n-gram\in S}Count_{match}(n-gram)}{\sum_{S^{'}\in{Reference}}\sum_{n-gram^{'}\in S^{'}}Count(n-gram)} Rouge_N=SReferencengramSCount(ngram)SReferencengramSCountmatch(ngram)
这里所求的公式和Bleu的基本一致,最大的相同之处在于其分子部分,都是求预测句子的词组以及标准句子的词组的匹配程度。而最大的不同之处在于其分母部分,在Bleu的计算中,分母是由预测句子的词组数量构成,也就是最终计算的是精确率,而在这里,分母是由答标准译文句子的词组数量构成,所以Rouge_N计算的是召回率。一般来说N越大,分值容易越小。前面提到的都是单个reference的情况,对于多个reference的情况,也有处理的办法,通常有两种

  • 从多个Reference中挑选出F1值最高的那个作为本次的答案
  • 对于多个Reference求其平均值作为本次的答案

ROUGE-L

Rouge-L的L表示:Longest Common Subsequence,Rouge-L的计算利用了最长公共子序列(区别一下最长公共子串,这个是连续的,子序列不一定连续,但是二者都是有词的顺序的)。Rouge-L的公式可以表示为:
R l c s = L C S ( X , Y ) m R_{lcs} = \frac{LCS(X,Y)}{m} Rlcs=mLCS(X,Y)

p l c s = L C S ( X , Y ) n p_{lcs} = \frac{LCS(X,Y)}{n} plcs=nLCS(X,Y)

F l c s = ( 1 + β 2 ) R l c s p l c s R l c s + β 2 p l c s F_{lcs} = \frac{(1+\beta^2)R_{lcs}p_{lcs}}{R_{lcs}+\beta^2p_{lcs}} Flcs=Rlcs+β2plcs(1+β2)Rlcsplcs

  • 上面的公式中,X表示标准答案,也就是上面两个句子中的ref,Y表示生产答案,也就是上面两个句子中的reference。m表示X的长度,n表示Y的长度。LCS(X,Y)表示X和Y的最长公共子序列,β是一个超参数,需要自己设置,如果设置为1的话,得到的结果就是F1。
  • 公式中的F就是ROUGE-L的得分,因为β设置的比较大,所以最终F还是受召回率的影响更大,也符合ROUGE_L一开始的初衷。

3.代码解析

这里着重介绍一下最核心的代码:

pred_ngarms = get_n_gram(pred, n_gram)
reference_ngarms = get_n_gram(reference, n_gram)
matches = sum(min(pred_ngarms[w], reference_ngarms[w]) for w in set(pred_ngarms))
  • pred_ngarms和reference_ngarms就是两个Counter,分别保存了预测句子和标准译文句子的n_grams,关键在最后一句,我一部分一部分来解释:
    • 首先是w,w代表了在pred_ngrams的某一个gram,如上面表格中的cat,found under等,代码会遍历所有n_gram。
    • 对于每一个元素,从pred_ngarms和reference_ngarms中去检索出它们出现的次数,两两比较,挑选出一个最小值。(这里有一个重要的点,就是某一个元素并没有在reference中出现,那么reference_ngarms[w]就是直接等于0,因为求的是min,所以这个元素的值就是0,相当于排除掉了那些没有匹配上的元素)
    • 最后,将所有挑选出的元素,按照它们出现的次数为权重加起来,就是最后计算得到的匹配次数。
lcs = [[0] * (len(pred) + 1) for _ in range(len(reference) + 1)]
for i in range(1, len(reference) + 1):
    for j in range(1, len(pred) + 1):
        if reference[i - 1] == pred[j - 1]:
            lcs[i][j] = lcs[i - 1][j - 1] + 1
        else:
            lcs[i][j] = max(lcs[i - 1][j], lcs[i][j - 1])
  • 上面就是求最长公共子序列的代码,最后只要返回lcs[-1][-1]的结果就可以进入下一步的计算了。

你可能感兴趣的:(机器翻译,人工智能,自然语言处理)