有一个测试句和一个参考句。如何编写一个Python脚本,以自动机器翻译评估中使用的BLEU度量标准来衡量这两个句子之间的相似性?
答案 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将是更好的方法。您可以计算两个句子向量之间的角余弦距离,以了解它们的相似性。
答案 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)