Python计算BLEU分数完全指南:NLP模型评估教程
在Python中,BLEU分数是一种用于衡量机器翻译模型优劣的指标。尽管最初它只设计用于翻译模型,但现在它也被用于其他自然语言处理应用。
BLEU分数是将一个句子与一个或多个参考句子进行比较,告诉我们候选句子与参考句子列表的匹配程度。它给出一个介于0到1之间的分数。
BLEU得分为1表示候选句子与参考句子中的一个完全匹配。
这个分数是对图像描述模型常见的度量方法。
在本教程中,我们将使用nltk库中的sentence_bleu()函数。让我们开始吧。
在Python中计算BLEU分数
为了计算BLEU分数,我们需要以标记(token)的形式提供参考句子和候选句子。
在本节中,我们将学习如何做到这一点并计算得分。让我们从导入必要的模块开始。
from nltk.translate.bleu_score import sentence_bleu
现在我们可以以列表形式输入参考句子。在将句子传递到sentence_bleu()函数之前,还需要将其转换为标记。
1. 输入并拆分句子
我们的参考文献清单中的句子为:
'this is a dog'
'it is dog'
'dog it is'
'a dog, it is'
我们可以使用分割函数将它们分成几个片段。
reference = [
'this is a dog'.split(),
'it is dog'.split(),
'dog it is'.split(),
'a dog, it is'.split()
]
print(reference)
输出:
[['this', 'is', 'a', 'dog'], ['it', 'is', 'dog'], ['dog', 'it', 'is'], ['a', 'dog,', 'it', 'is']]
这是句子以标记形式的样子。现在我们可以调用sentence_bleu()函数来计算得分。
2. 在Python中计算BLEU分数
使用下面的代码来计算分数。
candidate = 'it is dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate)))
输出:
BLEU score -> 1.0
我们给这句话打出了满分1分,因为候选句子属于参考集合。我们再试一句。
candidate = 'it is a dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate)))
输出:
BLEU score -> 0.8408964152537145
我们在参考集中有这个句子,但它并不完全匹配。这就是为什么我们得到了0.84分的原因。
3. Python完整代码用于实现BLEU分数
4. 计算BLEU分数的n-gram得分
以下是计算BLEU分数的完整代码示例:
from nltk.translate.bleu_score import sentence_bleu
reference = [
'this is a dog'.split(),
'it is dog'.split(),
'dog it is'.split(),
'a dog, it is'.split()
]
candidate = 'it is dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate )))
candidate = 'it is a dog'.split()
print('BLEU score -> {}'.format(sentence_bleu(reference, candidate)))
在匹配句子时,您可以选择模型一次匹配的词语数量。例如,您可以选择一次匹配一个词语(1-gram)。或者,您也可以选择一次匹配词语对(2-gram)或三个词语(3-gram)。
在本节中,我们将学习如何计算这些n-gram分数。
在sentence_bleu()函数中,您可以传递一个参数,其中包含与各个n-gram对应的权重。
例如,要单独计算n-gram分数,您可以使用以下权重。
单个1-gram: (1, 0, 0, 0)
单个2-gram: (0, 1, 0, 0).
单个3-gram: (0, 0, 1, 0).
单个4-gram: (0, 0, 0, 1).
以下是对应的Python代码:
from nltk.translate.bleu_score import sentence_bleu
reference = [
'this is a dog'.split(),
'it is dog'.split(),
'dog it is'.split(),
'a dog, it is'.split()
]
candidate = 'it is a dog'.split()
print('单个1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
print('单个2-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 1, 0, 0)))
print('单个3-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 1, 0)))
print('单个4-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 0, 1)))
输出结果:
单个1-gram: 1.000000
单个2-gram: 1.000000
单个3-gram: 0.500000
单个4-gram: 1.000000
默认情况下,sentence_bleu()函数计算累积4-gram BLEU分数,也称为BLEU-4。BLEU-4的权重如下所示。
(0.25, 0.25, 0.25, 0.25)
我们来看一下BLEU-4的代码:
score = sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25))
print(score)
输出结果:
0.8408964152537145
这就是我们没有指定n-gram权重时得到的准确分数。
结论
本教程详细介绍了如何在Python中计算BLEU分数(双语评估替换分数)。我们学习了BLEU分数的基本概念,以及如何计算单个n元语法(n-gram)和累积的n元语法BLEU分数。这些知识对于自然语言处理和机器翻译领域的评估工作非常重要。希望您在学习本教程的过程中收获满满,能够将这些技术应用到实际项目中!