机器翻译评价指标之BLEU原理介绍及代码实现

13 篇文章 3 订阅
订阅专栏
4 篇文章 4 订阅
订阅专栏
本文解析了BLEU(双语评估替补)算法原理,涉及公式、改进的精确度计算以及在NLP翻译中的应用。通过MindSpore代码实例展示了如何使用BLEU评价候选翻译。特别强调了BLEU的clipping策略和适用场景,以及在实际项目中的代码实现。
摘要由CSDN通过智能技术生成

欢迎关注知乎: 世界是我改变的

知乎上的原文链接

一. 原理介绍

BLEU(Bilingual Evaluation Understudy),即双语评估替补。所谓替补就是代替人类来评估机器翻译的每一个输出结果。Bleu score 所做的,给定一个机器生成的翻译,自动计算一个分数,衡量机器翻译的好坏。取值范围是[0, 1],越接近1,表明翻译质量越好。

机器翻译的一大难题是,一句法语句子,可以有多种英文翻译,这些翻译都是非常好的那怎么去评估一个机器翻译系统的质量是不是好呢?这不像图像识别,只有一个正确答案。通常我们有 BLEU score 来解决。

原论文为 BLEU: BLEU原论文

话不多说,先上公式:

  • 计算公式
    在这里插入图片描述
    其中,BP是简短惩罚因子,惩罚一句话的长度过短,防止训练结果倾向短句的现象,其表达式为:
    在这里插入图片描述
    还有Pn,是基于n-gram的精确度,其表达公式为:
    在这里插入图片描述
    公式的解释及使用都在以下例子中体现。

  • 举个例子(在什么情况下时候BLEU):

在这里插入图片描述
Reference 1 和 Reference 2这两句都是很不错的人工进行的翻译,那么如何利用这两句话对其他机器翻译得出的结果进行评估呢?

一般衡量机器翻译输出质量的方法之一是观察输出结果的每一个词,看其是否出现在参考(也就是人工翻译结果)中,这被称为是机器翻译的精确度。而这样计算得出的精确度很快就能被一个反例打破,那就是:the the the the the the the.

首先 我们要做的是,看机器翻译 MT 的结果中,有多少词在人类的翻译参考中出现:

  1. 一种方法叫做 Precision(精确度):看机器翻译的每一个词,有没有在翻译参考中出现。在上面的案例中,虽然全是 the 是一个非常糟糕的翻译结果,但是 Precision = 7/7 = 1(感觉这种衡量方法不靠谱)
  2. 改良后叫做 Modified precision:我们会设定最高权重上限,比如第一句翻译参考中,the 出现了 2 次;第二句中, the 出现了 1 次,那权重上限就是 2。这样 Modified precision = 2/7.

对于1中的计算方式的不足之处进行改良,于是把每一个单词的计分上限定为它在参考句子中出现最多的次数。在reference1中,the出现了两次,在reference2中,the只出现了一次。所以会说单词the的得分上限是2。

有了这个改良后的精确度,我们就说,这个输出句子的得分为2/7,因为在7个词中,我们最多只能给它2分。所以这里分母就是7个词中单词the总共出现的次数,而分子就是单词the出现的计数。我们在达到上限时截断计数,这就是改良后的精确度评估(modified precision measure)。

在这里插入图片描述
其次 在 Bleu score 中,我们不仅关注 单词,还关注词组(其实就是相邻的词对 bigrams)

  1. 这个例子中,一共有 5 种 bigrams 的组合
  2. 分别数一下出现的次数
  3. 分别数一下在翻译参考中出现的次数
  4. 最终 modified bigram precision = 4/6

在这里插入图片描述
可以将其公式化,这里的 P1 下标 1 表示的是 一元词组,推广到 n 元词组。

