zoukankan      html  css  js  c++  java
  • BLEU METEOR ROUGE CIDEr 详解和实现

    一、指标概述 

    这四种指标都是机器翻译的自动评价指标,对于一些生成式文本任务,也是使用这几种评价指标。

    二、Bleu原理详解 

    BLEU是IBM于2002年提出的。我们假定人工给出的译文为reference,机器翻译的译文为candidate。

    1.最早的BLEU算法

    最早的BLEU算法是直接统计cadinate中的单词有多少个出现在reference中,具体的式子是:

        $BLEU=frac{出现在reference中的candinate的单词的个数}{cadinate中单词的总数}$

        以下面例子为例:

        candinate:the the the the the the the

        reference:the cat is on the mat

        cadinate中所有的单词都在reference中出现过,因此:

        $BLEU=frac{7}{7}=1$

    对上面的结果显然是不合理的,而且主要是分子的统计不合理,因此对上面式子中的分子进行了改进。

    2.改进的BLEU算法

        针对上面不合理的结果,对分子的计算进行了改进,具体的公式变为如下:

        $BLEU=frac{Count^{clip}_{w_i}}{cadinate中单词的总数}$

        $Count^{clip}_{w_i}=min(Count_{w_i},Ref-Count_{w_i})$

        上面式子中:

        $Count_{w_i}$ 表示单词$w_i$在candinate中出现的次数;

        $Ref-Count_{w_i}$ 表示单词$w_i$在reference中出现的次数;

        但一般情况下reference可能会有多个j句子,因此有:

        $Count^{clip}=max(Count^{clip}_{w_i,j}),j=1,2,3......$

        上面式子中:j表示第j个reference。

        仍然以上面的例子为例,在candinate中只有一个单词the,因此只要计算一个$Count^{clip}$,the在reference中只出现了两次,因此:

        $BLEU=frac{2}{7}$

    3.引入n-gram

    在上面我们一直都是对于单个单词进行计算,单个单词可以看作时1−gram,1−gram可以描述翻译的充分性,即逐字翻译的能力,但不能关注翻译的流畅性,因此引入了n−gram,在这里一般n不大于4。引入n−gram后的表达式如下:

        $p_n=frac{sum_{cin candidates}sum_{n-gramin c}Count_{clip}(n-gram)}{sum_{{c}'in candidates}sum_{{n-gram}'in {c}'}Count({n-gram}')}$

        很多时候在评价一个系统时会用多条candinate来评价,因此上面式子中引入了一个候选集合candinates。$p_n$中的n表示n-gram,$p_n$表示n-gram的精度,即1−gram时,n=1。

        接下来简单的理解下上面的式子,首先来看分子:

        1)第一个$sum$描述的是各个candinate的总和,就是有多个句子

        2)第二个$sum$描述的是一条candinate中所有的n−gram的总和,就是一个句子的n-gram的个数

        3)$Count_{clip}(n-gram)$表示某一个n−gram词的截断计数;

        再来看分母,前两个$sum$和分子中的含义一样,Count({n-gram}')表示n−gram′在candinate中的计数。

        再进一步来看,实际上分母就是candinate中n−gram的个数,分子是出现在reference中的candinate中n−gram的个数。

        举一个例子来看看实际的计算:

        candinate: the cat sat on the mat

        reference:the cat is on the mat

        计算n−gram的精度:

        $p1=frac{5}{6}=0.83333$

        $p2=frac{3}{5}=0.6$

        $p3=frac{1}{4}=0.25$

        $p4=frac{0}{3}=0$

    4.添加对句子长度的乘法因子    

    在翻译时,若出现译文很短的句子时往往会有较高的BLEU值,因此引入对句子长度的乘法因子,其表达式如下:

      在这里c表示cadinate的长度,r表示reference的长度。

      将上面的整合在一起,得到最终的表达式:

      $BLEU=BPexp(sum^N_{n=1}w_n logp_n)$

      其中$exp(sum^N_{n=1}w_n logp_n)$表示不同的n−gram的精度的对数的加权和。

    三、具体实现

    github下载链接:https://github.com/Maluuba/nlg-eval

    将下载的文件放到工程目录,而后使用如下代码计算结果

    具体的写作格式如下:

    from nlgeval import NLGEval
    nlgeval=NLGEval()
    #对应的模型生成的句子有三句话,每句话的的标准有两句话
    hyp=['this is the model generated sentence1 which seems good enough','this is sentence2 which has been generated by your model','this is sentence3 which has been generated by your model']
    ref1=['this is one reference sentence for sentence1','this is a reference sentence for sentence2 which was generated by your model','this is a reference sentence for sentence3 which was generated by your model']
    ref2=['this is one more reference sentence for sentence1','this is the second reference sentence for sentence2','this is a reference sentence for sentence3 which was generated by your model']
    lis=[ref1,ref2]
    ans=nlgeval.compute_metrics(hyp_list=hyp,ref_list=lis)
    # res=compute_metrics(hypothesis='nlg-eval-master/examples/hyp.txt',
    #                    references=['nlg-eval-master/examples/ref1.txt','nlg-eval-master/examples/ref2.txt'])
    print(ans)

    输出结果如下:

    {'Bleu_2': 0.5079613089004589, 'Bleu_3': 0.35035098185199764, 'Bleu_1': 0.6333333333122222, 'Bleu_4': 0.25297649984340986, 'ROUGE_L': 0.5746244363308142, 'CIDEr': 1.496565428735557, 'METEOR': 0.3311277692098822}

    参考链接:https://www.cnblogs.com/jiangxinyang/p/10523585.html

  • 相关阅读:
    linux-文件
    字符串函数
    函数
    内存管理
    静态库、动态库文件制作
    Makefile 待完善
    指针
    开发板GEC6816环境搭建,使用VS code
    C语言数组
    连接开发板下载程序
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/12041325.html
Copyright © 2011-2022 走看看