Rouge | 自动文摘及机器翻译评价指标


tag:评价指标,摘要,nlp

Rouge(Recall-Oriented Understudy for Gisting Evaluation),是评估自动文摘以及机器翻译的一组指标。它通过将自动生成的摘要或翻译与一组参考摘要(通常是人工生成的)进行比较计算,得出相应的分值,以衡量自动生成的摘要或翻译与参考摘要之间的“相似度”。

rouge-N

指N-gram的个数

在中文中计算时,需要用空格将每个字分开(如同英文句子中每个单词之间的空格一样)

举个例子

from rouge import Rouge  
rouge = Rouge()  
title = '今天是星期四'  
pred_title = '今天是周四'  
pred_title2 = '周四是今天'  
print(rouge.get_scores(' '.join(list(pred_title)), ' '.join(list(title))))  
  
# [{'rouge-1': {'r': 0.6666666666666666, 'p': 0.8, 'f': 0.7272727223140496}, 'rouge-2': {'r': 0.4, 'p': 0.5, 'f': 0.4444444395061729}, 'rouge-l': {'r': 0.6666666666666666, 'p': 0.8, 'f': 0.7272727223140496}}]

print(rouge.get_scores(' '.join(list(pred_title2)), ' '.join(list(title))))
# [{'rouge-1': {'r': 0.6666666666666666, 'p': 0.8, 'f': 0.7272727223140496}, 'rouge-2': {'r': 0.2, 'p': 0.25, 'f': 0.22222221728395072}, 'rouge-l': {'r': 0.3333333333333333, 'p': 0.4, 'f': 0.36363635867768596}}]

rouge-1

指单个词的匹配度

  • 召回r=单个词重合数/len(title),即找到了多少个字,r=4(重合字为:今天是四)/6=0.67
  • 精准p=单个词重合数/len(pred_title),即找到的字里面有多少个是对的,p=4/5=0.8
  • f即为r和p的计算,f=(2PR)/(P+R)=0.737
  • 两个例子完全相同,不在乎顺序问题

rouge-2

指每两个字的匹配度

  • 召回r=每两个字的重合数/len(title),即找到了多少个字,r=2(今天、天是)/5(今天、天是、是星、星期、期四)=0.4;在title2时,r=1(今天)/5(今天、天是、是星、星期、期四)=0.2
  • 精准p=每两个字的重合数/len(pred_title),即找到的字里面有多少个是对的,p=2/4=0.5;在title2时,p=1(今天)/4(周四、四是、是今、今天)=0.25
  • f即为r和p的计算,f=(2PR)/(P+R)

rouge-L

LCS(longest common subsequence,最长公共子序列)的首字母,因为Rouge-L使用了最长公共子序列。但需要注意的是,这是考虑了顺序的最长公共子序列(因为这个顺序问题很多博客都没说困惑了好久)。

  • 召回r=3(今天是四)/len(title)=4/6;在title2时,r=2(今天)/6=1/3
  • 精准p=3(今天是四)/len(pred_title)=4/5;在title2时,r=2(今天)/5=0.4
  • f即为r和p的计算

优点:不要求词的连续匹配,只要求按词的出现顺序匹配即可,能够像n-gram一样反映句子级的词序。自动匹配最长公共子序列,不需要预先定义n-gram的长度。
缺点:只计算一个最长子序列,最终的值忽略了其他备选的最长子序列及较短子序列的影响。

看完这个例子就可以很清楚的了解到,如果预测出来的顺序一样,如title例子,此时rouge1=rouge-L;但到了title2时,由于考虑了顺序问题,此时最长公共子序列不再是“今天是四”而是“今天”,两个例子中rouge-1没有变化,但rouge2和rouge-L都发生了变化。

猜你喜欢

转载自blog.csdn.net/qq_23590921/article/details/129181387