如果机器翻译的结果和参考翻译中的某一句完全相同,那么 P1 = P2 = … = Pn = 1
也有可能通过某种组合各个参考翻译得到结果为 1。
在这里插入图片描述
最终,我们把以上结合起来,获得最后的 Bleu score
即求所有 P 值的平均,然后取个 e 指数
然后在前面加上一个 BP 参数(brevity penalty 简短惩罚)

  • BP 的作用在于,如果输出一个非常短的句子,那很容易得到 Bleu score 的高分,所以我们要防止这个情况的出现
  • BP 在机器翻译长度大于人类翻译长度的时候取值为 1,否则产生惩罚

二. 使用场景

在NLP机器翻译任务中,我们如果想对一个语句进行翻译,然后对翻译结果进行评价打分,则需要使用到BLEU score。在使用时需要有候选语句和语句库进行对比,从而根据两者的差异来计算得分。

三. MindSpore代码实现

  • BLEU score的MindSpore代码实现
"""BleuScore."""
from collections import Counter
import numpy as np
from mindspore._checkparam import Validator as validator
from .metric import Metric


class BleuScore(Metric):
   
    def __init__(self, n_gram=4, smooth=False):
        super().__init__()
        # validator.check_value_type为参数的校验
        self.n_gram = validator.check_value_type("n_gram", n_gram, [int])
        if self.n_gram > 4 or self.n_gram < 1:
            raise ValueError('The n_gram value ranged from 1 to 4, but got {}'.format(n_gram))

        self.smooth = validator.check_value_type("smooth", smooth, [bool])
        self.clear()

    def clear(self):
        """清除历史数据"""
        self._numerator = np.zeros(self.n_gram)
        self._denominator = np.zeros(self.n_gram)
        self._precision_scores = np.zeros(self.n_gram)
        self._c = 0.0
        self._r = 0.0
        self._trans_len = 0
        self._ref_len = 0
        self._is_update = False
    
    # 用ngram计算每个单词在给定文本中出现的次数。
    def _count_ngram(self, ngram_input_list, n_gram):
        # 先构造一个计数器。
        ngram_counter = Counter()

        for i in range(1, n_gram + 1):
            # 遍历翻译文本或参考文本的列表。
            for j in range(len(ngram_input_list) - i + 1):
                # 构造ngram-key字典
                ngram_key = tuple(ngram_input_list[j:(i + j)])
                ngram_counter[ngram_key] += 1

        return ngram_counter
 
    def update(self, *inputs):
        # 先进行输入个数的判断
        if len(inputs) != 2:
            raise ValueError('The bleu_score need 2 inputs (candidate_corpus, reference_corpus), '
                             'but got {}'.format(len(inputs)))
        # 更新输入,一个为候选句子,一个为参考句子或参考列表
        candidate_corpus = inputs[0]
        reference_corpus = inputs[1]
        # 进行输入的校验
        if len(candidate_corpus) != len(reference_corpus):
            raise ValueError('translate_corpus and reference_corpus should be equal in length, '
                             'but got {} {}'.format(len(candidate_corpus), len(reference_corpus)))
        # 遍历两个输入的每一个单词,使用计数器进行统计
        for (candidate, references) in zip(candidate_corpus, reference_corpus):
            self._c += len(candidate)
            ref_len_list = [len(ref) for ref in references]
            ref_len_diff = [abs(len(candidate) - x) for x in ref_len_list]
            self._r += ref_len_list[ref_len_diff.index(min(ref_len_diff))]
            translation_counter = self._count_ngram(candidate, self.n_gram)
            reference_counter = Counter()

            for ref in references:
                reference_counter |= self._count_ngram(ref, self.n_gram)

            ngram_counter_clip = translation_counter & reference_counter

            for counter_clip in ngram_counter_clip:
                self._numerator[len(counter_clip) - 1] += ngram_counter_clip[counter_clip]

            for counter in translation_counter:
                self._denominator[len(counter) - 1] += translation_counter[counter]

        self._trans_len = np.array(self._c)
        self._ref_len = np.array(self._r)
        self._is_update = True

    def eval(self):
        # 如果_is_update是False,则说明使用方法错误。
        if self._is_update is False:
            raise RuntimeError('Call the update method before calling eval.')

        # 分母不能为0
        if min(self._numerator) == 0.0:
            return np.array(0.0)

        # 计算准确度
        if self.smooth:
            precision_scores = np.add(self._numerator, np.ones(self.n_gram)) / np.add(self._denominator,
                                                                                      np.ones(self.n_gram))
        else:
            precision_scores = self._numerator / self._denominator

        # 使用公式进行计算BLEU
        log_precision_scores = np.array([1.0 / self.n_gram] * self.n_gram) * np.log(precision_scores)
        geometric_mean = np.exp(np.sum(log_precision_scores))
        brevity_penalty = np.array(1.0) if self._c > self._r else np.exp(1 - (self._ref_len / self._trans_len))
        bleu = brevity_penalty * geometric_mean

        return bleu

