ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Perso-Arabic 脚本归一化实验复现:Sindhi→English NMTMediumV1 配方详解(OpenNMT-tf 实战)

Perso-Arabic 脚本归一化实验复现:Sindhi→English NMTMediumV1 配方详解(OpenNMT-tf 实战) Perso-Arabic 脚本归一化实验复现Sindhi→English NMTMediumV1 配方详解OpenNMT-tf 实战【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research本文面向需要复现 Graphemic Normalization of the Perso-Arabic ScriptarXiv:2210.12273中神经机器翻译NMT实验的研究者与工程师。以仓库内perso_arabic_norm/data/neural/recipe/snd/NMTMediumV1/配方为蓝本完整讲解从构建 5 万词级词表、逐 epoch 训练/推理/评估到读取归一化前后对比结果的完整链路。读完本文你将能独立跑通 Sindhi→English 中规模 NMT 训练并理解data.yml、tokenizer.yml、train.sh三个关键文件各自承担的角色进而可平移到 ckb、uig、urd 以及多语种multi配方。配方在项目中的定位perso_arabic_norm是 Perso-Arabic 文字归一化研究的配套代码。其 NMT 部分见 README.md使用 OpenNMT-tfTensorFlow 版构建简单的 LSTM 编码器-解码器加注意力模型研究脚本归一化对翻译质量的影响。实验覆盖四种单语种 Perso-Arabic 书写系统——Sorani Kurdishckb、Sindhisnd、Uyghuruig、Urduurd——以及一个多语种到英语multi设置。根据训练数据量选择两档超参配置NMTSmallV1用于较小语料NMTMediumV1用于较大语料如多语种模型。本文聚焦的snd/NMTMediumV1正是 Sindhi 语料量较大时使用的配方。所有配方统一存放于 data/neural/recipe 目录每个配方由四个文件组成文件作用README.md记录跑通训练所需的核心 OpenNMT 命令序列tokenizer.yml定义分词器tokenizer行为data.yml描述训练/验证/测试数据与核心训练参数train.sh端到端训练 逐 epoch 推理 SacreBLEU 评估脚本三步启动从依赖安装到后台训练目标 README 给出的完整启动命令序列如下也可参见父级文档 README.md 中基于urd/NMTMediumV1的等价说明# 安装依赖。 pip3 install tensorflow OpenNMT-tf sacrebleu # 构造分词器词表。 cd data/neural/recipe/snd/NMTMediumV1 onmt-build-vocab --tokenizer_config tokenizer.yml --size 50000 --save_vocab src-vocab.txt src-train.txt onmt-build-vocab --tokenizer_config tokenizer.yml --size 50000 --save_vocab tgt-vocab.txt tgt-train.txt # 运行训练与评估脚本后台运行日志写入 train.log。 (nohup ./train.sh train.log 21) /dev/null 21 三步的含义分别是依赖安装tensorflow与OpenNMT-tf提供训练/推理引擎sacrebleu负责 BLEU、chrF2、TER 评分与成对显著性检验词表构建对源语言Sindhi与目标语言English的训练语料各执行一次onmt-build-vocab按分词器配置产出src-vocab.txt与tgt-vocab.txt词表上限 50,000训练评估以nohup后台运行train.sh标准输出与错误重定向到train.log外层 /dev/null 21使整条命令完全脱离终端会话适合长周期训练。tokenizer.ymlPerso-Arabic 文本的分词策略tokenizer.yml 内容如下type: OpenNMTTokenizer params: mode: aggressive joiner_annotate: true segment_numbers: true segment_alphabet_change: true preserve_segmented_tokens: true各参数含义与对 Perso-Arabic 文本的影响mode: aggressive使用激进分词模式对连续字符流进行较细粒度切分有助于处理无空格粘连的脚本变体joiner_annotate: true为被拆分的子词标注连接符joiner标记使模型能够还原原始 token 边界避免解码时丢失字母序列的连续性segment_numbers: true将数字与其上下文分离成独立 token减小数字形态变化对翻译的干扰segment_alphabet_change: true在字母表切换处如阿拉伯字母段与拉丁字母段交界强制切分这对混排 Perso-Arabic 与拉丁字符的语料如 Sindhi 中的英文借词尤为关键preserve_segmented_tokens: true保留切分后的 token 而非合并配合 joiner 标注使词表更稳定。同一份tokenizer.yml同时用于源端与目标端见data.yml中source_tokenization与target_tokenization均指向该文件保证两侧切分策略一致。data.yml数据声明与训练超参data.yml 是 OpenNMT-tf 的核心配置完整内容如下model_dir: run/NMTMediumV1 data: train_features_file: src-train.txt train_labels_file: tgt-train.txt eval_features_file: src-val.txt eval_labels_file: tgt-val.txt source_vocabulary: src-vocab.txt target_vocabulary: tgt-vocab.txt source_tokenization: tokenizer.yml target_tokenization: tokenizer.yml eval: scorers: bleu export_on_best: bleu max_exports_to_keep: 5 steps: 1000 train: batch_size: 64 batch_type: examples maximum_features_length: 100 maximum_labels_length: 100 save_checkpoints_steps: 1000 keep_checkpoint_max: 5 #train_steps: 100000 # One epoch. max_step: null single_pass: true逐项解读model_dir: run/NMTMediumV1模型检查点、导出模型与测试输出均落在该子目录下data段期望配方目录内存在以下文件——训练与验证的源/目标文件src-train.txt、tgt-train.txt、src-val.txt、tgt-val.txt以及词表src-vocab.txt、tgt-vocab.txt。这些文件可指向 MTData 收集的原始语料或指向归一化后的语料即rewrites实验分支eval段以 BLEU 为评分器并按最优 BLEU 导出模型max_exports_to_keep: 5限制导出数量steps: 1000指每 1000 步执行一次验证train段batch 大小 64按样本数计源/目标最大长度均限 100每 1000 步保存检查点且最多保留 5 份。max_step: null与single_pass: true的组合使单次训练运行恰好覆盖一个 epoch——这正是train.sh外层循环逐 epoch 训练、推理、评分的基础。被注释掉的train_steps: 100000提示若想改为按固定步数训练可取消注释。train.sh逐 epoch 的「训练—推理—评估」流水线train.sh 是整个配方的执行主体关键逻辑如下节选MODELNMTMediumV1 NUM_EPOCHS8 SOURCE_LANGsnd TARGET_LANGeng MODEL_DIRrun/${MODEL} TEST_DIR${MODEL_DIR}/test TEST_BASENAMES(test1) mkdir -p ${TEST_DIR} for epoch in $(seq ${NUM_EPOCHS}) ; do echo Training Epoch ${epoch} onmt-main --model_type ${MODEL} --config data.yml --auto_config train --with_eval echo Inference ${epoch} for test_basename in ${TEST_BASENAMES[]} ; do TEST_SOURCE_FILE${test_basename}.${SOURCE_LANG} TEST_REF_FILE${test_basename}.${TARGET_LANG} TEST_HYP_FILE${TEST_DIR}/${test_basename}.${TARGET_LANG}.epoch${epoch} onmt-main --config data.yml --auto_config infer \ --features_file ${TEST_SOURCE_FILE} --predictions_file ${TEST_HYP_FILE} TEST_RESULTS_FILE${TEST_DIR}/${test_basename}.results.epoch${epoch} sacrebleu ${TEST_REF_FILE} -i ${TEST_HYP_FILE} -m bleu chrf ter -w 4 ${TEST_RESULTS_FILE} done done脚本核心要点共 8 个 epoch每个 epoch 内执行三个动作onmt-main --model_type NMTMediumV1 --config data.yml --auto_config train --with_eval--model_type直接引用模型名--auto_config自动补齐该模型的默认网络结构LSTM 编码器-解码器 注意力--with_eval开启验证推理阶段读取测试源文件test1.snd将翻译输出写到run/NMTMediumV1/test/test1.eng.epoch${epoch}评分阶段用sacrebleu对参考文件test1.eng与假设文件计算BLEU、chrFchrF2、TER三种指标-w 4指定 4 位小数精度结果写入test1.results.epoch${epoch}。注意对脚本中引用的测试文件test1.snd、test1.eng需确保存在否则脚本会以非零状态退出。multi/NMTMediumV1配方额外提供了 eval_multi.sh展示了多语种场景下如何按固定行区间Sindhi 1000 行、ckb/uig/urd 各 2000 行从混合测试输出中切分各语言假设并分别评分可作为扩展阅读。训练数据的来源与规模平行语料通过 MTDatamtdata get -l snd-eng -tr OPUS-ccmatrix-v1-eng-snd OPUS-xlent-v1.1-eng-snd \ OPUS-tanzil-v1-eng-snd OPUS-qed-v2.0a-eng-snd OPUS-wikimedia-v20210402-eng-snd \ -ts OPUS-tatoeba-v20210722-eng-snd -dv OPUS-ubuntu-v14.10-eng-snd \ --merge -o out-dir其中-tr指定训练集ccmatrix、xlent、tanzil、qed、wikimedia 五个 OPUS 子集合并-ts指定测试集Tatoeba-dv指定验证集Ubuntu。训练语料的具体规模记录在 train.stats.json 中合计约 196 万句对其中OPUS-ccmatrix-v1-eng-snd贡献约 171.7 万句是最主要的数据来源OPUS-qed-v2.0a-eng-snd仅 1 句属于边缘子集。测试集说明见 data/neural/results/snd/README.mdtest1是从OPUS-ccmatrix-v1-eng-snd留出的 1,000 句。实验产物与归一化效果对比训练完成后产物分为两类运行产物位于run/NMTMediumV1/含检查点、导出模型、test/下的逐 epoch 假设与评分论文配套结果位于 data/neural/results/snd/NMTMediumV1结构为original/在未归一化平行语料上训练得到的模型结果rewrites/在归一化平行语料上训练得到的模型结果每个子目录内含 8 个 epoch 的假设文件test1.eng.epoch1~8与评分文件test1.results.epoch1~8顶层还有最终第 8 epoch 的成对显著性检验结果test1.paired-ar.epoch8SacreBLEU Paired Approximate Randomization 检验与test1.paired-bs.epoch8Paired Bootstrap Resampling 检验。跨模型对比可直接使用 analyze_nmt_metrics.pypip3 install absl-py numpy pandas statsmodels RESULTS_DIRdata/neural/results/snd/NMTMediumV1/ python analyze_nmt_metrics.py \ --baseline_metrics_dir ${RESULTS_DIR}/original/ \ --test_metrics_dir ${RESULTS_DIR}/rewrites/ \ --metric_file_basenames test1 \ --num_epochs 8该工具对original基线与rewrites归一化逐 epoch 进行统计显著性比较输出与 n-gram 实验同源的三种检验结果Welch t 检验、Mann-Whitney U 检验、Brunner-Munzel 检验从而定量回答「脚本归一化是否显著提升 Perso-Arabic 语种的 NMT 质量」。复现要点与常见注意项数据文件前置data.yml期望的src-train.txt、tgt-train.txt、src-val.txt、tgt-val.txt需先就位于配方目录或经符号链接指向语料目录归一化分支则指向normalize_text工具见 normalize_text.py 与父级 README处理后的重写语料词表仅需构建一次src-vocab.txt/tgt-vocab.txt由训练语料离线生成8 个 epoch 共用单 epoch 语义max_step: nullsingle_pass: true使每次train.sh迭代只训练一个完整 epoch因此检查点与导出模型按 epoch 递增后台运行README 中的nohup包装可保证 SSH 断开后训练不中断进度通过train.log跟踪指标口径BLEU/chrF/TER 均来自 SacreBLEU-w 4保证结果文件中的数值精度与仓库内*.results.epoch*文件格式一致便于直接与已发布结果对齐。小结snd/NMTMediumV1配方是理解整个 Perso-Arabic 归一化 NMT 实验的最小完整闭环三条命令完成词表构建与后台训练data.yml控制数据与超参tokenizer.yml处理多脚本混排文本的分词train.sh将训练、推理与 SacreBLEU 评分串成 8 个 epoch 的流水线。把握这套结构后将其中的snd替换为ckb、uig、urd即可复现其余单语种实验而 multi/NMTMediumV1 配方则展示了多语种训练的扩展方式——这正是论文中归一化影响评估的全部实验矩阵。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表