赞
踩
paper: 《BLEU: a Method for Automatic Evaluation of Machine Translation》
Bleu 分数介于 0 和 1 之间。0.6 或 0.7 的分数被认为是您可以达到的最佳分数。即使是两个人也可能会为一个问题想出不同的句子变体,并且很少能达到完美匹配。出于这个原因,接近 1 的分数在实践中是不现实的,并且应该引发您的模型过度拟合的标志。
在我们了解如何计算 Bleu 分数之前,让我们先了解两个概念,即。N-gram 和精度。
“n-gram”实际上是常规文本处理中广泛使用的概念,并不特定于 NLP 或 Bleu Score。这只是描述“一个句子中的一组'n'个连续单词”的一种奇特方式。
例如,在句子“The ball is blue”中,我们可以有 n-gram,例如:
请注意,n-gram 中的单词是按顺序排列的,因此“blue is The ball”不是有效的 4-gram。
该指标衡量预测句子中也出现在目标句子中的单词数量。
假设我们有:
我们通常会使用以下公式计算精度:
Precision = 正确预测词数 / 总预测词数
Precision = 3 / 4
但是像这样使用 Precision 还不够好。有两种情况我们仍然需要处理。
第一个问题是这个公式允许我们作弊。我们可以预测一个句子:
并获得完美的精度 = 3 / 3 = 1
其次,正如我们已经讨论过的,有很多正确的方式来表达同一个句子。在许多 NLP 模型中,我们可能会得到多个可接受的目标句子来捕捉这些不同的变化。
我们使用修改后的 Precision 公式来解释这两种情况,我们将其称为“Clipped Precision”。
让我们通过一个例子来了解它是如何工作的。
假设我们有以下句子:
我们现在做两件不同的事情:
例如,“he”这个词在每个目标句中只出现一次。因此,即使“he”在预测句中出现三次,我们也将计数“剪裁”为 1,因为这是任何目标句中的最大计数。
Clipped Precision= 裁剪的正确预测词数 / 总预测词数
Clipped Precision = 3 / 6
注意:对于本文的其余部分,我们将仅使用“Precision”来表示“Clipped Precision”。
我们现在准备继续计算 Bleu 分数
假设我们有一个 NLP 模型,可以生成如下预测的句子。为简单起见,我们将只采用一个目标 句,但如上例所示,多个目标句的过程非常相似。
Precision 1-gram = Number of correct predicted 1-grams / Number of total predicted 1-grams
So, Precision 1-gram (p₁) = 5 / 8
Precision 2-gram = Number of correct predicted 2-grams / Number of total predicted 2-grams
Let’s look at all the 2-grams in our predicted sentence:
So, Precision 2-gram (p₂) = 4 / 7
Similarly, Precision 3-gram (p₃) = 3 / 6
Precision 3-gram (Image by Author)
And, Precision 4-gram (p₄) = 2 / 5
Precision 4-gram(Image by Author)
接下来,我们使用下面的公式组合这些精度分数。这可以针对不同的 N 值并使用不同的权重值来计算。通常,我们使用N = 4和统一权重wₙ = N / 4
第三步是计算“Brevity Penalty”。
如果您注意到 Precision 是如何计算的,我们可以输出一个由单个单词组成的预测句子,例如“The”或“late”。为此,1-gram Precision 应该是 1/1 = 1,表示满分。这显然具有误导性,因为它鼓励模型输出更少的单词并获得高分。
为了抵消这一点,简洁惩罚会惩罚太短的句子。
这确保了即使预测句子比目标长得多,Brevity Penalty 也不能大于 1。而且,如果你预测的词很少,这个值就会很小。
在这个例子中,c = 8 和 r = 8,这意味着简洁惩罚 = 1
最后,为了计算 Bleu 分数,我们将简洁罚分与精度分数的几何平均值相乘。
可以为不同的 N 值计算 Bleu 分数。通常,我们使用 N = 4。
如果您查看互联网上的不同资源,您可能还会遇到稍微不同的 Bleu Score 公式的编写方式,这在数学上是等效的。
在实践中,您很少需要自己实现 Bleu Score 算法。nltk 库是一个非常有用的 NLP 功能库,它 提供了 Bleu Score 的实现。
- from nltk.translate.bleu_score import corpus_bleu
- from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
- references = [['my', 'first', 'correct', 'sentence']]
- hypotheses = ['my', "first", "correct", 'sentence']
- score = sentence_bleu(references, hypotheses, smoothing_function=SmoothingFunction().method3)
- print(score)
Bleu Score 如此受欢迎的原因在于它有几个优点:
尽管它很受欢迎,但 Bleu Score 因其弱点而受到批评:
nltk文档:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。