Response Generation中BLEU、NIST评测方法的使用

最近准备AI Challenger的时候要用到BLEU、NIST等评价指标对机器翻译的效果进行评价,BLEU比较好找,NIST就比较麻烦了,在这记录一下使用方法

关于BLEU的介绍可以参考对话响应生成的无监督评估指标的实证研究

NIST(National Institute of standards and Technology)方法是在BLEU方法上的一种改进。最主要的是引入了每个n-gram的信息量(information)的概念。BLEU算法只是单纯的将n-gram的数目加起来,而nist是在得到信息量累加起来再除以整个译文的n-gram片段数目。这样相当于对于一些出现少的重点的词权重就给的大了。

下载NIST

首先进入nist的官网

屏幕快照 2018-10-05 上午11.06.04.png

下载mteval-v13a-20091001.tar.gz

下载完成后直接运行会出现Can't locate XML/Twig.pm in @INC (you may need to install the XML::Twig module)的报错,需要先XML-Twig的库

配置XML-Twig

进入XML-Twig官网

屏幕快照 2018-10-05 上午11.14.01.png

下载完成后解压XML-Twig-3.52.tar.gz,cd进入XML-Twig-3.52目录

perl Makefile.PL -y
make
sudo make install

Usage

用nist提供的example进行测试

perl mteval-v13a.pl -r example/ref.xml -s example/src.xml -t example/tst.xml

屏幕快照 2018-10-05 上午11.23.24.png

其他用法

  • BLEU-4(mteval-v13a,官方OpenMT12评估指标)
    • 调用行: perl mteval-v13a.pl -r REFERENCE_FILE -s SOURCE_FILE -t CANDIDATE_FILE -c -b
    • 选项-c:区分大小写的得分
    • 选项-b:仅BLEU得分
  • IBM BLEU(bleu-1.04a)
    • 调用行: perl bleu-1.04.pl -r REFERENCE_FILE -t CANDIDATE_FILE
    • 默认情况下,评分是区分大小写的
  • NIST(mteval-v13a)
    • 调用行: perl mteval-v13a.pl -r REFERENCE_FILE -s SOURCE_FILE -t CANDIDATE_FILE -c -n
    • 选项-c:区分大小写的得分
    • 选项-n:仅NIST评分
  • TER(tercom-0.7.25)
    • 调用行: java -jar tercom.7.25.jar -r REFERENCE_FILE -h CANDIDATE_FILE -N -s
    • 选项-N:启用归一化
    • 选项-s:区分大小写的得分
  • METEOR(气象0.7)
    • 调用行: perl meteor.pl -s SYSTEM_ID -r REFERENCE_FILE -t CANDIDATE_FILE --modules “exact porter_stem wn_stem wn_synonymy”
    • 选项–modules “exact porter_stem wn_stem wn_synonymy”:按照顺序使用所有四个METEOR匹配模块

转换xml脚本

#!/usr/bin/python
# coding=utf8

import sys
import re
import codecs
import os
from xml.etree.ElementTree import ElementTree as etree
from xml.etree.ElementTree import Element, SubElement, ElementTree

# 传入至少5个参数
# 生成译文的xml
# param 1: 要处理的是什么文件,只允许传入 "src","tst","ref"
# param 2:评测集名称
# param 3:源语言
# param 4:目标语言
# param 5..:要处理的文件

# 例如
# 生成原文
# python xml_transform.py src xml_data/test Chinese English bleu_data/src.txt
# 生成译文
# python xml_transform.py tst xml_data/test Chinese English bleu_data/tst.txt
# 生成ref
# python xml_transform.py ref xml_data/test Chinese English bleu_data/ref.txt

# perl mteval-v13a.pl -r ../xml_data/test_ref.xml -s ../xml_data/test_src.xml -t ../xml_data/test_tst.xml


'''
@ 生成ref的xml
@ param 1: 多份ref的list,list中每一个元素为一个ref的list
@ param 2:评测集名称
@ param 3:源语言
@ param 3:目标语言
'''


def genrefxml(reflists, setid, srclang, trglang):
    mteval = Element('mteval')
    for reflist in reflists:
        sysid = reflist[0]
        set = SubElement(mteval, "refset")
        set.attrib = {"setid": setid, "srclang": srclang, "trglang": trglang, "refid": sysid}
        doc = SubElement(set, "doc")
        doc.attrib = {"docid": "doc1"}

        i = 0
        for sentence in reflist:
            # 第一位存储具体是哪个引擎
            if i != 0:
                p = SubElement(doc, "p")
                seg = SubElement(p, "seg")
                seg.attrib = {"id": str(i)}
                seg.text = sentence
            i = i + 1
    tree = ElementTree(mteval)
    tree.write(setid + '_ref.xml', encoding='utf-8')


