You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简便实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:01:09