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),仅供参考

相关新闻

PHPStan `booleanOr.leftAlwaysTrue` 错误详解:`||` 左侧恒为 true 的短路求值检测与修复

PHPStan `booleanOr.leftAlwaysTrue` 错误详解:`||` 左侧恒为 true 的短路求值检测与修复

开发工具代码质量静态分析 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_mirrors/ph/phpstan 点击查看 免费下载 booleanOr.leftAlwaysTrue 是 PHPStan 在静态分析阶段报…

2026/9/23 1:38:31 阅读更多 →
3步搞定关键帧动画:从面试被怼到精通实战

3步搞定关键帧动画:从面试被怼到精通实战

3步搞定关键帧动画:从面试被怼到精通实战 面试时被面试官追问 CSS 关键帧动画底层原理,你支支吾吾答不上来?这种尴尬我太熟悉了。很多后端转全栈的朋友,对前端视觉细节不够敏感,导致在技术面试中频频失分。今天这篇教程,不讲虚的,直接带你从入门…

2026/9/23 1:38:31 阅读更多 →
Swift 自定义反射元数据(SE-0385)实战指南:用 `@reflectionMetadata` 构建库级声明发现机制

Swift 自定义反射元数据(SE-0385)实战指南:用 `@reflectionMetadata` 构建库级声明发现机制

文档 【免费下载链接】swift-evolution This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. 项目地址: https://gitcode.com/gh_mirrors/sw/swift-evolution 点击查看 免费下载 导读 SE-0385(Cu…

2026/9/23 1:38:31 阅读更多 →

最新新闻

医学图像分割数据集实践:骶骨腰痛脊椎分割训练避坑指南

医学图像分割数据集实践:骶骨腰痛脊椎分割训练避坑指南

简介:面向医学影像分割与深度学习研究人员,这套骶骨腰痛脊椎分割数据集提供完整的训练与验证素材。数据源自CTSpine1K,分别沿轴位面、冠状面和矢状面切分出2D图像,共划分5个类别,并去除ROI不足3%的切片,采用…

2026/9/24 0:22:27 阅读更多 →
MEC计算卸载深度强化学习实战:DQN源码解析与实验对比

MEC计算卸载深度强化学习实战:DQN源码解析与实验对比

简介:这是一份面向计算机相关专业学生与研发人员的Python深度强化学习毕设源码包,聚焦移动边缘计算(MEC)场景下的计算卸载与资源分配问题,包含基于DQN和Q-learning的算法实现,配套绘图与运行脚本&#xff0…

2026/9/24 0:22:27 阅读更多 →
信息组织核心方法论:等级列举与分面组配的对比与实战应用

信息组织核心方法论:等级列举与分面组配的对比与实战应用

信息组织这门课,我当年学的时候一度觉得它离现实生活特别远,满脑子都是分类号、排架、目录,直到后来做个人知识库整理和网站信息架构设计,才意识到这套东西简直是无处不在。等级列举和分面组配这两个词,表面上看是图书…

2026/9/24 0:22:27 阅读更多 →
DeST 2.0建筑能耗模拟软件Windows安装配置与兼容性指南

DeST 2.0建筑能耗模拟软件Windows安装配置与兼容性指南

1. 为什么 DeST 2.0 至今仍是建筑能耗模拟的硬通货搞建筑能耗模拟的人,绕不开 DeST 这个名字。DeST 全称 Designer‘s Simulation Toolkit,是清华大学建筑技术科学系从 1989 年前后就开始打磨的一套建筑环境与能耗模拟平台。它和 EnergyPlus、IES VE、De…

2026/9/24 0:22:27 阅读更多 →
wp-calypso 组件 QueryPurchaseCancellationOffers:产品取消优惠请求管理实战指南

wp-calypso 组件 QueryPurchaseCancellationOffers:产品取消优惠请求管理实战指南

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 导读 本文围绕 WordPress.com 前端仓库 wp-calypso 中的数据请求型组件 QueryPurchaseCancellati…

2026/9/24 0:22:27 阅读更多 →
Mosquitto 1.1.1 版本解析:ACL Pattern 配置热重载崩溃与 Windows 静态 C++ 符号导出修复

Mosquitto 1.1.1 版本解析:ACL Pattern 配置热重载崩溃与 Windows 静态 C++ 符号导出修复

后端消息队列消息路由 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mos/mosquitto 点击查看 免费下载 本篇技术指南围绕 Eclipse Mosquitto 于 2013 年 1 月发布的 1.1.1 维护版本展开&a…

2026/9/24 0:21:26 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →