Rouge(Recall-Oriented Understudy for Gisting Evaluation)用于自动摘要的评估,简单介绍下论文中提到的几种 Rouge 评估方法。
Paper:https://aclanthology.org/W04-1013.pdf
Rouge 评价工具安装:
pip install rouge
1. Rouge-N
Rouge-N 是基于 N-gram Co-Occurrence 的一种评价方法,公式表示如下:
- N 表示 n-gram 的长度
- \(Count_{match}(gram_n)\) 表示生成摘要和参考摘要的共同出现的长度
- \(Count(gram_n)\) 表示 \(gram_n\) 的长度
通过一个例子来理解公式:
机器摘要 hyp: 我是中国人 标准摘要 ref: 我是个地地道道堂堂正正的中国人
先把两个距离切分成字/词粒度,使用 jieba 分词结果如下:
机器摘要 hyp: ['我', '是', '中国', '人'] 标准摘要 ref: ['我', '是', '个', '地地道道', '堂堂正正', '的', '中国', '人']
当 N = 1 时,根据上面的公式:
- \(Count_{match}(gram_n)\) = 4
- \(Count(gram_n)\) = 8
- Rouge-N 召回率 = 4 / 8 = 0.5
- Rouge-N 精确率 = 4 / 4 = 1
当 N = 2 时,根据上面的公式:
- \(Count_{match}(gram_n)\) = 2
- \(Count(gram_n)\) = 7
- Rouge-N 召回率 = 2 / 7 = 0.2857142
- Rouge-N 精确率 = 2 / 3 = 0.6666666
从上面例子,可以看到 Rouge-N 是一个关注 Recall 的自动摘要评估指标。
注意:使用 Rouge-N 应该去除停用词后再进行评估。
示例代码:
import rouge import jieba import pandas as pd def test01(): my_rouge = rouge.Rouge(metrics=["rouge-1", "rouge-2"], stats=["r", 'p']) # hyps: 生成摘要 # refs: 参考摘要 hyp = jieba.lcut('我是中国人') ref = jieba.lcut('我是个地地道道堂堂正正的中国人') print('hyp 分词:', hyp) print('ref 分词:', ref) scores = my_rouge.get_scores(hyps=[' '.join(hyp)], refs=[' '.join(ref)]) print(scores) if __name__ == '__main__': test01()
程序输出结果:
hyp 分词: ['我', '是', '中国', '人'] ref 分词: ['我', '是', '个', '地地道道', '堂堂正正', '的', '中国', '人'] [ { 'rouge-1': {'r': 0.5, 'p': 1.0}, 'rouge-2': {'r': 0.2857142857142857, 'p': 0.6666666666666666} } ]
前面计算时候,我们假设参考摘要只有一个,如果多于一个参考摘要的话,机器生成摘要的 Rouge-N 得分如本计算?其实,就是取得分最高作为当前机器生成摘要的得分。
2. Rouge-L
Rouge-L 是基于最大公共子序列长度(LCS)的一种评价方法,公式表示如下:
- m 是生成摘要 X 序列长度
- n 是参考摘要 Y 序列长度
示例代码:
import rouge import jieba import pandas as pd def test02(): my_rouge = rouge.Rouge(metrics=["rouge-l"], stats=["r", 'p']) # hyps: 生成摘要 # refs: 参考摘要 hyp = jieba.lcut('我是个中国人') ref = jieba.lcut('我是一个地地道道堂堂正正的中国人') print('hyp 分词:', hyp) print('ref 分词:', ref) scores = my_rouge.get_scores(hyps=[' '.join(hyp)], refs=[' '.join(ref)]) print(scores) if __name__ == '__main__': test02()
程序执行结果:
hyp 分词: ['我', '是', '个', '中国', '人'] ref 分词: ['我', '是', '一个', '地地道道', '堂堂正正', '的', '中国', '人'] [{'rouge-l': {'r': 0.5, 'p': 0.8}}]
LCS(hyp, ref) 的长度是 4,hyp 长度是 5,ref 长度是 6,所以对应的精度和召回率分别是 0.8 和 0.5。
3. 总结
论文中还提到了 Rouge-W、Rouge-S 等,感兴趣可以看下论文。论文中提到,经过实验,Rouge-1、Rouge-L 在非常短的摘要中表现比较好,比如:标题级别。Rouge-2、Rouge-L 在单文档摘要中表现很不错。
在 ROUGE 评估指标中 R、P、F 分别表示:
R(Recall):召回率,表示模型生成的摘要中有多少单词在参考摘要中出现,即模型找回了多少参考摘要中的信息。
P(Precision):精确率,表示参考摘要中有多少单词也出现在模型生成的摘要中,即模型生成的摘要有多少是正确的。
F(F-measure):F值,综合考虑了P和R两个指标,是精确率和召回率的调和平均数,即 F = 2 * (P * R) / (P + R)。