ROUGE 是一个系列的文本摘要评测指标,可用于评估机器摘要和人工摘要之间的相似度,主要包括以下具体指标:
每个具体指标都包括 Precision, Recall, F-Score 三项子指标,指标的具体定义详见这篇论文 ROUGE: A Package for Automatic Evaluation of Summaries。
官方的 ROUGE 评测工具 ROUGE-1.5.5.pl 是用 Perl 脚本写的,每次评测都需要写 xml 配置文件,使用起来比较麻烦。
这里推荐一个 Python 包 rouge-metric,安装和配置十分方便,同时提供了 Perl 评测脚本的封装和一套 Python 版本的评测 API。
我们可以直接通过 pip 安装。
pip install rouge-metric
对于 Linux 和 macOS 用户,无需任何配置就能使用;对于 Windows 用户,需要手动安装 Strawberry Perl,并将其二进制目录添加到环境变量 PATH 中,确保命令行执行 perl --version
无报错。
我们先将源仓库克隆下来,里面有测试用例。
git clone https://github.com/li-plus/rouge-metric.git
cd rouge-metric
首先测试一下命令行工具,在终端中输入,
rouge-metric sample/hypotheses sample/references -n 2
如果出现了下面的输出,表明安装成功。
---------------------------------------------
A ROUGE-1 Average_R: 0.51822 (95%-conf.int. 0.42105 - 0.61538)
A ROUGE-1 Average_P: 0.55556 (95%-conf.int. 0.44444 - 0.66667)
A ROUGE-1 Average_F: 0.53622 (95%-conf.int. 0.43243 - 0.64000)
---------------------------------------------
A ROUGE-2 Average_R: 0.19519 (95%-conf.int. 0.11765 - 0.27273)
A ROUGE-2 Average_P: 0.21250 (95%-conf.int. 0.12500 - 0.30000)
A ROUGE-2 Average_F: 0.20346 (95%-conf.int. 0.12121 - 0.28572)
---------------------------------------------
A ROUGE-L Average_R: 0.51822 (95%-conf.int. 0.42105 - 0.61538)
A ROUGE-L Average_P: 0.55556 (95%-conf.int. 0.44444 - 0.66667)
A ROUGE-L Average_F: 0.53622 (95%-conf.int. 0.43243 - 0.64000)
命令行工具的选项跟 ROUGE-1.5.5.pl 脚本基本一致,具体使用方法可以参考帮助信息 rouge-metric --help
,以下是一些常用选项:
例如命令 rouge-metric sample/hypotheses sample/references -n 2 -w 1.2 -2 4 -U
将计算 ROUGE-1, ROUGE-2, ROUGE-L, ROUGE-W-1.2, ROUGE-S4, ROUGE-SU4 这些指标。
在 Python 程序里面同样可以调用官方的 ROUGE-1.5.5.pl 评测脚本,代码如下,
from rouge_metric import PerlRouge
rouge = PerlRouge(rouge_n_max=3, rouge_l=True, rouge_w=True,
rouge_w_weight=1.2, rouge_s=True, rouge_su=True, skip_gap=4)
# Load summary results and evaluate
hypotheses = [
'how are you\ni am fine', # document 1: hypothesis
'it is fine today\nwe won the football game', # document 2: hypothesis
]
references = [[
'how do you do\nfine thanks', # document 1: reference 1
'how old are you\ni am three', # document 1: reference 2
], [
'it is sunny today\nlet us go for a walk', # document 2: reference 1
'it is a terrible day\nwe lost the game', # document 2: reference 2
]]
scores = rouge.evaluate(hypotheses, references)
print(scores)
输出大致如下,不一一列出。
{
'rouge-1': {
'r': 0.51822, 'r_conf_int': (0.42105, 0.61538),
'p': 0.55556, 'p_conf_int': (0.44444, 0.66667),
'f': 0.53622, 'f_conf_int': (0.43243, 0.64)
},
'rouge-2': {...}, 'rouge-3': {...}, 'rouge-l': {...},
'rouge-w-1.2': {...}, 'rouge-s4': {...}, 'rouge-su4': {...}
}
调用 ROUGE-1.5.5.pl 的方法效率较低,而且只能评测英文摘要,对于中文摘要需要构建词表,将文字映射到数字。
rouge-metric 还提供了 ROUGE 指标的一个 Python 实现:PyRouge
,使用方法与 PerlRouge
类似,默认按换行符 \n
分句,按空格分词,可以支持多种语言的摘要评测。
from rouge_metric import PyRouge
# Load summary results
hypotheses = [
'how are you\ni am fine', # document 1: hypothesis
'it is fine today\nwe won the football game', # document 2: hypothesis
]
references = [[
'how do you do\nfine thanks', # document 1: reference 1
'how old are you\ni am three', # document 1: reference 2
], [
'it is sunny today\nlet us go for a walk', # document 2: reference 1
'it is a terrible day\nwe lost the game', # document 2: reference 2
]]
# Evaluate document-wise ROUGE scores
rouge = PyRouge(rouge_n=(1, 2, 4), rouge_l=True, rouge_w=True,
rouge_w_weight=1.2, rouge_s=True, rouge_su=True, skip_gap=4)
scores = rouge.evaluate(hypotheses, references)
print(scores)
输出大致如下,
{
'rouge-1': {
'r': 0.5182186234817814,
'p': 0.5555555555555556,
'f': 0.5362379555927943
},
'rouge-2': {...}, 'rouge-4': {...}, 'rouge-l': {...},
'rouge-w-1.2': {...}, 'rouge-s4': {...}, 'rouge-su4': {...}
}
分句和分词还可以进一步定制化,具体可以参考 rouge.evaluate_tokenized
方法。
[1]: ROUGE: A Package for Automatic Evaluation of Summaries, https://www.aclweb.org/anthology/W04-1013/
[2]: rouge-metric, https://github.com/li-plus/rouge-metric