当前位置: 首页 > 工具软件 > Rouge > 使用案例 >

文本生成:自动摘要评价指标 Rouge

高锦
2023-12-01

Rouge的全名是Recall-Oriented Understudy for Gisting Evaluation,单看名字就会发现Rouge是由召回率演变而来的指标,用于衡量模型生成摘要文本的质量。我们常说的Rouge其实是一组评价指标的统称,包含Rouge-N, Rouge-L, Rouge-W, Rouge-S四个指标,它们的计算方式和适用场景有所不同。本文首先介绍了它们各自的适用场景和计算方式,并给出了简洁可用的代码示例,最后写下了一点个人思考。

不同的摘要任务下,选择合适的Rouge指标

  • 单文档摘要任务中,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 摘要)可以改善相关性评估。

Rouge-N的理解与示例

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=idealn-gram数量predidealn-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)}

Rouge-L的理解与示例

最长公共子序列,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}} Rlcs=ideallcs,Plcs=predlcs,Flcs=Rlcs+β2Plcs(1+β2)RlcsPlcs

注:lcs经过了去重

以文档摘要任务为例:
ideal摘要:“矿泉水和纯净水的所含物质不同”
pred摘要:“矿泉水含有丰富的矿物质元素,纯净水不含矿物质”

-摘要内容lcs内容Rouge-L
句子1ideal:矿泉水和纯净水所含物质不同
pred:矿泉水含有丰富物质元素
矿 泉 水 的 物 质
句子2ideal:矿泉水和纯净水的所含物质不同
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

代码示例(char粒度 计算摘要的Rouge值)

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}}]

代码示例(word粒度 计算摘要的Rouge值)

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计算有两个缺点:

  • 受jieba分词的影响,分词错误就会评估错误。
  • 降低了长词的重要性,这样一来,模型更倾向于拟合容易预测的短词。

word粒度的Rouge也有明显的优点:

  • 更好地评估模型对专有名词的拟合程度。

在苏神的文章中,看到了一个结合了字粒度Rouge和词粒度Rouge各自优点的方法,简单来说,还是以词为匹配单位,把词的长度作为权重,为Rouge做一个加权即可。比如上文的“武汉长江大桥”,如果匹配对了,就给6分,而不是1分。这个方法需要自己实现Rouge计算函数。

Reference

 类似资料: