2. rouge 评价文本摘要的效果

对于文本摘要任务,常用评估指标是 ROUGE 值 (short for Recall-Oriented Understudy for Gisting Evaluation),它可以度量两个词语序列之间的词语重合率。ROUGE 值的召回率表示参考摘要在多大程度上被生成摘要覆盖。

如果我们只比较词语,那么召回率就是 参考的摘要 中有多少词语与参考摘要相关:

$$
\text{Recall}=\frac{\text{Number of overlapping words}}{\text{Total number of words in reference summary}} \tag{1}
$$
准确率则表示 生成的摘要 中有多少词语与参考摘要相关:
$$
\text{Recall}=\frac{\text{Number of overlapping words}}{\text{Total number of words in generated summary}} \tag{2}
$$
注: 参考摘要就是数据集的label, 生成摘要是模型生成的文本。

最后再基于准确率和召回率来计算 F1 值。实际操作中,我们可以通过 rouge 库 来方便地计算这些 ROUGE 值,例如 ROUGE-1 度量 uni-grams 的重合情况,ROUGE-2 度量 bi-grams 的重合情况,而 ROUGE-L 则通过在生成摘要和参考摘要中寻找最长公共子串来度量最长的单词匹配序列,例如:

from rouge import Rouge

generated_summary = "I absolutely loved reading the Hunger Games"
reference_summary = "I loved reading the Hunger Games"

rouge = Rouge()

scores = rouge.get_scores(hyps=[generated_summary], refs=[reference_summary]
)[0]
print(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}}

这里解释下 rouge-1的计算,其它也类似。对于代码中示例:

  1. 召回率:参考摘要词数为 6, 在生成摘要中共现的有 6 个,那么 $\text{recall} =1$
  2. 准确率: 生成摘要词数为 7,共现 6 个,那么 $\text{precision} =6/7$
  3. f1 计算为 $\text{F1} = \frac{2PR}{P+R} = \frac{12/7}{1+6/7}=12/13=0.92$

rouge 库默认使用空格进行分词,因此无法处理中文、日文等语言,最简单的办法是按字进行切分,当然也可以使用分词器分词后再进行计算,否则会计算出不正确的 ROUGE 值():

from rouge import Rouge

generated_summary = "最简单的方法是按词切分"
reference_summary = "最简单的办法是按字进行切分"

rouge = Rouge()
model_name = 'csebuetnlp/mT5_multilingual_XLSum'
tokenizer = AutoTokenizer.from_pretrained(model_name)
TOKENIZE_CHINESE = lambda x: ' '.join(tokenizer.convert_ids_to_tokens(tokenizer(x).input_ids, skip_special_tokens=True)
)
print([TOKENIZE_CHINESE(generated_summary)])
print([TOKENIZE_CHINESE(reference_summary)])
# TOKENIZE_CHINESE = lambda x: ' '.join(x)

scores = rouge.get_scores(hyps=[TOKENIZE_CHINESE(generated_summary)], 
    refs=[TOKENIZE_CHINESE(reference_summary)]
)[0]
display('ROUGE:', scores)
scores = rouge.get_scores(hyps=[generated_summary], 
    refs=[reference_summary]
)[0]
display('wrong ROUGE:', scores)

这就是 rouge 计算的公式解释和代码应用了, 是不是很简单。

Inference

[1] t5 做文本摘要

正文完
 
admin
版权声明:本站原创文章,由 admin 2023-03-28发表,共计2000字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请联系tensortimes@gmail.com。
评论(没有评论)
验证码