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
表现不错 - 排除停用词通常能改善相关性评估
- 使用多个reference(ideal 摘要)可以改善相关性评估。
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-N1-gram武 / 汉 / 长 / 江 / 大/ 桥
武 / 汉 / 市 / 长 / 江 / 大/ 桥ideal:6
重叠:6
2-gram武汉 / 汉长 / 长江 / 江大 / 大桥
武汉 / 汉市 / 市长 / 长江 / 江大 / 大桥ideal:5
重叠:4
注:如有多个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-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 )}
最长公共子序列,Longest Common Subsequence(LCS)
- LCS和最长公共子串不同,不要求连续,保序即可
- Rouge-N 只关注匹配单元的数量,像词袋一样,不关注词序
- Rouge-L 关注词序
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}}R l c s =i d e a l 字符串长度l c s 长度,P l c s =p r e d 字符串长度l c s 长度,F l c s =R l c s +β2 P l c s (1 +β2 )R l c s P l c s
注:lcs经过了去重
以文档摘要任务为例:
ideal摘要
:”矿泉水和纯净水的所含物质不同”
pred摘要
:”矿泉水含有丰富的矿物质元素,纯净水不含矿物质”
-摘要内容lcs内容Rouge-L句子1ideal:
和纯净水
pred:
含有丰富
句子2ideal:矿泉水和
pred:
合并去重ideal长度: 14
pred长度: 21
lcs长度:10
from rouge import Rouge
pred = '武汉市长江大桥'
ideal = '武汉长江大桥'
pred, ideal = ' '.join(pred), ' '.join(ideal)
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 = '武汉长江大桥'
pred = ' '.join(jieba.cut(pred, HMM=False))
ideal = ' '.join(jieba.cut(ideal, HMM=False))
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计算有两个缺点:
- 受jieba分词的影响,分词错误就会评估错误。
- 降低了长词的重要性,这样一来,模型更倾向于拟合容易预测的短词。
word粒度的Rouge也有明显的优点:
- 更好地评估模型对专有名词的拟合程度。
在苏神的文章中,看到了一个结合了字粒度Rouge和词粒度Rouge各自优点的方法,简单来说,还是以词为匹配单位,把词的长度作为权重,为Rouge做一个加权即可。比如上文的”武汉长江大桥”,如果匹配对了,就给6分,而不是1分。这个方法需要自己实现Rouge计算函数。
Original: https://blog.csdn.net/GJ_0418/article/details/120944646
Author: SunnyGJing
Title: 文本生成:自动摘要评价指标 Rouge
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/548491/
转载文章受原作者版权保护。转载请注明原作者出处!