datasets与rouge_score计算ROUGE-1精确率召回率不一致咨询
ROUGE指标计算结果差异原因说明
问题复现
使用datasets和rouge_score两个库计算相同文本对的ROUGE-1指标时,出现精确率、召回率数值互换的情况,测试代码如下:
from rouge_score import rouge_scorer import datasets hyp = ['I have no car.'] ref = ['I want to buy a car.'] scorer1 = datasets.load_metric('rouge') scorer2 = rouge_scorer.RougeScorer(['rouge1']) results = {'precision_rouge_score': [], 'recall_rouge_score': [], 'fmeasure_rouge_score': [], \ 'precision_datasets': [], 'recall_datasets': [], 'fmeasure_datasets': []} for (h, r) in zip(hyp, ref): precision, recall, fmeasure = scorer2.score(h, r)['rouge1'] results['precision_rouge_score'].append(precision) results['recall_rouge_score'].append(recall) results['fmeasure_rouge_score'].append(fmeasure) output = scorer1.compute(predictions=[h], references=[r]) results['precision_datasets'].append(output['rouge1'].mid.precision) results['recall_datasets'].append(output['rouge1'].mid.recall) results['fmeasure_datasets'].append(output['rouge1'].mid.fmeasure) print('results: ', results)
代码运行输出如下:
{'precision_rouge_score': [0.3333333333333333], 'recall_rouge_score': [0.5], 'fmeasure_rouge_score': [0.4], 'precision_datasets': [0.5], 'recall_datasets': [0.3333333333333333], 'fmeasure_datasets': [0.4]}
差异原因
两个库的计算逻辑均无错误,差异来自两个库的传参顺序规则不同:
rouge_score库的score方法固定参数顺序为score(reference, prediction),即第一个位置传入参考文本,第二个位置传入模型生成的预测文本。上述测试代码中把预测文本h放在第一个参数位、参考文本r放在第二个参数位,属于传参顺序错误。datasets库的rouge指标compute方法通过显式参数名predictions、references区分传入文本类型,测试代码中此处传参是正确的。
手动验证
按ROUGE-1的标准定义手动计算即可验证正确结果:
- 预测文本
I have no car.拆分后共4个unigram:[I, have, no, car.] - 参考文本
I want to buy a car.拆分后共6个unigram:[I, want, to, buy, a, car.] - 两者重叠的unigram共2个:
I、car.
计算得:
- 精确率 = 重叠词数 / 预测文本总词数 = 2/4 = 0.5
- 召回率 = 重叠词数 / 参考文本总词数 = 2/6 ≈ 0.333
- F1值为精确率和召回率的调和平均数,结果为0.4,和两个库返回的F1值完全匹配——F1值对称,所以即使传参顺序颠倒,F1结果也不会变,这也和测试输出的特征吻合。
将rouge_score的调用代码修正为scorer2.score(r, h)后,两个库返回的三项指标结果会完全一致。
内容的提问来源于stack exchange,提问作者Dammio
相关产品推荐
相关产品推荐

