精华内容
下载资源
问答
  • bleu值计算工具下载和python源代码 机器翻译评测——BLEU算法详解 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分。而机器翻译评价对于机器翻译的...
  • SacreBLEU( )提供了可共享,可比较和可再现的BLEU分数的轻松计算。 受Rico Sennrich的multi-bleu-detok.perl ,它可以产生官方的WMT分数,但可以使用纯文本。 它还了解所有标准测试集,并为您处理下载,处理和标记...
  • bleu-开源

    2021-05-09 03:52:40
    BLEU项目是使用C ++,OGRE,RBGUI和OIS创建的。 显然,代码结构并不是最理想的构想,但是在编写它时,我很难受时间的困扰。 如果我今天写它,那将是完全不同的。 正如您在我的GPE文档中看到的那样,我不再那么自由地...
  • Bleu值计算工具

    2018-09-09 15:05:15
    用于Bleu值计算.
  • BLEU算法的python实现

    2018-07-03 17:14:27
    利用python的collect包从底层实现了机器翻译、问答系统中常见的BLEU算法。
  • bleu4-源码

    2021-03-09 15:28:50
    集成了几种常用的bleu4计算方法,包括:CodeBert BLEU,Google BLEU,nltk BLEU组件以及文章《基于变压器的源代码汇总方法》中的bleu实现方法。 tbcs-bleu的代码源自于 ,是文章《基于变压器的源代码汇总方法》的...
  • 格瓦瓦尔 计算Bleu,METEOR和ROUGE分数
  • 机器翻译评估标准中BLUE测度指标的实现,实现语言为python。
  • bleu2vec 修改后的BLEU得分。 使用word2vec相似性而不是一对一相似性。 如何使用 用法很简单: 项目文件夹结构 wmt17-metrics-task / wmy17-submitted-data / txt /,在txt文件夹中有引用,源和系统输出。 然后,...
  • BLEU_C++.7z

    2020-09-09 10:57:26
    BLEU C++实现, 一个算法类,一个main的实现。在调用算法前,需增加candidate 和reference,可以增加多个reference..
  • 机器翻译评价指标BLEU介绍

    万次阅读 多人点赞 2019-08-28 11:15:37
    最近需要设计一个机器翻译相关的试验, 其中好多东西都不同, 先从...BLEU (其全称为Bilingual Evaluation Understudy), 其意思是双语评估替补。所谓Understudy (替补),意思是代替人进行翻译结果的评估。尽管这项指标...

    最近需要设计一个机器翻译相关的试验, 其中好多东西都不同, 先从基础的评价指标来吧. 本文翻译自Jason Brownlee的博客[1]. 可能会简化一部分内容, 如有需要请读者直接读原文.

    0. 前言

    BLEU (其全称为Bilingual Evaluation Understudy), 其意思是双语评估替补。所谓Understudy (替补),意思是代替人进行翻译结果的评估。尽管这项指标是为翻译而发明的,但它可以用于评估一组自然语言处理任务生成的文本。

    本教程中, 你将会学会使用Python中的NLTK库来对待评估的文本求BLEU得分. 在本教程结束之后, 你应该知道:

    • 对BLEU的简单介绍以及其计算方式的直觉介绍.
    • 如何使用Python中的NLTK库来计算BLEU值.
    • 利用 待选文本(candidate text)参考文本(reference text) 的差异来分析其对BLEU值的影响.

    让我们开始吧~

    1. 概述

    本教程分为4个部分:

    • ① BLEU
    • ② 计算BLEU的得分
    • ③ 累积和单独的BLEU分数 (Cumulative and Individual BLEU Scores)
    • ④ 例子

    2. Bilingual Evaluation Understudy: BLEU

    在自然语言处理中的机器翻译任务中, BLEU非常常见, 它是用于评估模型生成的句子(candidate)实际句子(reference)的差异的指标.
    它的取值范围在0.0到1.0之间, 如果两个句子完美匹配(perfect match), 那么BLEU是1.0, 反之, 如果两个句子完美不匹配(perfect mismatch), 那么BLEU为0.0.
    虽然这个指标不够完美, 但是它有5个非常引人注目的好处(compelling benefits):

    • 计算代价小, 快.
    • 容易理解.
    • 与语言无关(这意味着你可以使用全世界任意的语言来测试).
    • 与人类评价结果高度相关.
    • 被学术界和工业界广泛采用.

    BLEU值是2002年由IBM 科学家 Kishore Papineni在其论文[2]中提出的: “BLEU: a Method for Automatic Evaluation of Machine Translation“.

    BLEU方法的实现是分别计算candidate句reference句N-grams模型[3], 然后统计其匹配的个数来计算得到的. 显然, 这种比较方法, 是与语序无关的.

    论文对匹配的 N-grams 计数进行了修改,以确保它考虑到reference文本中单词的出现,而非奖励生成大量合理翻译单词的候选结果。本文将其称为修正的 N-grams 精度。

    此外, 有一种改进版的通过normalize N-grams的改进版BLEU. 其目的是提升对多个句子组成的**块(block)**提升翻译效果.
    在实践中得到完美的分数是不太可能的,因为翻译结果必须与reference句完全匹配。甚至人工翻译都不可能做到这一点。而且, 由于不同的数据集reference句的质量和数量不同, 所以跨数据集计算BLEU值可能带来一些麻烦.

    对机器翻译来说, 我们可以使用BLEU得分来评价其它的语言生成任务, 比如:

    • 语言生成.
    • 图像标题生成.
    • 文本总结.
    • 语音识别.

    及其它.

    3. 计算BLEU得分

    Python自然语言工具包库: NLTK, 提供了BLEU得分计算的实现, 所以如果你只是像译者一样使用的话, 可以先不去了解其内部的实现.

    3.1 句子的BLEU值

    NLTK提供了sentence_bleu()来评估一组candidate句reference句的BLEU得分情况. 其中, 这两个句子都必须用一系列tokens表示:

    注: 这个reference的形式有点像图像检索里面的图像gallery.

    >>> 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
    

    这个例子的结果为1.0, 因为candidate与reference的第1个句子perfect match了.

    3.2 Corpus(语料库)的BLEU值

    NLTK同样提供了corpus_bleu()函数, 它用于来对多个句子比如一个段落甚至一篇文章进行得分评价.

    参考句必须由一系列documents组成, 每个document都应该由一系列references组成, 同样的, 每个句子都应该拆分为一个个token. 如下, 其实比上一部分多了一个维度.

    可能上面的解释还是容易让人困惑, 下面是一篇文档的2个参考句的示例(我的理解: 比Sentence的都多加了一个维度):

    # 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
    

    4. 累积BLEU和独立BLEU

    在NLTK中, 其允许用户显式指定不同的N-grams的权重以便来计算BLEU的值. 这使得用户可以灵活的计算不同类型的BLEU值, 比如独立的BLEU或者累积的BLEU.

    4.1 独立N-Gram得分

    一个独立的N-gram得分是对gram是否按特定顺序排列的评估方式, 比如1-gram和2-gram (2-gram又成为bigram)[3]:

    # 1-gram individual BLEU
    >>> from nltk.translate.bleu_score import sentence_bleu
    >>> reference = [['this', 'is', 'small', 'test']]
    >>> candidate = ['this', 'is', 'a', 'test']
    >>> score = sentence_bleu(reference, candidate, weights=(1, 0, 0, 0))
    >>> print(score)
    
    0.75
    
    >>> candidate = ['this', 'test', 'is', 'a']
    >>> score = sentence_bleu(reference, candidate, weights=(1, 0, 0, 0))
    >>> score
    0.75
    
    

    可以看到, 1-gram有3/4个词完全对应上, 所以得分为0.75, 那么如果我们试试把candidate的顺序打乱呢? 结果仍为0.75~

    下面, 作者测试了1-4gram如下:

    >>> from nltk.translate.bleu_score import sentence_bleu
    >>> reference = [['this', 'is', 'a', 'test']]
    >>> candidate = ['this', 'is', 'a', 'test']
    >>> print('Individual 1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
    >>> print('Individual 2-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 1, 0, 0)))
    >>> print('Individual 3-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 1, 0)))
    >>> print('Individual 4-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 0, 1)))
    
    
    Individual 1-gram: 1.000000
    Individual 2-gram: 1.000000
    Individual 3-gram: 1.000000
    Individual 4-gram: 1.000000
    

    尽管我们可以计算独立的BLEU值, 但是这种方式不是常规使用的方式, 而且独立BLEU值的含义也比较有限. 因此, 下面我们引出累积BLEU值.

    4.2 累积N-Gram得分

    累积N-Gram得分指的是为各个gram对应的权重加权, 来计算得到一个加权几何平均(weighted geometric mean). 默认情况下, sentence_bleu()corpus_bleu()都是计算累积的4-gram BLEU分数的, 也称之为BLEU-4.
    BLEU-4的加权策略如下: 1/4 (25%) 或者 0.25 对 1-gram, 2-gram, 3-gram and 4-gram 的得分.

    # 4-gram cumulative BLEU
    >>> from nltk.translate.bleu_score import sentence_bleu
    >>> reference = [['this', 'is', 'small', 'test']]
    >>> candidate = ['this', 'is', 'a', 'test']
    >>> score = sentence_bleu(reference, candidate)
    >>> score
    1.0547686614863434e-154
    >>> score = sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25))
    >>> score
    1.0547686614863434e-154
    

    下面, 我们分别计算从BLEU-1到BLEU-4的累积N-Gram得分:

    >>> print('Cumulative 1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
    Cumulative 1-gram: 0.750000
    >>> print('Cumulative 2-gram: %f' % sentence_bleu(reference, candidate, weights=(0.5, 0.5, 0, 0)))
    Cumulative 2-gram: 0.500000
    >>> print('Cumulative 3-gram: %f' % sentence_bleu(reference, candidate, weights=(0.33, 0.33, 0.33, 0)))
    Cumulative 3-gram: 0.000000
    >>> print('Cumulative 4-gram: %f' % sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25)))
    Cumulative 4-gram: 0.000000
    
    

    通常情况下, 我们会统计BLEU1BLEU4的累积值作为评估 文本生成系统(text generation system) 的效果.

    5. 样例

    本部分, 我们将对BLEU值的设计develop further intuition(通过一些例子), 以一个单句的例子为例:

    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
    ...
    >>> candidate = ['the', 'fast', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']
    >>> score = sentence_bleu(reference, candidate)
    >>> print(score)
     	
    0.7506238537503395
    

    接着在此基础上再改一个单词, 把lazy 改成 sleepy

    # two words different
    ...
    >>> candidate = ['the', 'fast', 'brown', 'fox', 'jumped', 'over', 'the', 'sleepy', 'dog']
    >>> score = sentence_bleu(reference, candidate)
    >>> print(score)
     	
    0.4854917717073234
    

    可以看到, BLEU值出现了下降, 因为match的对越来越少了. 现在, 我们可以试试这种形式: 将candidate句变短, 再跟reference进行比较

    # 删除candidate句子最后两个单词, 即让candidate变短
    ...
    >>> candidate = ['the', 'fast', 'brown', 'fox', 'jumped', 'over', 'the']
    >>> score = sentence_bleu(reference, candidate)
    >>> print(score)
    
    0.7514772930752859
    

    那么, 如果 将candidate句变长, 再跟reference进行比较呢?

    ...
    >>> candidate = ['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog', 'from', 'space']
    >>> score = sentence_bleu(reference, candidate)
    >>> print(score)
    
    0.7860753021519787
    

    我们可以看到, 分数反而越来越高啦~, BLEU中的数学理论[2, 4]是相当简单的,我也鼓励你阅读这篇论文,并探索自己在电子表格中计算句子水平分数。

    6. 总结

    在本教程中, 你会了解到BLEU的使用和得到一些基本的intuition关于其设计思路, 通过学习, 如下3点你应该掌握:

    • ① A gentle introduction to the BLEU score and an intuition for what is being calculated.
    • ② How you can calculate BLEU scores in Python using the NLTK library for sentences and documents.
    • ③ How to can use a suite of small examples to develop an intuition for how differences between a candidate and reference text impact the final BLEU score.

    参考资料

    [1] A Gentle Introduction to Calculating the BLEU Score for Text in Python
    [2] BLEU: a Method for Automatic Evaluation of Machine Translation
    [3] 蕉叉熵: N-grams说明
    [4] BLEU 维基百科

    展开全文
  • 来源:Coursera吴恩达深度学习课程 机器翻译(machine translation)的一大难题是一个... 常见的解决办法是,通过一个叫做BLEU得分(the BLEU score)的东西来解决。接着让我们了解BLEU得分是怎样工作的。 假如有一

    来源:Coursera吴恩达深度学习课程

    机器翻译(machine translation)的一大难题是一个法语句子可以有多种英文翻译而且都同样好,所以当有多个同样好的答案时,怎样评估一个机器翻译系统呢?图像识别(image recognition)只有一个正确答案,测量准确性(measure accuracy)就可以。如果有多个不错的答案,要怎样衡量准确性呢? 常见的解决办法是,通过一个叫做BLEU得分(the BLEU score)的东西来解决。接着让我们了解BLEU得分是怎样工作的。

    假如有一个法语句子(French sentence):Le chat est sur le tapis,然后这个句子的人工翻译为:The cat is on the mat。不同的人,也许会翻译为:There is a cat on the mat,实际上这两个都准确地翻译了这个法语句子。BLEU得分做的就是,给定一个机器生成的翻译,它能够自动地计算一个分数来衡量机器翻译的好坏。直觉表明只要机器生成的翻译与任何一个人工翻译的结果足够接近,那么它就会得到一个高的BLEU分数。BLEU代表bilingual evaluation understudy (双语评估替补)。在戏剧界,侯补演员(understudy)学习资深的演员的角色,这样在必要的时候,他们就能够接替这些资深演员。而BLEU的初衷是相对于请评估员(ask human evaluators),人工评估机器翻译系统(the machine translation system),BLEU得分就相当于一个侯补者,它可以代替人类来评估机器翻译的每一个输出结果。

    BLEU得分是由Kishore Papineni, Salim Roukos,Todd Ward和Wei-Jing Zhu发表的这篇论文十分有影响力并且实际上也是一篇很好读的文章(a readable paper):BLEU: a Method for Automatic Evaluation of Machine Translation。有时间的话,推荐阅读。

    BLEU得分背后的理念(intuition)是观察机器生成的翻译,然后看生成的词是否出现在上一个人工翻译参考之中。因此这些人工翻译的参考会包含在开发集或是测试集中。

    现在,如上图,我们看一个极端的例子(example)。机器翻译MT(machine translation)的输出是:the the the the the the the。这显然是一个十分糟糕的翻译。衡量机器翻译输出质量的方法之一是观察输出结果的每一个词看其是否出现在参考中,这称为机器翻译的精确度( precision of the machine translation output)。这个情况下,机器翻译输出了七个单词并且这七个词中的每一个都出现在了参考1或是参考2。单词the在两个参考中都出现了,所以看上去每个词都是很合理的。因此这个输出的精确度就是7/7,看起来是一个极好的精确度。(实际上并不好,接下来有一个改良版本。)这就是为什么把出现在参考中的词在MT输出的所有词中所占的比例作为精确度评估标准并不是很有用的原因。因为它似乎意味着,例子中MT输出的翻译有很高的精确度,因此取而代之的是我们要用的这个改良后的精确度评估方法,我们把每一个单词的记分上限定为它在参考句子中出现的最多次数。在参考1中,单词the出现了两次,在参考2中,单词the只出现了一次。而2比1大,所以我们会说,单词the的得分上限为2。有了这个改良后的精确度,我们就说,这个输出句子的得分为2/7,因为在7个词中,我们最多只能给它2分。所以分母(denominator)就是7个词中单词the总共出现的次数,而分子(numerator)就是单词the出现的计数。我们在达到上限时截断计数,这就是改良后的精确度评估(the modified precision measure)

    到目前为止,我们只关注单独的单词,在BLEU得分中,我们也考虑成对的单词,因此定义一下二元词组(bigrams)的BLEU得分

    bigram的意思就是相邻的两个单词。现在我们来看看怎样用二元词组来定义BLEU得分,并且这仅仅只是最终的BLEU得分的一部分。我们会考虑一元词组(unigrams)也就是单个单词以及二元词组(bigrams),即成对的词,同时也许会有更长的单词序列,比如说三元词组(trigrams),意思是三个挨在一起的词。我们继续刚才的例子,还是参考1和2,现在我们假定机器翻译输出了稍微好一点的翻译:The cat the cat on the mat,仍然不是一个好的翻译,不过也许比上一个好一些。这里,可能的二元词组有the cat ,忽略大小写,接着是cat the, 这是另一个二元词组,然后又是the cat。不过我们已经有了,所以跳过它,然后下一个是cat on,然后是on the,再然后是the mat。所以这些就是机器翻译中的二元词组。好,我们来数一数每个二元词组出现了多少次。the cat出现了两次 ,剩下的都只出现了一次。

    最后 ,我们来定义一下截取计数(the clipped count),即Count_clip。为了定义它,我们以给算法设置得分上限(limit),上限值为二元词组出现在参考1或2中的最大次数。①the cat在两个参考中最多出现一次(注意是在两个参考中取max),所以将截取它的计数为1。②cat the它并没有出现在参考1和参考2中,所以将它截取为0。③cat on出现了一次,我们就记1分。④on the出现一次就记1分,⑤the mat出现了一次,所以这就是截取完的计数(the clipped counts)。我们把所有的这些计数都截取了一遍,实际上就是将它们降低使之不大于二元词组出现在参考中的次数。最后,修改后的二元词组的精确度就是count_clip之和。那就是4除以二元词组的总个数6,因此4/6也就是2/3为二元词组改良后的精确度。

    如上图,我们将它公式化。我们将改良后的一元词组精确度定义为P_1,P代表的是精确度(precision)。这里的下标1的意思是一元词组。它定义为一元词组之和,即对机器翻译结果中所有单词求和,MT 输出就是y-帽,Count_clip(unigram),再除以机器翻译输出中的一元词组出现次数之和。因此这个就是最终结果应该是两页幻灯片前得到的2/7(??这里没有看懂,我理解的是5/7,算出来的小伙伴麻烦评论区留言呀)。这里的1指代的是一元词组,意思是考虑单独的词,同样定义P_n为n元词组精确度,用n-gram替代掉一元词组。定义就是机器翻译输出中的n元词组的count_clip之和除以n元词组的出现次数之和。因此这些精确度或说是这些改良后的精确度得分评估的是一元词组、二元词组或者是三元词组,甚至是n取更大数值的n元词组。这个方法都能够衡量机器翻译输出中与参考相似重复的程度。另外,你能够确信如果机器翻译输出与参考1或是参考2完全一致的话,那么所有的这些P_1、P_2等等的值,都会等于1.0(不考虑词组的顺序吗?多元词组是不是隐含了顺序)。为了得到改良后的1.0的精确度,只要你的输出与参考之一完全相同就能满足,不过有时即使输出结果并不完全与参考相同,这也是有可能实现的。

    最后,我们将这些组合一下来构成最终的BLEU得分。P_n就是n元词组这一项的BLEU得分,即计算出的n元词组改良后的精确度,按照惯例,将P_1,P_2,P_3,P_4等用这个公式组合在一起,取平均值(mean)BLEU得分被定义为:

    对这个线性运算进行乘方运算,乘方(exponentiation)是严格单调递增的运算(strictly monotonically increasing operation),实际上会用一个叫做BP的惩罚因子(the BP penalty)来调整这项。BP的意思是“简短惩罚”(brevity penalty)。事实表明,输出一个非常短的翻译更容易得到高精确度。因为输出的大部分词可能都出现在参考之中,不过我们并不想要特别短的翻译结果。因此简短惩罚(BP)就是一个调整因子(an adjustment factor),它能够惩罚输出了太短翻译结果的翻译系统。BP的公式如上图所示。如果你的机器翻译系统实际上输出了比人工翻译结果更长的翻译,那么它就等于1,其他情况下就是像这样的公式,惩罚所有更短的翻译,细节部分看这篇论文。

    拥有单一实数评估指标(a single real number evaluation metric)的很重要,因为它能够让你尝试两种想法,然后看一下哪个得分更高,尽量选择得分更高的那个,BLEU得分对于机器翻译来说,具有革命性的(revolution)原因是因为它有一个相当不错的虽然不是完美的但是非常好的单一实数评估指标(a single real number evaluation index),因此它加快了整个机器翻译领域的进程,实践中,很少人会从零实现一个BLEU得分(implement a BLEU score from scratch),有很多开源的(open)实现结果,可以下载下来然后直接用来评估系统。不过今天,BLEU得分被用来评估许多生成文本的系统(systems that generate text),比如说机器翻译系统(machine translation systems),也有图像描述系统(image captioning systems)。你会用神经网络来生成图像描述,然后使用BLEU得分来看一下,结果在多大程度上与参考描述或是多个人工完成的参考描述内容相符。BLEU得分是一个有用的单一实数评估指标,用于评估生成文本的算法,判断输出的结果是否与人工写出的参考文本的含义相似不过它并没有用于语音识别(speech recognition)。因为在语音识别当中,通常只有一个答案,你可以用其他的评估方法,来看一下你的语音识别结果,是否十分相近或是字字正确(pretty much, exactly word for word correct)。

    说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

    展开全文
  • 理解bleu

    2019-09-26 20:44:15
    bleu全称为Bilingual Evaluation Understudy(双语评估替换),是2002年提出的用于评估机器翻译效果的一种方法,这种方法简单朴素、短平快、易于理解。因为其效果还算说得过去,因此被广泛迁移到自然语言处理的各种...

    bleu全称为Bilingual Evaluation Understudy(双语评估替换),是2002年提出的用于评估机器翻译效果的一种方法,这种方法简单朴素、短平快、易于理解。因为其效果还算说得过去,因此被广泛迁移到自然语言处理的各种评估任务中。这种方法可以说是:山上无老虎,猴子称大王。时无英雄遂使竖子成名。蜀中无大将,廖化做先锋。

    问题描述

    首先,对bleu算法建立一个直观的印象。
    有两类问题:
    1、给定一个句子和一个候选句子集,求bleu值,此问题称为sentence_bleu
    2、给定一堆句子和一堆候选句子集,求bleu值,此问题称为corpus_bleu

    机器翻译得到的句子称为candidate,候选句子集称为references。
    计算方式就是计算candidate和references的公共部分。公共部分越多,说明翻译结果越好。

    给定一个句子和一个候选句子集计算bleu值

    bleu考虑1,2,3,4共4个n-gram,可以给每个n-gram指定权重。

    对于n-gram:

    • 对candidate和references分别分词(n-gram分词)
    • 统计candidate和references中每个word的出现频次
    • 对于candidate中的每个word,它的出现频次不能大于references中最大出现频次
      这一步是为了整治形如the the the the the这样的candidate,因为the在candidate中出现次数太多了,导致分值为1。为了限制这种不正常的candidate,使用正常的references加以约束。
    • candidate中每个word的出现频次之和除以总的word数,即为得分score
    • score乘以句子长度惩罚因子即为最终的bleu分数
      这一步是为了整治短句子,比如candidate只有一个词:the,并且the在references中出现过,这就导致得分为1。也就是说,有些人因为怕说错而保持沉默。

    bleu的发展不是一蹴而就的,很多人为了修正bleu,不断发现bleu的漏洞并提出解决方案。从bleu的发展历程上,我们可以学到如何设计规则整治badcase。

    最后,对于1-gram,2-gram,3-gram的组合,应该采用几何平均,也就是s1^w1*s2^2*s3^w3,而不是算术平均w1*s1+w2*s2+w3*s3

    from collections import Counter
    
    import numpy as np
    from nltk.translate import bleu_score
    
    
    def bp(references, candidate):
        # brevity penality,句子长度惩罚因子
        ind = np.argmin([abs(len(i) - len(candidate)) for i in references])
        if len(references[ind]) < len(candidate):
            return 1
        scale = 1 - (len(candidate) / len(references[ind]))
        return np.e ** scale
    
    
    def parse_ngram(sentence, gram):
        # 把一个句子分成n-gram
        return [sentence[i:i + gram] for i in range(len(sentence) - gram + 1)]  # 此处一定要注意+1,否则会少一个gram
    
    
    def sentence_bleu(references, candidate, weight):
        bp_value = bp(references, candidate)
        s = 1
        for gram, wei in enumerate(weight):
            gram = gram + 1
            # 拆分n-gram
            ref = [parse_ngram(i, gram) for i in references]
            can = parse_ngram(candidate, gram)
            # 统计n-gram出现次数
            ref_counter = [Counter(i) for i in ref]
            can_counter = Counter(can)
            # 统计每个词在references中的出现次数
            appear = sum(min(cnt, max(i.get(word, 0) for i in ref_counter)) for word, cnt in can_counter.items())
            score = appear / len(can)
            # 每个score的权值不一样
            s *= score ** wei
        s *= bp_value  # 最后的分数需要乘以惩罚因子
        return s
    
    
    references = [
        "the dog jumps high",
        "the cat runs fast",
        "dog and cats are good friends"
    ]
    candidate = "the d o g  jump s hig"
    weights = [0.25, 0.25, 0.25, 0.25]
    print(sentence_bleu(references, candidate, weights))
    print(bleu_score.sentence_bleu(references, candidate, weights))
    

    一个corpus是由多个sentence组成的,计算corpus_bleu并非求sentence_bleu的均值,而是一种略微复杂的计算方式,可以说是没什么道理的狂想曲。

    corpus_bleu

    一个文档包含3个句子,句子的分值分别为a1/b1,a2/b2,a3/b3。
    那么全部句子的分值为:(a1+a2+a3)/(b1+b2+b3)

    惩罚因子也是一样:三个句子的长度分别为l1,l2,l3,对应的最接近的reference分别为k1,k2,k3。那么相当于bp(l1+l2+l3,k1+k2+k3)。

    也就是说:对于corpus_bleu不是单纯地对sentence_bleu求均值,而是基于更统一的一种方法。

    from collections import Counter
    
    import numpy as np
    from nltk.translate import bleu_score
    
    
    def bp(references_len, candidate_len):
        if references_len < candidate_len:
            return 1
        scale = 1 - (candidate_len / references_len)
        return np.e ** scale
    
    
    def parse_ngram(sentence, gram):
        return [sentence[i:i + gram] for i in range(len(sentence) - gram + 1)]
    
    
    def corpus_bleu(references_list, candidate_list, weights):
        candidate_len = sum(len(i) for i in candidate_list)
        reference_len = 0
        for candidate, references in zip(candidate_list, references_list):
            ind = np.argmin([abs(len(i) - len(candidate)) for i in references])
            reference_len += len(references[ind])
        s = 1
        for index, wei in enumerate(weights):
            up = 0  # 分子
            down = 0  # 分母
            gram = index + 1
            for candidate, references in zip(candidate_list, references_list):
                # 拆分n-gram
                ref = [parse_ngram(i, gram) for i in references]
                can = parse_ngram(candidate, gram)
                # 统计n-gram出现次数
                ref_counter = [Counter(i) for i in ref]
                can_counter = Counter(can)
                # 统计每个词在references中的出现次数
                appear = sum(min(cnt, max(i.get(word, 0) for i in ref_counter)) for word, cnt in can_counter.items())
                up += appear 
                down += len(can) 
            s *= (up / down) ** wei
        return bp(reference_len, candidate_len) * s
    
    
    references = [
        [
            "the dog jumps high",
            "the cat runs fast",
            "dog and cats are good friends"],
        [
            "ba ga ya",
            "lu ha a df",
        ]
    ]
    candidate = ["the d o g  jump s hig", 'it is too bad']
    weights = [0.25, 0.25, 0.25, 0.25]
    print(corpus_bleu(references, candidate, weights))
    print(bleu_score.corpus_bleu(references, candidate, weights))
    

    如果你用的NLTK版本是3.2,发布时间是2016年3月份,那么计算corpus_bleu时有一处bug。NLTK在2016年10月份已经修复了此处bug。对于句子分值的求和,NLTK代码中是使用Fraction,Fraction会自动对分子和分母进行化简,导致求和的时候计算错误。

    简化代码

    在计算sentence_bleu和corpus_bleu过程中,许多步骤都是相似的、可以合并的。精简后的代码如下:

    from collections import Counter
    
    import numpy as np
    from nltk.translate import bleu_score
    
    
    def bp(references_len, candidate_len):
        return np.e ** (1 - (candidate_len / references_len)) if references_len > candidate_len else 1
    
    
    def nearest_len(references, candidate):
        return len(references[np.argmin([abs(len(i) - len(candidate)) for i in references])])
    
    
    def parse_ngram(sentence, gram):
        return [sentence[i:i + gram] for i in range(len(sentence) - gram + 1)]
    
    
    def appear_count(references, candidate, gram):
        ref = [parse_ngram(i, gram) for i in references]
        can = parse_ngram(candidate, gram)
        # 统计n-gram出现次数
        ref_counter = [Counter(i) for i in ref]
        can_counter = Counter(can)
        # 统计每个词在references中的出现次数
        appear = sum(min(cnt, max(i.get(word, 0) for i in ref_counter)) for word, cnt in can_counter.items())
        return appear, len(can)
    
    
    def corpus_bleu(references_list, candidate_list, weights):
        candidate_len = sum(len(i) for i in candidate_list)
        reference_len = sum(nearest_len(references, candidate) for candidate, references in zip(candidate_list, references_list))
        bp_value = bp(reference_len, candidate_len)
        s = 1
        for index, wei in enumerate(weights):
            up = 0  # 分子
            down = 0  # 分母
            gram = index + 1
            for candidate, references in zip(candidate_list, references_list):
                appear, total = appear_count(references, candidate, gram)
                up += appear 
                down += total 
            s *= (up / down) ** wei
        return bp_value * s
    
    
    def sentence_bleu(references, candidate, weight):
        bp_value = bp(nearest_len(references, candidate), len(candidate))
        s = 1
        for gram, wei in enumerate(weight):
            gram = gram + 1
            appear, total = appear_count(references, candidate, gram)
            score = appear / total
            # 每个score的权值不一样
            s *= score ** wei
        # 最后的分数需要乘以惩罚因子
        return s * bp_value
    
    
    if __name__ == '__main__':
        references = [
            [
                "the dog jumps high",
                "the cat runs fast",
                "dog and cats are good friends"],
            [
                "ba ga ya",
                "lu ha a df",
            ]
        ]
        candidate = ["the d o g  jump s hig", 'it is too bad']
        weights = [0.25, 0.25, 0.25, 0.25]
        print(corpus_bleu(references, candidate, weights))
        print(bleu_score.corpus_bleu(references, candidate, weights))
        print(sentence_bleu(references[0], candidate[0], weights))
        print(bleu_score.sentence_bleu(references[0], candidate[0], weights))
    

    参考资料

    https://cloud.tencent.com/developer/article/1042161
    https://en.wikipedia.org/wiki/BLEU
    https://blog.csdn.net/qq_31584157/article/details/77709454
    https://www.jianshu.com/p/15c22fadcba5

    转载于:https://www.cnblogs.com/weiyinfu/p/9853769.html

    展开全文
  • 机器翻译之BLEU

    千次阅读 2019-02-17 19:04:45
    1. 简介 BLEU(Bilingual Evaluation Understudy),相信大家对这个评价指标的概念已经很熟悉,随便百度谷歌就有相关介绍。...本文通过一个例子详细介绍BLEU是如何计算以及NLTKnltk.align.bleu_scor...

    1. 简介

    BLEU(Bilingual Evaluation Understudy),相信大家对这个评价指标的概念已经很熟悉,随便百度谷歌就有相关介绍。原论文为BLEU: a Method for Automatic Evaluation of Machine Translation,IBM出品。

    本文通过一个例子详细介绍BLEU是如何计算以及NLTKnltk.align.bleu_score模块的源码。

    首先祭出公式:

    注意这里的BLEU值是针对一条翻译(一个样本)来说的。

    NLTKnltk.align.bleu_score模块实现了这里的公式,主要包括三个函数,两个私有函数分别计算P和BP,一个函数整合计算BLEU值。

    # 计算BLEU值
    def bleu(candidate, references, weights)
    
    # (1)私有函数,计算修正的n元精确率(Modified n-gram Precision)
    def _modified_precision(candidate, references, n)
    
    # (2)私有函数,计算BP惩罚因子
    def _brevity_penalty(candidate, references)

    例子:

    候选译文(Predicted): 
    It is a guide to action which ensures that the military always obeys the commands of the party

    参考译文(Gold Standard) 
    1:It is a guide to action that ensures that the military will forever heed Party commands 
    2:It is the guiding principle which guarantees the military forces always being under the command of the Party 
    3:It is the practical guide for the army always to heed the directions of the party

    2. Modified n-gram Precision计算(也即是PnPn)

    def _modified_precision(candidate, references, n):
        counts = Counter(ngrams(candidate, n))
    
        if not counts:
            return 0
    
        max_counts = {}
        for reference in references:
            reference_counts = Counter(ngrams(reference, n))
            for ngram in counts:
                max_counts[ngram] = max(max_counts.get(ngram, 0), reference_counts[ngram])
    
        clipped_counts = dict((ngram, min(count, max_counts[ngram])) for ngram, count in counts.items())
    
        return sum(clipped_counts.values()) / sum(counts.values())

    我们这里n取值为4,也就是从1-gram计算到4-gram。

    Modified 1-gram precision:

    首先统计候选译文里每个词出现的次数,然后统计每个词在参考译文中出现的次数,Max表示3个参考译文中的最大值,Min表示候选译文和Max两个的最小值。

    然后将每个词的Min值相加,将候选译文每个词出现的次数相加,然后两值相除即得

    P1=(3+0+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1)/(3+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1)=0.95

    类似可得:

    Modified 2-gram precision:

    P2=10/17=0.588235294   P2=10/17=0.588235294

    Modified 3-gram precision:

    def _brevity_penalty(candidate, references):
    
        c = len(candidate)
        ref_lens = (len(reference) for reference in references)
        #这里有个知识点是Python中元组是可以比较的,如(0,1)>(1,0)返回False,这里利用元组比较实现了选取参考翻译中长度最接近候选翻译的句子,当最接近的参考翻译有多个时,选取最短的。例如候选翻译长度是10,两个参考翻译长度分别为9和11,则r=9.
        r = min(ref_lens, key=lambda ref_len: (abs(ref_len - c), ref_len))
        print 'r:',r
    
        if c > r:
            return 1
        else:
            return math.exp(1 - r / c)

    下面计算BP(Brevity Penalty),翻译过来就是“过短惩罚”。由BP的公式可知取值范围是(0,1],候选句子越短,越接近0。

    候选翻译句子长度为18,参考翻译分别为:16,18,16。 
    所以c=18,r=18(参考翻译中选取长度最接近候选翻译的作为rr)

    所以


    4. 整合

    最终

    BLEU的取值范围是[0,1],0最差,1最好。

    通过计算过程,我们可以看到,BLEU值其实也就是“改进版的n-gram”加上“过短惩罚因子”。

     

    浅谈用 Python 计算文本 BLEU 分数

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

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

    通过本教程, 你将探索 BLEU 评分, 并使用 Python 中的 NLTK 库对候选文本进行评估和评分

    完成本教程后, 你将收获:

    BLEU 评分的简单入门介绍, 并直观地感受到到底是什么正在被计算

    如何使用 Python 中的 NLTK 库来计算句子和文章的 BLEU 分数

    如何用一系列的小例子来直观地感受候选文本和参考文本之间的差异是如何影响最终的 BLEU 分数

    让我们开始吧

    浅谈用 Python 计算文本 BLEU 分数

    照片由 Bernard Spragg. NZ 提供, 保留所有权

    教程概述

    本教程分为 4 个部分; 他们分别是:

    双语评估替换评分介绍

    计算 BLEU 分数

    累加和单独的 BLEU 分数

    运行示例

    双语评估替换评分

    双语评估替换分数 (简称 BLEU) 是一种对生成语句进行评估的指标

    完美匹配的得分为 1.0, 而完全不匹配则得分为 0.0

    这种评分标准是为了评估自动机器翻译系统的预测结果而开发的尽管它还没做到尽善尽美, 但还是具备了 5 个引人注目的优点:

    计算速度快, 计算成本低

    容易理解

    与具体语言无关

    和人类给的评估高度相关

    已被广泛采用

    BLEU 评分是由 Kishore Papineni 等人在他们 2002 年的论文 BLEU: a Method for Automatic Evaluation of Machine Translation 中提出的

    这种评测方法通过对候选翻译与参考文本中的相匹配的 n 元组进行计数, 其中一元组 (称为 1-gram 或 unigram) 比较的是每一个单词, 而二元组 (bigram) 比较的将是每个单词对这种比较是不管单词顺序的

    BLEU 编程实现的主要任务是对候选翻译和参考翻译的 n 元组进行比较, 并计算相匹配的个数匹配个数与单词的位置无关匹配个数越多, 表明候选翻译的质量就越好

    摘自论文 BLEU: a Method for Automatic Evaluation of Machine Translation,2002 年发表

    n 元组匹配的计数结果会被修改, 以确保将参考文本中的单词都考虑在内, 而不会对产生大量合理词汇的候选翻译进行加分在 BLEU 论文中这被称之为修正的 n 元组精度

    糟糕的是, 机器翻译系统可能会生成过多的合理单词, 从而导致翻译结果不恰当, 尽管其精度高... 从直观上这个问题是明显的: 在识别出匹配的候选单词之后, 相应的参考单词应该被视为用过了我们将这种直觉定义为修正的单元组精度

    摘自论文 BLEU: a Method for Automatic Evaluation of Machine Translation,2002 年发表

    BLEU 评分是用来比较语句的, 但是又提出了一个能更好地对语句块进行评分的修订版本, 这个修订版根据 n 元组出现的次数来使 n 元组评分正常化

    我们首先逐句计算 n 元组匹配数目接下来, 我们为所有候选句子加上修剪过的 n 元组计数, 并除以测试语料库中的候选 n 元组个数, 以计算整个测试语料库修正后的精度分数 pn

    摘自论文 BLEU: a Method for Automatic Evaluation of Machine Translation,2002 年发表

    实际上, 一个完美的分数是不可能存在的, 因为这意味着翻译必须完全符合参考甚至连人类翻译家都不能做到这点对计算 BLEU 分数的参考文本的数量和质量的水平要求意味着在不同数据集之间的比较 BLEU 分数可能会很麻烦

    BLEU 评分的范围是从 0 到 1 很少有翻译得分为 1, 除非它们与参考翻译完全相同因此, 即使是一个人类翻译, 也不一定会在一个大约 500 个句子 (也就是 40 个普通新闻报道的长度) 的测试语料上得 1 分, 一个人类翻译在四个参考翻译下的得分为 0.3468, 在两个参考翻译下的得分为 0.2571

    摘自论文 BLEU: a Method for Automatic Evaluation of Machine Translation,2002 年发表

    除了翻译之外, 我们还可以将 BLEU 评分用于其他的语言生成问题, 通过使用深度学习方法, 例如:

    语言生成

    图片标题生成

    文本摘要

    语音识别

    以及更多

    计算 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 分数

    NLTK 中提供的 BLEU 评分方法允许你在计算 BLEU 分数时为不同的 n 元组指定权重

    这使你可以灵活地计算不同类型的 BLEU 分数, 如单独和累加的 n-gram 分数

    让我们来看一下

    单独的 N-Gram 分数

    单独的 N-gram 分数是对特定顺序的匹配 n 元组的评分, 例如单个单词 (称为 1-gram) 或单词对(称为 2-gram 或 bigram)

    权重被指定为一个数组, 其中每个索引对应相应次序的 n 元组仅要计算 1-gram 匹配的 BLEU 分数, 你可以指定 1-gram 权重为 1, 对于 2 元, 3 元和 4 元指定权重为 0, 也就是权重为 (1,0,0,0) 例如:

    # 1-gram individual BLEU
    from nltk.translate.bleu_score import sentence_bleu
    reference = [['this', 'is', 'small', 'test']]
    candidate = ['this', 'is', 'a', 'test']
    score = sentence_bleu(reference, candidate, weights=(1, 0, 0, 0))
    print(score)

    运行此例将输出得分为 0.5

    0.75

    我们可以重复这个例子, 对于从 1 元到 4 元的各个 n-gram 运行语句如下所示:

    # n-gram individual BLEU
    from nltk.translate.bleu_score import sentence_bleu
    reference = [['this', 'is', 'a', 'test']]
    candidate = ['this', 'is', 'a', 'test']
    print('Individual 1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
    print('Individual 2-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 1, 0, 0)))
    print('Individual 3-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 1, 0)))
    print('Individual 4-gram: %f' % sentence_bleu(reference, candidate, weights=(0, 0, 0, 1))

    运行该示例, 结果如下所示:

    Individual 1-gram: 1.000000
    Individual 2-gram: 1.000000
    Individual 3-gram: 1.000000
    Individual 4-gram: 1.000000

    虽然我们可以计算出单独的 BLEU 分数, 但这并不是使用这个方法的初衷, 而且得出的分数也没有过多的含义, 或者看起来具有说明性

    累加的 N-Gram 分数

    累加分数是指对从 1 到 n 的所有单独 n-gram 分数的计算, 通过计算加权几何平均值来对它们进行加权计算

    默认情况下, sentence_bleu()和 corpus_bleu()分数计算累加的 4 元组 BLEU 分数, 也称为 BLEU-4 分数

    BLEU-4 对 1 元组, 2 元组, 3 元组和 4 元组分数的权重为 1/4(25%)或 0.25 例如:

    # 4-gram cumulative BLEU
    from nltk.translate.bleu_score import sentence_bleu
    reference = [['this', 'is', 'small', 'test']]
    candidate = ['this', 'is', 'a', 'test']
    score = sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25))
    print(score)

    运行这个例子, 输出下面的分数:

    0.707106781187

    累加的和单独的 1 元组 BLEU 使用相同的权重, 也就是 (1,0,0,0) 计算累加的 2 元组 BLEU 分数为 1 元组和 2 元组分别赋 50%的权重, 计算累加的 3 元组 BLEU 为 1 元组, 2 元组和 3 元组分别为赋 33%的权重

    让我们通过计算 BLEU-1,BLEU-2,BLEU-3 和 BLEU-4 的累加得分来具体说明:

    # cumulative BLEU scores
    from nltk.translate.bleu_score import sentence_bleu
    reference = [['this', 'is', 'small', 'test']]
    candidate = ['this', 'is', 'a', 'test']
    print('Cumulative 1-gram: %f' % sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)))
    print('Cumulative 2-gram: %f' % sentence_bleu(reference, candidate, weights=(0.5, 0.5, 0, 0)))
    print('Cumulative 3-gram: %f' % sentence_bleu(reference, candidate, weights=(0.33, 0.33, 0.33, 0)))
    print('Cumulative 4-gram: %f' % sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25)))

    运行该示例输出下面的分数结果的差别很大, 比单独的 n-gram 分数更具有表达性

    Cumulative 1-gram: 0.750000
    Cumulative 2-gram: 0.500000
    Cumulative 3-gram: 0.632878
    Cumulative 4-gram: 0.707107

    在描述文本生成系统的性能时, 通常会报告从 BLEU-1 到 BLEU-4 的累加分数

    运行示例

    在这一节中, 我们试图通过一些例子来进一步获取对 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 包含的数学知识非常简单, 我也鼓励你阅读这篇论文, 并在自己电子表格程序中探索计算语句评估分数的方法

    进一步阅读

    如果你要深入研究, 本节将提供更多有关该主题的资源

    BLEU 在维基百科的主页

    BLEU: a Method for Automatic Evaluation of Machine Translation,2002 年发表

    nltk.translate.bleu_score 的源码

    nltk.translate 包的 API 文档

    总结

    在本教程中, 你探索了 BLEU 评分, 根据在机器翻译和其他语言生成任务中的参考文本对候选文本进行评估和评分

    具体来说, 你学到了:

    BLEU 评分的简单入门介绍, 并直观地感受到到底是什么正在被计算

    如何使用 Python 中的 NLTK 库来计算语句和文章的 BLEU 分数

    如何使用一系列的小例子来直观地感受候选文本和参考文本的差异是如何影响最终的 BLEU 分数

     

    参考:

    https://blog.csdn.net/guolindonggld/article/details/56966200

    https://www.h3399.cn/201802/544465.html

    展开全文
  • 在本教程中,你探索了BLEU评分,根据在机器翻译和其他语言生成任务中的参考文本对候选文本进行评估和评分。 具体来说,你学到了: BLEU评分的简单入门介绍,并直观地感受到到底是什么正在被计算。 如何使用Python中...
  • 双语评估替换分数(简称BLEU)是一种对生成语句进行评估的指标。完美匹配的得分为1.0,而完全不匹配则得分为0.0。这种评分标准是为了评估自动机器翻译系统的预测结果而开发的,具备了以下一些优点: 计算速度快,计算...
  • 文章目录引言一、Seq2eq+Attention于机器翻译中的原理以及及attention的计算二、评价指标bleu1.bleu指标实现2.nltk中的bleu三、基于Seq2eq+Attention的机器翻译实战 引言   利用PyTorch实现Seq2eq+Attention的模型...
  • NMT评价指标-BLEU

    2020-09-20 16:33:36
    BLEU (其全称为Bilingual Evaluation Understudy), 其意思是双语评估替补。所谓Understudy (替补),意思是代替人进行翻译结果的评估。尽管这项指标是为翻译而发明的,但它可以用于评估一组自然语言处理任务生成的...
  • 【机器翻译】BLEU学习

    2019-09-21 18:45:22
    BLEU学习 简介 BLEU(bilingual evaluation understudy),是一种翻译结果的评估方法,主要概念来自于这篇Bleu: a method for automatic evaluation of matchin translatrion论文,本文主要学习和总结该论文及相关材料。...
  • BLEU算法(例子和公式解释)

    千次阅读 2020-02-08 16:01:15
    在transformer的实现中,用到了一个标准BLEU标准。这个标准全称为bilingual evaluation understudy。同时参考了一些文章的介绍: 机器翻译评测——BLEU算法详解:http://www.cnblogs.com/by-dream/p/7679284.html ...
  • BLEU简单解析

    2021-01-16 22:25:07
    BLEU: Bilingual Evaluation Understudy 一种机器翻译文本相似度评价指标
  • python中计算BLEU分数

    千次阅读 2019-02-13 15:20:48
    BLEU,全称为Bilingual Evaluation Understudy(双语评估替换),是一个比较候选文本翻译与其他一个或多个参考翻译的评价分数。 尽管BLEU一开始是为翻译工作而开发,但它也可以被用于评估文本的质量,这种文本是为...
  • 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 ...Evaluating machine translation with BLEU Papineni等人(2002)提出了一种评估人工翻译的有效方法,人类的基线很难确定,但
  • 机器翻译评价指标之BLEU原理介绍及代码实现 欢迎关注知乎: 世界是我改变的 知乎上的原文链接 一. 原理介绍 BLEU(Bilingual Evaluation Understudy),即双语评估替补。所谓替补就是代替人类来评估机器翻译的每一个...
  • 浅谈用 Python 计算文本 BLEU 分数BLEU, 全称为 Bilingual Evaluation Understudy(双语评估替换), 是一个比较候选文本翻译与其他一个或多个参考翻译的评价分数尽管 BLEU 一开始是为翻译工作而开发, 但它也可以被用于...
  • /usr/bin/env python # bleu_scorer.py # David Chiang # Copyright (c) 2004-2006 University of Maryland. All rights # reserved. Do not redistribute without permission from the # author. Not for ...
  • BLEU BLEU (bilingual evaluation understudy) is an algorithm for evaluating the quality of text which has been machine-translated from one natural language to another. This metric uses a modified form ...
  • Bleu 计算介绍(不定时更新) 文章目录Bleu 计算介绍(不定时更新)1.直觉2. 引入n-gram3.计算n_gram 的平均分数4. 坑-重复问题4.长度惩罚5. BlEU 基础计算公式6. 坑-p_i不匹配导BLEU=06.1. smooth 1 加入噪音6.2. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,869
精华内容 1,947
关键字:

bleu