如何简便实现Google MQM数据集源文本与参考译文的映射?
TL;DR
google的wmt-mqm-human-evaluation数据集包含源文本和各类机器译文,但缺少参考/人工译文。
参考译文可从以下渠道获取:
- WMT20翻译任务测试集
- WMT21翻译任务测试集
- JHU多目标TED Talks数据集
核心问题:如何以最简方式将wmt-mqm-human-evaluation的数据与对应参考译文映射?
详细说明
wmt-mqm-human-evaluation数据集由多个.tsv文件构成,包含机器翻译共享任务测试集的翻译错误标注,涉及的测试集如下:
- newstest 2020:2020年机器翻译会议(WMT)的数据集,采用SGML格式(一种针对特定场景的XML格式)
- 直接下载:WMT20翻译任务测试集压缩包
- 任务说明:WMT21官方站点
- newstest 2021:与2020版类似,为2021年共享任务数据集,采用更规范的XML格式(无DTD定义文件)
- 直接下载:WMT21翻译任务测试集压缩包
- 任务说明:WMT21官方站点
- TED talks:面向口语机器翻译共享任务的数据集,源自wit3.fbk.eu,最规整的版本为JHU多目标TED Talks数据集
问题1:如何将wmt-mqm-human-evaluation的标注与参考译文映射?
已尝试方案
为获取newstest2020和newstest2021的源文本-参考译文映射,已按如下方式解析XML:
数据下载:
! wget https://data.statmt.org/wmt21/translation-task/test.tgz ! tar zxvf test.tgz
数据解析:
from itertools import chain from bs4 import BeautifulSoup with open('test/newstest2021.en-de.xml') as fin: bsoup = BeautifulSoup(fin) en2de = {} for doc in bsoup.find_all('doc'): if doc.find('ref'): en2de.update( dict( zip( [seg.text for seg in doc.find('src').find_all('seg')], [seg.text for seg in doc.find('ref').find_all('seg')]) ) ) with open('sgm/newstest2020-ende-src.en.sgm') as fin: en = [seg.text for seg in BeautifulSoup(fin).find_all('seg')] with open('sgm/newstest2020-ende-ref.de.sgm') as fin: de = [seg.text for seg in BeautifulSoup(fin).find_all('seg')] en2de.update(dict(zip(en,de)))
随后下载并解析tedtalk数据集,操作如下:
! wget https://www.cs.jhu.edu/~kevinduh/a/multitarget-tedtalks/multitarget-ted.tgz ! tar zxvf multitarget-ted.tgz
接着执行:
en_files, de_files = {}, {} for filename in find_files('multitarget-ted/', '*en-de*'): prefix = filename.rpartition('.')[0] if filename.endswith('en'): en_files[prefix] = filename if filename.endswith('de'): de_files[prefix] = filename en2de_ted = {} for k in en_files: with open(en_files[k]) as en_fin, open(de_files[k]) as de_fin: en2de_ted.update({en.strip(): de.strip() for en, de in zip(en_fin, de_fin)}) en2de.update(en2de_ted)
最后读取mqm-dataset并进行关联:
from lazyme import find_files import pandas as pd lol = [] for filename in find_files('wmt-mqm-human-evaluation-main', '*.tsv'): if "avg_seg_scores" in filename: continue print(filename) df = pd.read_csv(filename, sep='\t', error_bad_lines=False) #print(len(df)) df = df[~df['source'].str.contains('|'.join(['\t']), na=False)] #print(len(df)) ann, dataset, lang = filename.split('_') df['filename'] = filename.split('/')[-1] df['src_lang'] = lang[:2] df['trg_lang'] = lang[2:4] df['annotation_scheme'] = ann if len(lang.split('.')) > 2: df['special_category'] = lang.split('.')[1] else: df['special_category'] = "general" lol.append(df) df_google_mqm = pd.concat(lol)
之后将其与zh2en和en2de字典映射:
targets = [] num_none = 0 for src in df_google_mqm['source']: if src in zh2en: targets.append(zh2en[src]) elif src in en2de: targets.append(en2de[src]) else: num_none += 1 targets.append(None) df_google_mqm['reference'] = targets df_google_mqm = df_google_mqm[df_google_mqm['reference'].notna()]
通过上述代码,wmt-mqm-human-evaluation数据集的555,990条数据中仍有约88,471条无法匹配。
问题2:当前映射尝试是否存在遗漏?
问题3:是否有更简便的源文本与参考译文映射方法?
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

