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分数。这些知识对于自然语言处理和机器翻译领域的评估工作非常重要。希望您在学习本教程的过程中收获满满,能够将这些技术应用到实际项目中!

bannerAds