使用方法如下:

import numpy as np
import mindspore.common.dtype as mstype
import mindspore.nn as nn
from mindspore import Tensor

candidate_corpus = [['i', 'have', 'a', 'pen', 'on', 'my', 'desk']]
reference_corpus = [[['i', 'have', 'a', 'pen', 'in', 'my', 'desk'],
                    ['there', 'is', 'a', 'pen', 'on', 'the', 'desk']]]
metric = BleuScore()
metric.clear()
metric.update(candidate_corpus, reference_corpus)
bleu_score = metric.eval()
print(bleu_score)

0.5946035575013605
  • 需要说明的问题

BLEU采用的是clipping策略,即:在参考译文中被匹配过的单元(n-gram)应该被剪切掉,不应该再被匹配。BLEU在语料库层级上具有很好的匹配效果,但是随着n的增加,在句子层级上的匹配表现越来越差,因此BLEU在个别语句上可能表现不佳。

机器翻译(Machine Translation)原理代码实战案例讲解
AI天才研究院
07-25 629
机器翻译(Machine Translation)原理代码实战案例讲解 1. 背景介绍 1.1 问题的由来 随着全球化进程的加速,多语言交流的需求日益增加。然而,人工翻译成本高、耗时长且易出现错误,因此寻求
详解BLEU原理和计算
KPer_Yang的博客
08-09 5003
BLEU详解 参考《BLEU: a Method for Automatic Evaluation of Machine Translation》
BLEU算法的python实现
07-03
利用python的collect包从底层实现机器翻译、问答系统中常见的BLEU算法。
【文本生成评价指标BLEU原理代码示例py
张某文_Lambda的博客
03-25 3575
使用 sentence_bleu 函数计算生成文本和参考文本之间的 Bleu 指标,比较候选译文和参考译文里的 n-gram 的重合程度。附python代码
自然语言处理——BLEU详解以及简单代码实现
热门推荐
Allocator的CSDN博客
06-13 3万+
引子 何为BLEU 最初的BLEU 改良型BLEU(n-gram) 短译句的惩罚因子 总结 附录(源代码) 引子 最近在做一个深度学习的小项目: Caption generation model 其中在快速评估模型的时候使用到了Bleu这一个指标, 于是花了一点时间来研究了这个指标代表的意义以及如何计算这个指标, 附带源码. 何为BLEU机器翻译领域, 我...
Deep Learning基础--机器翻译BLEU与Perplexity详解
weixin_30834019的博客
11-07 517
前言   近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分。而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测得知系统存在的问题而不断改进,用户也可以根据评测报告选择满足自己需求的产品,而对于机器翻译的研究人员来说,评测能够给他们的技术发展方向提供最可靠的依据。 ——摘自北京邮电大学信息工程系张剑博士...
机器翻译评价指标BLEU算法
weixin_30855099的博客
03-13 772
1,概述   机器翻译中常用的自动评价指标是 $BLEU$ 算法,除了在机器翻译中的应用,在其他的 $seq2seq$ 任务中也会使用,例如对话系统。 2 $BLEU$算法详解   假定人工给出的译文为$reference$,机器翻译的译文为$candidate$。   1)最早的$BLEU$算法     最早的$BLEU$算法是直接统计$cadinate$中的单词有多少个出现在$...
NLP学习—13.Seq2eq在机器翻译中的实战(bleu指标的代码实现
柳杰的博客
08-22 1498
文章目录引言一、Seq2eq+Attention于机器翻译中的原理以及及attention的计算二、评价指标bleu1.bleu指标实现2.nltk中的bleu三、基于Seq2eq+Attention的机器翻译实战 引言   利用PyTorch实现Seq2eq+Attention的模型,并且利用bleu评价指标评价语言生成的好坏。 一、Seq2eq+Attention于机器翻译中的原理以及及attention的计算   在机器翻译中,输入是A语言,输出是B语言,A语言是Encoder的输入,B语言是Deco
自然语言生成主客观评价指标原理详解(附代码实现
07-20
BLEU最初被提出用于机器翻译的评估,但在NLG领域也有应用。 ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是对BLEU的补充,它更关注召回率,有多个变体如ROUGE-N、ROUGE-L等。ROUGE通过比较生成文本...
BLEU:一种应用于机器翻译的Metric
gowithme11123123的博客
12-03 928
该文章着重介绍BLEU的背景和理论知识,剖析了BLEU的数学公式,以及对于关键代码部分做出了解释
Bleu值计算工具
09-09
用于Bleu值计算.
机器翻译BLEU学习
凉水的博客
09-21 1256
BLEU学习 简介 BLEU(bilingual evaluation understudy),是一种翻译结果的评估方法,主要概念来自于这篇Bleu: a method for automatic evaluation of matchin translatrion论文,本文主要学习和总结该论文及相关材料。 1. 评估标准 BLEU的思想基于一个前提:机器翻译的结果越接近专业人士的翻译,结果越好。...
机器翻译评测----BLEU算法
weixin_45337615的博客
09-10 1582
BLEU算法前言N-gram召回率短句惩罚因子BLEU实例 前言 BLEU(bilingual evaluation understudy)算法是由IBM提出的用来自动评测机器翻译质量的算法。 N-gram N-gram的N指连续的N个word用来匹配,即比较译文和参考译文之间N组词的相似占比。 例如:   原文:今天天气不错   机器译文:It is a nice day today   人工译文:Today is a nice day 如果用1-gram匹配的话: 每1个word用来匹配,最终5个wo
Metric评价指标-机器翻译指标之BLEU(转载)
ac540101928的专栏
11-21 2631
一. 原理介绍 BLEU(Bilingual Evaluation Understudy),即双语评估替补。所谓替补就是代替人类来评估机器翻译的每一个输出结果。Bleu score 所做的,给定一个机器生成的翻译,自动计算一个分数,衡量机器翻译的好坏。取值范围是[0, 1],越接近1,表明翻译质量越好。 机器翻译的一大难题是,一句法语句子,可以有多种英文翻译,这些翻译都是非常好的那怎么去评估一个机器翻译系统的质量是不是好呢?这不像图像识别,只有一个正确答案。通常我们有 BLEU score 来解决。
机器翻译常用指标BLEU
最新发布
诸神缄默不语的博客
05-02 1530
本文介绍机器翻译常用指标BLEU
详解机器翻译任务中的BLEU
07-06 1748
BLEU的计算和Python简单实现
机器翻译自动评估-BLEU算法详解
一颗小甜心的博客
04-18 409
原文链接:https://blog.csdn.net/qq_31584157/article/details/77709454 BLEU综述:   BLEU实质是对两个句子的共现词频率计算,但计算过程中使用好些技巧,追求计算的数值可以衡量这两句话的一致程度。   BLEU容易陷入常用词和短译句的陷阱中,而给出较高的评分值。本文主要是对解决BLEU的这两个弊端的优化方法介绍。      参考...
机器翻译评价指标BLEU介绍
疯狂的鸡窝
03-03 5833
最近需要设计一个机器翻译相关的试验, 其中好多东西都不同, 先从基础的评价指标来吧. 本文翻译自Jason Brownlee的博客[...
BLEU详解以及简单代码实现翻译评估
kyle1314608的博客
04-26 1574
<div id="article_content" class="article_content clearfix"> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-21113...
写文章

热门文章

  • 绝对最简单实用的kenlm语言模型的安装及使用 15027
  • 图像分割评估指标之Hausdorff distance 豪斯多夫距离 12003
  • spark面试总结 9734
  • python3.6 使用newspaper库的Article包来快速抓取网页的文章或者新闻等正文 9526
  • 学习率(Learning rate)的理解及调整依据 5914

分类专栏

  • 人工智能Metrics 4篇
  • Java 基础总结 1篇
  • Java面试 1篇
  • 学习python过程的总结 2篇
  • 大数据相关spark、hadoop 1篇
  • 正则表达式入门 2篇
  • NLP学习总结 13篇
  • 算法面试题 7篇

最新评论

  • 图像分割评估指标之Hausdorff distance 豪斯多夫距离

    鱼在在: 可以切割2D数据做

  • 图像分割评估指标之Hausdorff distance 豪斯多夫距离

    HitStuHan: 您好,请问豪斯多夫距离的单位是什么呢?是%么

  • 使用ACL推理UIE模型的过程及代码

    喵星人27: 非常受用,棒棒的👍

  • 使用ACL推理UIE模型的过程及代码

    JaredYang_csdn: ACL推理UIE模型 给大佬点赞

  • 使用ACL推理UIE模型的过程及代码

    JaredYang_csdn: Paddle,PaddleNLP, UIE,ATC, ACL,onnx模型, om模型,昇腾310推理卡

大家在看

  • 基于ssm+vue合同管理系统(开题报告+源码+论文)
  • Find and Replace 479
  • 基于ssm+vue红色主题旅游网站(开题报告+源码+论文)
  • 基于ssm+vue红色景点自驾游网站管理系统(开题报告+源码+论文)
  • Python数据分析基础

最新文章

  • 使用ACL推理UIE模型的过程及代码
  • Pytorch Dispatch 机制
  • Metric评价指标-Perplexity语言模型
2022年2篇
2021年4篇
2020年4篇
2019年13篇
2018年5篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家湖南玻璃钢商场美陈雕塑玉溪市玻璃钢雕塑厂家电话玻璃钢雕塑凳子汕尾公园玻璃钢动物雕塑玻璃钢雕塑惠新复材商场开业中庭美陈吊饰河南玻璃钢骆驼雕塑雕塑玻璃钢效果图合肥梅州玻璃钢卡通雕塑神农架林区玻璃钢雕塑摆件公司那曲玻璃钢雕塑厂家重庆湛江玻璃钢动物雕塑公园标识玻璃钢景观雕塑厂清远商场装饰玻璃钢人物雕塑江苏商业街玻璃钢雕塑设计厂家黄山商场新春美陈合肥玻璃钢雕塑咨询客服商场玻璃钢企业吉祥物雕塑江都玻璃钢浮雕人物山水雕塑温州小区玻璃钢雕塑公司陕西玻璃钢雕塑施工玻璃钢雕塑报价品牌企业美陈玻璃钢雕塑供应商场美陈中国风宣城大型户外玻璃钢雕塑望城玻璃钢花盆花器江西步行街玻璃钢雕塑销售厂家玻璃钢雕塑场景互动绍兴户内玻璃钢雕塑市场黎川玻璃钢花盆花器香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化