Rouge 摘要评价工具

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 的一种评价方法,公式表示如下:

  1. N 表示 n-gram 的长度
  2. \(Count_{match}(gram_n)\) 表示生成摘要和参考摘要的共同出现的长度
  3. \(Count(gram_n)\) 表示 \(gram_n\) 的长度

通过一个例子来理解公式:

机器摘要 hyp: 我是中国人
标准摘要 ref:  我是个地地道道堂堂正正的中国人

先把两个距离切分成字/词粒度,使用 jieba 分词结果如下:

机器摘要 hyp: ['我', '是', '中国', '人']
标准摘要 ref: ['我', '是', '个', '地地道道', '堂堂正正', '的', '中国', '人']

当 N = 1 时,根据上面的公式:

  1. \(Count_{match}(gram_n)\) = 4
  2. \(Count(gram_n)\) = 8
  3. Rouge-N 召回率 = 4 / 8 = 0.5
  4. Rouge-N 精确率 = 4 / 4 = 1

当 N = 2 时,根据上面的公式:

  1. \(Count_{match}(gram_n)\) = 2
  2. \(Count(gram_n)\) = 7
  3. Rouge-N 召回率 = 2 / 7 = 0.2857142
  4. 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)的一种评价方法,公式表示如下:

  1. m 是生成摘要 X 序列长度
  2. 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)。

未经允许不得转载:一亩三分地 » Rouge 摘要评价工具
评论 (0)

3 + 2 =