欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BLEU 值简单测试工具

程序员文章站 2022-07-12 19:10:49
...

转载:

NLP机器翻译结果 bleu值_xiaoxueseng_NLP的博客-CSDN博客

 

一个简单测试Bleu值的工具,兼容了txt和word。

原博主代码公开的,可以自己更改兼容更多格式,很善良的在压缩包里留下了源码。

BLEU说明:

BLEU,全称为Bilingual Evaluation Understudy(双语评估替换),是一个比较候选文本翻译与其他一个或多个参考翻译的评价分数。

尽管BLEU一开始是为翻译工作而开发,但它也可以被用于评估文本的质量,这种文本是为一套自然语言处理任务而生成的。

参考网址:

https://cloud.tencent.com/developer/article/1042161

计算BLEU分数

Python自然语言工具包库(NLTK)提供了BLEU评分的实现,你可以使用它来评估生成的文本,通过与参考文本对比。

语句BLEU分数

NLTK提供了sentence_bleu()函数,用于根据一个或多个参考语句来评估候选语句。

参考语句必须作为语句列表来提供,其中每个语句是一个记号列表。候选语句作为一个记号列表被提供。例如:

from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)
print(score)

运行这个例子,会输出一个满分,因为候选语句完全匹配其中一个参考语句

1.0

语料库BLEU分数

NLTK还提供了一个称为corpus_bleu()的函数来计算多个句子(如段落或文档)的BLEU分数。

参考文本必须被指定为文档列表,其中每个文档是一个参考语句列表,并且每个可替换的参考语句也是记号列表,也就是说文档列表是记号列表的列表的列表。候选文档必须被指定为列表,其中每个文件是一个记号列表,也就是说候选文档是记号列表的列表。

这听起来有点令人困惑; 以下是一个文档的两个参考文档的例子。

# two references for one document
from nltk.translate.bleu_score import corpus_bleu
references = [[['this', 'is', 'a', 'test'], ['this', 'is' 'test']]]
candidates = [['this', 'is', 'a', 'test']]
score = corpus_bleu(references, candidates)
print(score)

运行这个例子就像之前一样输出满分

1.0

 

运行示例

在这一节中,我们试图通过一些例子来进一步获取对BLEU评分的直觉。

我们在语句层次上通过用下面的一条参考句子来说明:

the quick brown fox jumped over the lazy dog

首先,我们来看一个完美的分数。

# prefect match
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']
score = sentence_bleu(reference, candidate)
print(score)

运行例子输出一个完美匹配的分数。

1.0

接下来,让我们改变一个词,把“ quick ”改成“ fast ”。

# one word different
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['the', 'fast', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']
score = sentence_bleu(reference, candidate)
print(score)

结果是分数略有下降。

 0.7506238537503395

尝试改变两个词,把“ quick ”改成“ fast ”,把“ lazy ”改成“ sleepy ”。

# two words different
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['the', 'fast', 'brown', 'fox', 'jumped', 'over', 'the', 'sleepy', 'dog']
score = sentence_bleu(reference, candidate)
print(score)

运行这个例子,我们可以看到得分线性下降。

0.4854917717073234

如果候选语句的所有单词与参考语句的都不一样呢?

# all words different
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
score = sentence_bleu(reference, candidate)
print(score)

我们得到了一个更糟糕的分数。

0.0

现在,让我们尝试一个比参考语句的词汇更少(例如,放弃最后两个词)的候选语句,但这些单词都是正确的。

# shorter candidate
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the']
score = sentence_bleu(reference, candidate)
print(score)

结果和之前的有两个单词错误的情况很相似。

0.7514772930752859

如果我们把候选语句调整为比参考语句多两个单词,那又会怎么样?

# longer candidate
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog', 'from', 'space']
score = sentence_bleu(reference, candidate)
print(score)

再一次,我们可以看到,我们的直觉是成立的,得分还是有点像“ 有两个错字 ”的情况。

  0.7860753021519787 

最后,我们来比较一个很短的候选语句:只有两个单词的长度。

# very short
from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']]
candidate = ['the', 'quick']
score = sentence_bleu(reference, candidate)
print(score)

运行此示例首先会打印一条警告消息,指出不能执行评估3元组及以上部分(直到4元组)。这是合乎情理的,因为在候选语句中我们最多只能用2元组来运行。

UserWarning:
Corpus/Sentence contains 0 counts of 3-gram overlaps.
BLEU scores might be undesirable; use SmoothingFunction().
  warnings.warn(_msg)

接下来,我们会得到一个非常低的分数。

0.0301973834223185

你可以继续用这些例子来进行其他试验。

BLEU包含的数学知识非常简单,我也鼓励你阅读这篇论文,并在自己电子表格程序中探索计算语句评估分数的方法。