学习笔记——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 Rouge−1=66=1.0,同样 R o u g e − 2 = 4 5 = 0.8 Rouge−2=\frac{4}{5}=0.8 Rouge−2=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=∑S′∈Reference∑n−gram′∈S′Count(n−gram)∑S∈Reference∑n−gram∈SCountmatch(n−gram)
这里所求的公式和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]
的结果就可以进入下一步的计算了。