zoukankan      html  css  js  c++  java
  • 机器翻译评测——一份评测集的艰辛制作过程

      ◆版权声明:本文出自胖喵~的博客,转载必须注明出处。

      转载请注明出处:http://www.cnblogs.com/by-dream/p/7683126.html

    前言

      机器翻译的评测,很大程度上会依赖评测集。制作一份好的评测集,远远没有我们想象的那么简单。

      今天我就将自己制作评测集的经验分享给大家。以一个制作“几十句口语关于天气的英中评测集”为例。

    收集原句

      首先收集指定数量的讨论天气的口语句子。这些句子都是都是通过花钱,找国外的朋友帮忙收集来的,因此这些英文句子非常的native。

    人工评价

      将收集来的原句用目前当下比较流行的翻译引擎翻译了一遍。这里选取了百度、有道、搜狗、google、腾讯翻译君nmt2.0,然后将机器翻译结果生成一个评测问卷,针对译文的质量进行一个1—5分的打分:

      一般打分需要专业的人士来打,并且对他们的结果进行一个相关度的计算,剔除非法的数据,这个过程我就不细说了。这是打分后的一个统计结果如下所示:

      可以看到腾讯翻译君的翻译质量是最高的,人工可接受度达到了91%,其次分别是百度、有道、搜狗和google。因此我们的评测集在BLEU上的相关性也需要和这个结果保持一致。

    译文制作

      接下来了解了各个翻译引擎的好坏后,我们就可以开始制作评测集了,首先找专业的译员对原句进行翻译制作评测集,这里我找了英语专业的学生对原文进行了翻译。然后我们用她翻译的结果做为译文,进行制作参考答案,这里需要注意的是,由于BLEU算法的特性,因此中文的译文需要按单字切词:

    例如:“这个月的18号,我要去一趟Atlanta。” 转化后为 “这 个 月 的 18 号 ,我 要 去 一 趟 Atlanta 。 ”

      然后针对翻译结果进行BLEU值的计算。

      很明显这个结果和人工评价的结果相差过大,那么究竟问题出在哪里了呢?

    译文分析、修改、迭代

      根据BLEU算法的特性,我们知道BLEU的分值高低取决于翻译译文和参考译文之间的相似度。于是我简单看了一下,发现可能是句子过于短,ref的答案过于单一,不够丰富导致的分值上有所差异,因此又增加了几个ref的制作,具体是在各个翻译引擎翻译的基础上,又进行修改,得到高质量的译文。总共下来一共制作了9分ref。

      此时得到的结果:

      可以看到,和之前相比较分值虽然高了,但是和人工评价的一致性还是比较差,因此我们就需要对单句进行分析,看看具体是哪些句子造成了影响。
      这里我用python的nltk实现了一个BLEU单句分析的脚本:

    #-*- coding:utf-8 -*-
    import nltk
    import sys
    import codecs
    
    # 功能:传入计算译文单句BLEU的功能
    # 调用方式:python 脚本.py 参考答案1+参考答案2 要分析的译文 
    # 参数一:可以是多份译文例如 t_tmq_ref0+t_tmq_ref1 用+连接即可
    # 参数二:要计算的译文
    
    '''
    nltk 简单用法
    print nltk.translate.bleu_score.corpus_bleu(['把 卷 子 往 后 传'], ['把 这 些 纸 往 后 传 。'],['把 这 些 床 单 递 回 去 。'] )
    print nltk.translate.bleu_score.corpus_bleu(['天 气 很 好'], ['天 气 很 不 错'])
    print nltk.translate.bleu_score.sentence_bleu('天 气 非 常 不 错', '天 气 很 不 错' )
    '''
    
    reffiles = sys.argv[1]
    file2 = sys.argv[2]
    
    list_all_ref = []
    list2 = []
    
    # 读取译文
    i = 0
    for sen in open(file2):
        sen = sen.strip()
        if sen:
            list2.append(sen)
            i = i+1
        else:
            print i, "is null"
    
    # 读取ref
    for reffile in reffiles.split('+'):
        list_ref = []
        for line in open(reffile):
            line = line.strip()
            if line:
                list_ref.append(line)
        list_all_ref.append(list_ref)
        
    setnum = len(list_all_ref)
    sentencenum = len(list_all_ref[0])
    
    log = codecs.open("res_"+file2 , 'w', 'utf-8')
    
    # 单句计算
    for j in range(0, sentencenum):
        refs = []
        for i in range(0, setnum):
            refs.append(list_all_ref[i][j])
        try:
            #print refs
            #print list2[j]
            BLEUscore = nltk.translate.bleu_score.corpus_bleu([refs], [list2[j]])
    
            print j, BLEUscore
            log.write(str(BLEUscore)+'
    ')
        except Exception as e:
            print 'except!',e
            break

      利用脚本计算结果,如下所示

      第一列是百度的译文,第二列是百度单句的一个BLEU得分,第三列是腾讯翻译君nmt2.0的BLEU得分,第四列是翻译君的译文。我们可以通过看句子找到一些分值不合理的句子,用红色标注。

      例如下面这句,很明显百度的翻译没有翻译君的好,但是BLEU分值却高。

      经过检查参考译文,发现有一份参考译文中有低质量的翻译句子。于是我们需要对这些句子再进行修改。当然如果人力不足和时间不足的情况下,这种现象无法避免。虽然可以通过要求第一遍制作就不出这些问题,但是真的很难。这里之所以列出这个方法,也是想说明,如果遇到这样的问题,可以通过这样一种方法来分析并且可以知道译文是否的可靠。

      好,我们根据刚才所说的方法,修正完所有的译文后,再次重新计算bleu。

      修正后的 百度和nmt2.0的分值对比为:

    nmt2.0
    BLEU = 77.71, 93.4/84.5/76.0/64.9 (BP=0.984, ratio=0.984, hyp_len=364, ref_len=370)
    baidu
    BLEU = 76.96, 92.4/82.4/73.1/64.4 (BP=0.995, ratio=0.995, hyp_len=369, ref_len=371)

       从分值排名来看,这次更符合实际了,因此用同样的方法处理了剩余的,最终得到了如下结果(注意这里的结果采取的是去掉和引擎相关的ref计算的BLEU,因此是两两比较):

      根据分值,我们简单看下和人工评价的相关性

      

      很明显,在百度和nmt2.0的比较重相关性不是高,于是我在想,是不是当时在中文分词的时候影响了最终的数据结果,于是我决定用分词代替中文单词切词的方式,再计算一次BLEU。

      这次分词效果和之前不一样的是:

    例如:“这个月的18号,我要去一趟Atlanta。” 转化后为 “ 这个月 的 18号 , 我 要去 一趟 Atlanta 。 ”

      计算的BLEU结果为:

      这次可以看到nmt2.0和百度的分值已经稍微有些拉开了,但是有道和百度的排名却换了一个位置。于是针对有道和百度,我对每个句子又进行了单句BLEU的分析,以及将人工评价的打分也列到这里进行对比:

       我们单看上图中标注的这句话,这句话应该被正确翻译为 “ 我希望天气能一直保持温暖 ” ,因此人工评价的时候,考虑到“天气”这个重要的词没有被翻译出来,因此给打了2分,但是BLEU算法匹配到了大部分的词,只是少了天气,因此BLEU给出的分值不会很低,要比人工评价的结果高。因此我们看出BLEU算法针对翻译的流畅度评价是一个比较好的打分,但是对于一些核心词语的翻译的重视度,BLEU算法却忽略了,因此我觉得百度和有道的差距应该就在这里了 。

      至此我们就算完成了一份偏流畅度的关于天气口语评测的评测集。所有数据

  • 相关阅读:
    逻辑运算(二)
    Rust基础类型
    Rust简单demo
    逻辑基础(一)
    webpack配置typescript项目
    Go并发原理
    JS实现取任意类型的数组交集并集方法的思考
    JS 可逆加密的一种实现
    所有中文复姓
    将中文姓名转为拼音英文名的一种实现
  • 原文地址:https://www.cnblogs.com/by-dream/p/7683126.html
Copyright © 2011-2022 走看看