'''
@ 生成译文的xml
@ param 1: 多份译文的list,list中每一个元素为一个译文的list
@ param 2:评测集名称
@ param 3:源语言
@ param 3:目标语言
'''


def gentstxml(tstlists, setid, srclang, trglang):
    mteval = Element('mteval')
    for tstlist in tstlists:
        sysid = tstlist[0]
        set = SubElement(mteval, "tstset")
        set.attrib = {"setid": setid, "srclang": srclang, "trglang": trglang, "sysid": sysid}
        doc = SubElement(set, "doc")
        doc.attrib = {"docid": "doc1"}

        i = 0
        for sentence in tstlist:
            # 第一位存储具体是哪个引擎
            if i != 0:
                p = SubElement(doc, "p")
                seg = SubElement(p, "seg")
                seg.attrib = {"id": str(i)}
                seg.text = sentence
            i = i + 1
    tree = ElementTree(mteval)
    tree.write(setid + '_tst.xml', encoding='utf-8')


'''
@ 生成原文的xml
@ param 1: 原文内容的list
@ param 2:评测集名称
@ param 3:源语言
'''


def gensrcxml(senlist, setid, srclang):
    mteval = Element('mteval')
    set = SubElement(mteval, "srcset")
    set.attrib = {"setid": setid, "srclang": srclang}
    doc = SubElement(set, "doc")
    doc.attrib = {"docid": "doc1"}

    i = 1
    for sentence in senlist:
        p = SubElement(doc, "p")
        seg = SubElement(p, "seg")
        seg.attrib = {"id": str(i)}
        seg.text = sentence
        i += 1
    tree = ElementTree(mteval)
    tree.write(setid + '_src.xml', encoding='utf-8')


# 调用具体的生成xml
def genxmltree(filetype, setid, srclang, trglang, files):
    if filetype not in ["src", "tst", "ref"]:
        print("filetype is error")
        return

    # 处理原文
    if filetype == "src":
        srclist = []
        for line in open(files[0]):
            line = line.strip()
            if line:
                srclist.append(line)
        gensrcxml(srclist, setid, srclang)

    # 处理译文
    if filetype == "tst":
        tstslist = []
        for tstfile in files:
            tstlist = []
            tstlist.append(str(tstfile).strip('.txt'))
            for line in open(tstfile):
                line = line.strip()
                if line:
                    tstlist.append(line)
            tstslist.append(tstlist)
        gentstxml(tstslist, setid, srclang, trglang)

    # 处理ref
    if filetype == "ref":
        reflists = []
        for reffile in files:
            reflist = []
            reflist.append(str(reffile).strip('.txt'))
            for line in open(reffile):
                line = line.strip()
                if line:
                    reflist.append(line)
            reflists.append(reflist)
        genrefxml(reflists, setid, srclang, trglang)


argv_len = len(sys.argv)
# print argv_len
if argv_len < 6:
    print("param error! src/ref tmq English Chinese 1.txt ")
    sys.exit()

filetype = sys.argv[1]
setid = sys.argv[2]
srclang = sys.argv[3]
trglang = sys.argv[4]
files = []
for i in range(5, len(sys.argv)):
    files.append(sys.argv[i])

genxmltree(filetype, setid, srclang, trglang, files)

参考资料

机器翻译评测——BLEU改进后的NIST算法
对话响应生成的无监督评估指标的实证研究

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
pix2tex是一种基于深度学习的图像到文本转换模型。使用pix2tex的方法可以分为以下几个步骤: 1. 数据准备:首先需要准备一组图像和相应的文本对,用于训练模型。可以使用已有的数据集,如COCO dataset等,也可以自行收集和标注数据。 2. 模型训练:使用数据准备好后,可以开始训练pix2tex模型。训练过程,模型将通过学习输入图像和对应文本之间的关联关系,来提取图像的特征并生成相应的文本描述。 3. 模型评估:训练完成后,需要对模型进行评估。可以使用一些评价指标,如BLEU分数,来衡量生成的文本与真实文本之间的相似度。 4. 模型应用:训练好的模型可以用于生成图像对应的文本描述。只需将待转换的图像输入至模型,即可生成相应的文本描述。 使用pix2tex模型时还需要注意以下几点: 1. 数据质量:模型的训练和应用结果取决于训练数据的质量。尽可能选择高质量的数据集,并对数据进行充分的清洗和标注。 2. 参数调优:模型的性能受到许多超参数的影响,如网络结构、学习率等。需要通过实验和调优,选择最优的参数组合。 3. 模型扩展:pix2tex是一种基础模型,可以根据需要进行扩展和改进。例如,可以尝试结合其他模型来提升生成文本的质量和多样性。 总之,使用pix2tex模型需要进行数据准备、模型训练、模型评估和模型应用等步骤。同时,还需注意数据质量和参数调优等因素,以获得较好的转换效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值