Rouge的全名是Recall-Oriented Understudy for Gisting Evaluation,单看名字就会发现Rouge是由召回率演变而来的指标,用于衡量模型生成摘要文本的质量。我们常说的Rouge其实是一组评价指标的统称,包含Rouge-N, Rouge-L, Rouge-W, Rouge-S四个指标,它们的计算方式和适用场景有所不同。本文首先介绍了它们各自的适用场景和计算方式,并给出了简洁可用的代码示例,最后写下了一点个人思考。
ROUGE-2
, ROUGE-L
, ROUGE-W
, 以及ROUGE-S
表现很好ROUGE-1
, ROUGE-L
, ROUGE-W
,ROUGE-SU4
, 以及ROUGE-SU9
表现很棒ROUGE-1
, ROUGE-2
, ROUGE-S4
, ROUGE-S9
, ROUGE-SU4
, 以及ROUGE-SU9
表现不错n-gram召回率,Co-Occurrence Statistics
rouge-n = pred与ideal的n-gram重叠数量 ideal的n-gram数量 \text{rouge-n}=\frac{\text{pred与ideal的n-gram重叠数量}}{\text{ideal的n-gram数量}} rouge-n=ideal的n-gram数量pred与ideal的n-gram重叠数量
分母是ideal字符串的n-gram个数,因为Rouge更关心recall值。(而BLEU更关心precision值)
简单地说,Rouge-n统计了pred和ideal两个字符串的n-gram重叠单元的数量,并计算了重叠单元在ideal字符串中的占比,作为召回率。
以短摘要/title摘要任务为例:
ideal摘要
:“武汉长江大桥”
pred摘要
:“武汉市长江大桥”
N-gram | 摘要内容 | 单元数量 | Rouge-N |
---|---|---|---|
1-gram | 武 / 汉 / 长 / 江 / 大/ 桥 武 / 汉 / 市 / 长 / 江 / 大/ 桥 | ideal:6 重叠:6 | Rouge-1 = 6 6 = 1 \text{Rouge-1}=\frac{6}{6}=1 Rouge-1=66=1 |
2-gram | 武汉 / 汉长 / 长江 / 江大 / 大桥 武汉 / 汉市 / 市长 / 长江 / 江大 / 大桥 | ideal:5 重叠:4 | Rouge-2 = 4 5 = 0.8 \text{Rouge-2}=\frac{4}{5}=0.8 Rouge-2=54=0.8 |
注:如有多个ideal摘要,怎么计算?
分别计算每个ideal摘要和pred摘要的Rouge值,并取其中最大值,作为当前pred摘要的Rouge值。
rouge-n
m
u
l
t
i
=
a
r
g
m
a
x
i
{rouge-n
(
i
d
e
a
l
i
,
p
r
e
d
)
}
\text{rouge-n}_{multi} = argmax_i \text{\{rouge-n}(ideal_i, pred)\}
rouge-nmulti=argmaxi{rouge-n(ideali,pred)}
最长公共子序列,Longest Common Subsequence(LCS)
R l c s = l c s 长 度 i d e a l 字 符 串 长 度 , P l c s = l c s 长 度 p r e d 字 符 串 长 度 , F l c s = ( 1 + β 2 ) R l c s P l c s R l c s + β 2 P l c s R_{lcs} = \frac{lcs长度}{ideal字符串长度}, P_{lcs}=\frac{lcs长度}{pred字符串长度}, F_{lcs}=\frac{(1+\beta^2)R_{lcs}P_{lcs}}{R_{lcs}+\beta^2P_{lcs}} Rlcs=ideal字符串长度lcs长度,Plcs=pred字符串长度lcs长度,Flcs=Rlcs+β2Plcs(1+β2)RlcsPlcs
注:lcs经过了去重
以文档摘要任务为例:
ideal摘要
:“矿泉水和纯净水的所含物质不同”
pred摘要
:“矿泉水含有丰富的矿物质元素,纯净水不含矿物质”
- | 摘要内容 | lcs内容 | Rouge-L |
---|---|---|---|
句子1 | ideal:矿泉水和纯净水的所含物质不同 pred:矿泉水含有丰富的矿物质元素 | 矿 泉 水 的 物 质 | |
句子2 | ideal:矿泉水和纯净水的所含物质不同 pred:纯净水不含矿物质 | 纯 净 水 含 物 质 | |
合并去重 | ideal长度: 14 pred长度: 21 | 矿 泉 水 纯 净 水 的 含 物 质 lcs长度:10 |
R
l
c
s
=
10
14
=
0.714
R_{lcs}=\frac{10}{14}=0.714
Rlcs=1410=0.714 P l c s = 10 21 = 0.476 P_{lcs}=\frac{10}{21}=0.476 Plcs=2110=0.476 |
from rouge import Rouge
pred = '武汉市长江大桥'
ideal = '武汉长江大桥'
# Rouge()按空格分隔gram,所以要在中文的字和字之间加上空格
pred, ideal = ' '.join(pred), ' '.join(ideal)
# 计算字粒度的rouge-1、rouge-2、rouge-L
rouge = Rouge()
rouge_scores = rouge.get_scores(hyps=pred, refs=ideal)
结果如下
>>> pred
'武 汉 市 长 江 大 桥'
>>> ideal
'武 汉 长 江 大 桥'
>>> rouge_scores
[{'rouge-1': {'r': 1.0, 'p': 0.8571428571428571, 'f': 0.9230769181065088},
'rouge-2': {'r': 0.8, 'p': 0.6666666666666666, 'f': 0.7272727223140496},
'rouge-l': {'r': 1.0, 'p': 0.8571428571428571, 'f': 0.9230769181065088}}]
from rouge import Rouge
import jieba
pred = '武汉市长江大桥'
ideal = '武汉长江大桥'
# 采用jieba分词
pred = ' '.join(jieba.cut(pred, HMM=False))
ideal = ' '.join(jieba.cut(ideal, HMM=False))
# 计算词粒度的rouge-1、rouge-2、rouge-L
rouge = Rouge()
rouge_scores = rouge.get_scores(hyps=pred, refs=ideal)
结果如下,
>>> pred
'武汉市 长江大桥'
>>> ideal
'武汉长江大桥'
>>> rouge_scores
[{'rouge-1': {'r': 0.0, 'p': 0.0, 'f': 0.0},
'rouge-2': {'r': 0.0, 'p': 0.0, 'f': 0.0},
'rouge-l': {'r': 0.0, 'p': 0.0, 'f': 0.0}}]
word粒度的Rouge计算有两个缺点:
word粒度的Rouge也有明显的优点:
在苏神的文章中,看到了一个结合了字粒度Rouge和词粒度Rouge各自优点的方法,简单来说,还是以词为匹配单位,把词的长度作为权重,为Rouge做一个加权即可。比如上文的“武汉长江大桥”,如果匹配对了,就给6分,而不是1分。这个方法需要自己实现Rouge计算函数。