在Python中计算BLEU分数

时间:2015-09-04 10:30:57

标签: python nltk

有一个测试句和一个参考句。如何编写一个Python脚本,以自动机器翻译评估中使用的BLEU度量标准来衡量这两个句子之间的相似性?

5 个答案:

答案 0 :(得分:12)

BLEU分数由两部分组成,修正精度和简洁惩罚。 详细信息可以在paper中看到。 您可以使用NLTK内的nltk.align.bleu_score模块。 一个代码示例如下所示:

import nltk

hypothesis = ['It', 'is', 'a', 'cat', 'at', 'room']
reference = ['It', 'is', 'a', 'cat', 'inside', 'the', 'room']
#there may be several references
BLEUscore = nltk.translate.bleu_score.sentence_bleu([reference], hypothesis)
print BLEUscore

请注意,默认的BLEU分数使用n = 4,其中包括4克的unigrams。如果您的句子小于4,则需要重置N值,否则将返回ZeroDivisionError: Fraction(0, 0)错误。 所以,你应该像这样重置重量:

import nltk

hypothesis = ["open", "the", "file"]
reference = ["open", "file"]
#the maximum is bigram, so assign the weight into 2 half.
BLEUscore = nltk.translate.bleu_score.sentence_bleu([reference], hypothesis, weights = (0.5, 0.5))
print BLEUscore

答案 1 :(得分:10)

您实际上是在询问两个不同的事物。我将尝试阐明每个问题。

第一部分:计算BLEU分数

您可以使用nltk下的BLEU模块计算BLEU分数。请参阅here

从那里,您可以轻松计算候选和参考句子之间的对齐分数。

第二部分:计算相似性

如果您的目标是根据参考句子测量相似度,我建议不要将BLEU分数用作第一候选人和第二候选人之间的相似性度量。

现在,让我详细说明一下。如果您计算候选人与参考的BLEU分数,那么这个分数只会帮助您理解另一个候选人BLEU分数与参考句之间的相似性,即使参考句仍然存在同样的。

如果您打算测量两个句子之间的相似性,word2vec将是更好的方法。您可以计算两个句子向量之间的角余弦距离,以了解它们的相似性。

要彻底了解 BLEU 指标的作用,我建议您阅读this以及this word2vec 相似度

答案 2 :(得分:3)

以下是计算两个文件之间Bleu得分的代码。

from nltk.translate.bleu_score import sentence_bleu
import argparse

def argparser():
    Argparser = argparse.ArgumentParser()
    Argparser.add_argument('--reference', type=str, default='summaries.txt', help='Reference File')
    Argparser.add_argument('--candidate', type=str, default='candidates.txt', help='Candidate file')

    args = Argparser.parse_args()
    return args

args = argparser()

reference = open(args.reference, 'r').readlines()
candidate = open(args.candidate, 'r').readlines()

if len(reference) != len(candidate):
    raise ValueError('The number of sentences in both files do not match.')

score = 0.

for i in range(len(reference)):
    score += sentence_bleu([reference[i].strip().split()], candidate[i].strip().split())

score /= len(reference)
print("The bleu score is: "+str(score))

使用命令python file_name.py --reference file1.txt --candidate file2.txt

答案 3 :(得分:2)

您可能想要使用python包SacréBLEU(仅限Python 3):

  

SacréBLEU提供可共享,可比较和可重现的BLEU分数的无障碍计算。   受Rico Sennrich的multi-bleu-detok.perl启发,它产生官方WMT分数,但使用纯文本。   它还知道所有标准测试集并为您处理下载,处理和标记化。

     

为什么要使用这个版本的BLEU?

     
      
  • 它会自动下载常用的WMT测试集并将其处理为纯文本
  •   
  • 它生成一个便于跨纸比较的短版本字符串
  •   
  • 使用WMT(Conference on Machine Translation)标准标记化
  • 正确计算去连接输出的分数   
  • 它产生与WMT使用的官方脚本(mteval-v13a.pl)相同的值
  •   
  • 它输出的BLEU分数不带逗号,因此您无需使用sed删除它(看着你,multi-bleu.perl
  •   

安装:pip install sacrebleu

答案 4 :(得分:0)

我可以展示一些示例,如果已知测试和参考句子,如何计算BLEU分数。

您甚至可以将两个句子都以字符串的形式输入并转换为列表。

from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'cat',"is","sitting","on","the","mat"]]
test = ["on",'the',"mat","is","a","cat"]
score = sentence_bleu(  reference, test)
print(score)


from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'cat',"is","sitting","on","the","mat"]]
test = ["there",'is',"cat","sitting","cat"]
score = sentence_bleu(  reference, test)
print(score)