赞
踩
ROUGE是2004年由ISI的Chin-Yew Lin提出的一种自动摘要评价方法,是评估自动文摘和机器翻译的一组指标。与BLEU差不多,但是BLEU计算的是精确率,而ROUGE计算的是准确率。下面我们将从原理介绍,公式解析,代码实现来展示Rouge的实现。
Rouge全称为Recall-Oriented Understudy for Gisting Evaluation,是在机器翻译、自动摘要、问答生成等领域常见的评估指标。它通过将自动生成的摘要或翻译与一组参考摘要(通常是人工生成的)进行比较,统计二者之间重叠的基本单元(n元语法、词序列和词对)的数目,来评价摘要的质量得出相应的分值,以衡量自动生成的摘要或翻译与参考摘要之间的相似度。
Rouge有许多变种,我们在这里介绍Rouge-N,以及Rouge-L两种。
模型生成(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的L表示: Longest Common Subsequence
,Rouge-L的计算利用了最长公共子序列(区别一下最长公共子串,这个是连续的,子序列不一定连续,但是二者都是有词的顺序的)。
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的情况,也有处理的办法,通常有两种
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
这里着重介绍一下最核心的代码:
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))
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]
的结果就可以进入下一步的计算了。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。