尧图精选

M2M-100 多语言机器翻译评估指南:基于 tok.sh 的分语言 Tokenization 与 BLEU 复现

🕒 发布时间:2026/9/13 20:23:19 📁 来源:尧图网络
M2M-100 多语言机器翻译评估指南基于 tok.sh 的分语言 Tokenization 与 BLEU 复现【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读M2M-100 是一个可以直达任意 100 种语言对之间互译的真正多对多Many-to-Many翻译模型。在评估这类非英语中心non-English-Centric模型的翻译质量时不同语言无法套用同一种分词tokenization策略——阿拉伯语需要形态学归一化、日语和韩语需要形态素切分、泰语和缅甸语需要无空格语言分词。本文以仓库中 edgelm/examples/m2m_100/tokenizers/README.md 为核心结合 tok.sh、install_dependecies.sh 及各分语言脚本的源码实现完整讲解依赖安装、分语言分词流水线以及从模型生成结果到sacrebleu评分的端到端评估复现流程。读完本文你将能够在 fairseq 环境下对 M2M-100 任意语言对的翻译结果进行可复现的标准化评测。一、为什么 M2M-100 需要分语言 TokenizationM2M-100 覆盖 100 种语言训练与评测依赖一个 128k 词表128k vocabulary的 SentencePiece 模型spm.128k.model这一点在 examples/m2m_100 主 README 中有明确说明。但 SentencePiece 只负责把文本切分为子词单元它并不解决词法层面的语言差异阿拉伯语具有丰富的词形变化未做形态归一化前同一个词根的不同屈折形态会被算作不同词日语、韩语、泰语、缅甸语等语言的文本没有空格边界需要专门的分词器先切出词罗马尼亚语在评测前通常要经历连字符归一化与去变音符diacritics处理使 BLEU 计算不受拼写变体干扰中文需要按字/词粒度的分词处理标准做法是直接调用sacrebleu内置的tokenize_zh。因此M2M-100 遵循既有文献惯例为不同语言配备不同 tokenization 策略并把这些策略统一封装进tok.sh使评测过程一条命令即可完成。这与主 README 中对原始数据先 detokenize 再应用 SPM的数据预处理约定相互独立tok.sh 作用于模型输出的假设hypothesis与参考译文reference用于 BLEU 打分前的对齐与归一化SPM 编码则发生在数据预处理阶段两者不能混淆。二、安装分语言分词工具2.1 通用依赖一键安装除阿拉伯语外所有语言所需的分词工具都可以通过install_dependecies.sh一键安装。注意文档正文中写作install_dependencies.sh而仓库中实际的文件名是 install_dependecies.sh原仓库沿用的拼写请以仓库实际文件名为准。在edgelm/examples/m2m_100目录下执行cd edgelm/examples/m2m_100 bash install_dependecies.sh从源码看该脚本会把所有第三方工具克隆/下载到tokenizers/thirdparty目录下当前仓库中该目录为空说明依赖需要自行安装具体包含工具安装路径服务语言mosesdecoder固定 checkout 到03578921cc1a03402提交tokenizers/thirdparty/mosesdecoder绝大多数语言拉丁字母类wmt16-scripts罗马尼亚语归一化脚本tokenizers/thirdparty/wmt16-scripts罗马尼亚语roKyTea编译安装autoreconfconfiguremaketokenizers/thirdparty/kytea日语jamecab-0.996-ko mecab-ko-dic-2.1.1从 bitbucket 下载、编译tokenizers/thirdparty/mecab-0.996-ko-0.9.2韩语koindic_nlp_resourcesgit clonetokenizers/thirdparty/indic_nlp_resources印地语hi、尼泊尔语ne、僧伽罗语siseg_my.py从 WAT2020 缅甸语数据包中提取并做 Python 2→3 适配tokenizers/thirdparty/seg_my.py缅甸语mypip 包pythainlp、sacrebleu、indic-nlp-libraryPython 环境泰语th、评测、印度语言族脚本开头使用set -e任一环节失败即中止因此需要保证网络可访问 GitHub、bitbucket 等源站。另外脚本为 mosesdecoder 固定了提交号原因在注释中写明To deal with differences in handling vs 处理撇号与双引号行为差异这保证了跨环境分词结果的一致性——这正是可复现评测的关键。2.2 阿拉伯语的单独安装如果你要评估阿拉伯语ar模型通用脚本无法满足需求。文档要求按照 http://alt.qcri.org/tools/arabic-normalizer/ 的说明安装 QCRI 阿拉伯语归一化工具。仓库中的 tokenizer_ar.sh 展示了完整用法脚本先echo提示安装地址并以exit 1退出避免在未配置环境时误执行随后你需要在脚本中填写三个变量SVMTOOL... GOMOSESGO... QCRI_ARABIC_NORMALIZER...并设置PERL5LIB指向 SVM 工具库与 MADA-3.2export PERL5LIB$SVMTOOL/lib:$GOMOSESGO/bin/MADA-3.2:$PERL5LIB实际处理时脚本将 stdin 的文本写入临时文件调用 QCRI 归一化脚本qcri_normalizer_mada3.2_aramorph1.2.1.sh再把.mada_norm-aramorph.europarl_tok结果输出到 stdout。也就是说阿拉伯语分词 MADA 形态消歧 归一化 Europarl 风格分词远超普通规则分词器的能力范围。三、tok.sh 分语言分词流水线详解tok.sh 是整个评测管线的核心。它是一个纯 stdin→stdout 的流式过滤器用法为sh tok.sh 目标语言代码脚本内部通过lg$1读取目标语言代码用 if/elif 分支为不同语言选择不同流水线。下面按分支逐一说明其源码实现。3.1 通用流水线默认分支对大多数语言走的是 Moses 经典四步流水线cat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | $TOKENIZER -no-escape -threads $N_THREADS -l $lg即依次执行replace-unicode-punctuation.perl将 Unicode 标点替换为 ASCII 等价标点normalize-punctuation.perl -l $lg按语言规范归一化标点remove-non-printing-char.perl剔除不可打印控制字符tokenizer.perl -no-escape -threads 8 -l $lgMoses 分词器8 线程并行-no-escape保持 XML 转义字符原样。N_THREADS8在脚本顶部定义可自行调整。3.2 中文zhcat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | python $CHINESE_TOKENIZER前三步仍是 Moses 管线最后一步交给 tokenize_zh.py。该脚本实现极为简洁遍历 stdin 每行直接调用sacrebleu.tokenize_zh(line)输出。这一设计意味着中文评测分词与sacrebleu官方行为完全一致避免第三方分词器引入的评测偏差。3.3 泰语thcat - | python $THAI_TOKENIZER泰语属于无空格语言直接交给 tokenize_thai.py调用pythainlp.word_tokenize(line)把分词结果用空格拼接输出。注意泰语分支不经过 Moses 管线因为空格分词规则对泰语无意义。3.4 日语jacat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | ${JA_SEGMENT}经过 Moses 标点处理后交给 seg_ja.sh。该脚本先定位 KyTea 安装路径并导出LD_LIBRARY_PATH与PATH然后执行cat - | tr -d [:blank:] | kytea -notags即先删除所有空白字符日语文本本无空格再由 KyTea 以-notags模式输出纯分词结果不带词性/读音标签。3.5 韩语kocat - | $REM_NON_PRINT_CHAR | ${KO_SEGMENT}韩语仅做不可打印字符清理后交给 seg_ko.sh配置 mecab-0.996-ko 的PATH与LD_LIBRARY_PATH后执行mecab -O wakati即采用 mecab-ko 词典的分词结果-O wakati输出空格分隔的形态素。3.6 罗马尼亚语rocat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | $NORMALIZE_ROMANIAN | $REMOVE_DIACRITICS | $TOKENIZER -no-escape -threads $N_THREADS -l $lg罗马尼亚语是唯一在 Moses 管线基础上叠加两步特殊处理的语言normalise-romanian.py连字符归一化与remove-diacritics.py去变音符随后再走tokenizer.perl。这一做法与 WMT16 评测约定一致能显著减少拼写变体导致的虚假 BLEU 损失。3.7 缅甸语mycat - | python ${MY_SEGMENT}直接调用seg_my.py由 install 脚本从 WAT2020 数据包适配而来已做 Python 3 化sys.std→ 注释、unichr→chr。3.8 阿拉伯语arcat - | ${AR_TOKENIZER}直接调用 tokenizer_ar.sh 完成 MADA 形态归一化与分词细节见本文 2.2 节。3.9 印度语言族hi / ne / sicat - | python ${IN_TOKENIZER} $lg三种印度语言印地语 hi、尼泊尔语 ne、僧伽罗语 si共用 tokenize_indic.py。源码显示其核心逻辑为factory IndicNormalizerFactory() normalizer factory.get_normalizer(sys.argv[1], remove_nuktasFalse, nasals_modedo_nothing) for line in sys.stdin: normalized_line normalizer.normalize(line.strip()) tokenized_line .join(trivial_tokenize(normalized_line, sys.argv[1])) print(tokenized_line)即先使用indic-nlp-library按语言做文字归一化保留 nukta鼻音处理为 no-op再做 trivial tokenize按天城体/婆罗米系文字音节边界切分。3.10 分支总览语言代码处理流水线底层工具zhMoses 三步 sacrebleu.tokenize_zhsacrebleuthpythainlp.word_tokenizepythainlpjaMoses 标点处理 KyTea 无标签分词KyTeako清理 mecab -O wakatimecab-koroMoses 四步 连字符归一化 去变音符wmt16-scripts Mosesmy专用缅甸语分词脚本seg_my.pyarQCRI 形态归一化 MADA 分词QCRI Arabic Normalizerhi / ne / siindic-nlp 归一化 trivial tokenizeindic-nlp-library其余语言Moses 四步流水线mosesdecoder四、端到端 BLEU 评估复现步骤4.1 完整评测命令按照 tokenizers/README.md 的说明复现评测只需以下三步tgt_lang... reference_translation... # 1) 从模型生成输出中提取假设hypothesis cat generation_output | grep -P ^H | sort -V | cut -f 3- | sh tok.sh $tgt_lang hyp # 2) 对参考译文做同样的分词 cat $reference_translation | sh tok.sh $tgt_lang ref # 3) 计算 BLEU sacrebleu -tok none ref hyp各命令的作用拆解grep -P ^Hfairseq-generate 输出中假设行以H-开头另有S-源句、T-目标参考、D-带分数详细输出等因此只保留假设行sort -V按版本号顺序自然排序保证多行输出按序号正确排列避免字典序如H-10排在H-2前造成错位cut -f 3-fairseq 输出格式为H-id\tscore\t译文这里丢弃序号与分数仅保留第 3 列起的译文文本sh tok.sh $tgt_lang按上一节的分语言流水线对译文分词sacrebleu -tok none ref hyp由于两侧都已分词完毕BLEU 计算时关闭sacrebleu自身分词-tok none避免重复分词破坏对齐。4.2 与主 README 生成流程的衔接上述命令在 examples/m2m_100 主 README 的Evaluation with M2M-100一节有完整示例先使用fairseq-generate产出gen_out再进入 tokenizers 目录执行cd ${fairseq}/examples/m2m_100 cat ${fairseq}/gen_out | grep -P ^H | sort -V | cut -f 3- | sh tok.sh fr hyp cat ${fairseq}/raw_input.de-fr.fr | sh tok.sh fr ref注意两个关键点tok.sh必须在examples/m2m_100目录下运行脚本内部通过相对路径如$TOKENIZERS_SCRIPTS/tokenizer_ar.sh、thirdparty/kytea引用工具脱离该目录会找不到分词脚本与第三方依赖参考译文同样必须经过tok.sh假设hyp与参考ref必须经过完全一致的分词BLEU 才具有可比性。4.3 前置数据准备若要完整走通评测链路还需按主 README 准备数据生成数据WMT 测试集可用sacrebleu -t wmt14 -l fr-en --echo src/ref直接导出WAT、FLORES、TED需 Moses detokenize、Autshumato、Tatoeba Challenge 等数据集各有获取方式详见 主 README 第 0 节SentencePiece 模型下载spm.128k.model在数据预处理阶段用scripts/spm_encode.py将数据编码为 piece 格式模型与词表418M / 1.2B 模型使用model_dict.128k.txt与language_pairs_small_models.txt12B 模型使用language_pairs.txt及对应 GPU 配置的 checkpoint。五、评测注意事项与常见坑文件名拼写差异文档中写的是install_dependencies.sh仓库中实际文件为 install_dependecies.sh执行前请确认。阿拉伯语不可直接评测未配置 QCRI 工具前tokenizer_ar.sh会输出提示并以exit 1退出评测流程将中断这是设计上的强制检查。日语/韩语依赖本地编译KyTea 与 mecab-ko 需要autoreconf/./configure/make编译链缺少 gcc、autoconf 等工具时安装会失败。Python 版本seg_my.py由 install 脚本做了 Python 2→3 适配tokenize_indic.py、tokenize_thai.py、tokenize_zh.py均为 Python 3 脚本需保证python命令指向 Python 3。分词与 BPE 的区别tok.sh做的是词法/形态级切分用于评估对齐模型侧的子词切分由 SentencePiece 在数据预处理阶段完成两者在评测管线中各司其职不可互相替代。12B 模型评测需流水线并行12B checkpoint 按 GPU 数2×32GB / 4×16GB / 6×12GB / 8×8GB提供不同版本并需配合--pipeline-encoder-balance、--pipeline-decoder-balance等参数使用具体取值见 主 README 的 12B 模型章节生成之后再进入本文所述的分词与 BLEU 环节。六、小结M2M-100 的分语言评测体系由三个层次构成流式分发层tok.sh按语言路由、工具层Moses / KyTea / mecab / pythainlp / indic-nlp / QCRI / sacrebleu、集成层grep | sort -V | cut | tok.sh | sacrebleu的管道范式。理解这套分层后你可以复现 M2M-100 论文中的 BLEU 指标并对任意 100 种语言对做标准化评测在 edgelm/examples/m2m_100/tokenizers 目录中扩展新的语言分支新增elif [ $lg xx ]分支并配套分词脚本将同一套分语言分词范式迁移到其他多语言模型的评测中。仓库源码tok.sh、install_dependecies.sh、tokenizers 目录是理解这套流程的第一手资料建议结合主 README 中的数据处理与生成章节一并阅读。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →