如何在没有简洁惩罚的情况下计算 BLEU 分数

问题描述

代码

import nltk
from nltk.translate.bleu_score import sentence_bleu 
score1 = sentence_bleu(ref1,cand) 

如何从此处计算的 bleu 分数中忽略简洁惩罚?

解决方法

如果您查看 NLTK 中的源代码,您可以看到计算中的简洁惩罚是硬编码的,就在返回最终分数之前,在下一行。

s = bp * math.exp(math.fsum(s))

您当然可以复制和修改源代码。还有 breivity_penalty 函数,它允许您自己计算并再次划分分数。

另外,请注意 NLTK 中 BLEU 的实现与最近在 sacrebleu 包中完全复制的原始参考实现不同。主要问题是 BLEU 的参考实现使用了 NLTK 没有实现的非标准标记化规则。当前所有的机器翻译文献都使用 sacrebleu 报告 BLEU 分数。

使用 sacrebleu,您可以像这样获得句子级别的 BLEU:

import sacrebleu
bleu = sacrebleu.sentence_bleu("I am the walrus.",["I am the walrus."])

输出是一个元组,其中包含最终分数以及各个组件:n-gram 精度和简洁惩罚。