unilm 仓库 ML50 多语言数据管道:从下载、去重清洗到 BPE 二值化的完整实战指南

发布时间:2026/9/13 18:07:57

unilm 仓库 ML50 多语言数据管道:从下载、去重清洗到 BPE 二值化的完整实战指南 unilm 仓库 ML50 多语言数据管道从下载、去重清洗到 BPE 二值化的完整实战指南【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文聚焦 decoding/IAD/fairseq/examples/multilingual/data_scripts 目录下针对ML5050 语言多语言翻译数据集的一站式数据处理管线。这套工具链覆盖了从「并行语料下载」→「语言识别过滤」→「去重」→「剔除 valid/test 泄漏句」→「SentencePiece BPE 编码」→「fairseq-preprocess 二值化」的完整流程是多语言mBART / mT5 等模型训练数据准备的标准参考实现。读完本文你将掌握如何复现 mBART50 风格的 50 语言训练语料构建全流程并能深入理解每个处理步骤的源码级原理。一、工具链总览与数据流向ML50 数据管线位于仓库的 decoding/IAD/fairseq/examples/multilingual/data_scripts 目录。核心思想是多个来源的平行语料 → 统一命名为train.lang_pair.lang格式的文本 → 逐级清洗 → 产出可直接被 fairseq 读取的二进制数据。整个流水线由两个 bash 脚本驱动阶段脚本输出下载download_ML50_v1.sh$WORKDIR_ROOT/ML50/raw预处理preprocess_ML50_v1.sh$WORKDIR_ROOT/ML50/dedup、$WORKDIR_ROOT/ML50/clean、二值化结果其中预处理阶段又细分为三个 Python 步骤每个步骤的职责如下表所示步骤脚本输入 → 输出职责去重dedup_all.pyraw→dedup按「源句-目标句」二元组去重清洗remove_valid_test_in_train.pydedup→clean从训练集中剔除与 valid/test 重叠的句子二值化binarize.pyclean→ BPE → databinSPM 切词 fairseq-preprocess二、环境准备依赖与关键环境变量2.1 安装依赖脚本执行前需要先安装 Python 依赖原文档给出的命令为pip install -r requirement.txt其中 requirement.txt 内容极简只有两个包wget命令行下载工具pandas用于清洗阶段生成数据清理统计报表clean_summary.tsv/actual_clean_summary.tsv。除此之外下载阶段还会动态安装fasttext用于语言识别过滤见 download_wmt20.sh 中的prepare_lid()。2.2 核心环境变量所有脚本都依赖两个环境变量未设置时会直接报错退出例如 dedup_all.py 与 binarize.py 均在入口处做了校验变量用途示例WORKDIR_ROOT所有工作文件的根目录下载的语料会落在$WORKDIR_ROOT/ML50/data/workspace/ml50SPM_PATH指向已安装的 SentencePiece 的spm_encode.py脚本路径预处理阶段使用/path/to/sentencepiece/spm_encode.py下载阶段只需WORKDIR_ROOTexport WORKDIR_ROOTa directory which will hold all working files预处理阶段则需要同时配置两个变量export WORKDIR_ROOTa directory which will hold all working files export SPM_PATHa path pointing to sentencepiece spm_encode.py注意原文档要求预先安装 SentencePiece 并确保spm_encode.py可被 Python 直接执行。SPM_PATH指向的是spm_encode.py本身而不是 SentencePiece 的安装目录。三、数据下载多来源并行语料的汇聚运行 download_ML50_v1.sh 即可触发全部数据源下载bash ./download_ML50_v1.sh该脚本内部按顺序调用以下下载子脚本把不同来源的语料统一拷贝到$WORKDIR_ROOT/ML50/raw子脚本数据来源download_wmt20.shWMT20 低资源语言ja、ta、km、ps、iu、cs、de、pl、ru、zh 等同时安装 fasttext、Moses 等辅助工具download_wmt19_and_before.pyWMT19 及更早的平行语料download_wat19_my.sh缅甸语 WAT19 语料download_ted_and_extract.pyTED 演讲平行语料download_lotus.sh印度语言ml、ur、te 等语料download_iitb.shIITB 印地语-英语语料download_af_xh.sh南非荷兰语af、科萨语xh语料download_iwslt_and_extract.shIWSLT 语料download_flores_data.shFLORES 评测数据3.1 下载阶段的处理逻辑以 WMT20 为例download_wmt20.sh 是下载阶段最复杂的脚本它展示了多语言语料构建的两个通用技巧1多源并行 统一符号链接每个语言对如prepare_ja、prepare_ta都会并行wait下载多个子语料Paracrawl、WikiTitles、WikiMatrix、NewsCommentary、UN 语料等并统一建立*.ja、*.en之类的软链接最后cat合并为all.xx再统一输出find ./ -maxdepth 1 -name *.ja | sort -V | xargs cat all.ja find ./ -maxdepth 1 -name *.en | sort -V | xargs cat all.en lid_filter ja all.ja $DEST/train.ja_XX-en_XX.ja_XX en all.en $DEST/train.ja_XX-en_XX.en_XX2fastText 语言识别过滤lid_filter借助 fasttext_multi_filter.py 和 fasttext 官方预训练的lid.176.bin语言识别模型脚本会自动下载到$WORKDIR/fasttext/lid.176.bin对平行语料的每一行判断其语言只有当源句和目标句的语言识别结果与期望语言完全一致时才保留该句子对否则跳过并计数if not all(a b for a, b in zip(preds, args.langs)): skip_cnt 1 continue for line, output_h in zip(lines, outputs): print(line.strip(), fileoutput_h)该脚本使用multiprocessing.Pool并行默认 10 个 worker、chunk 500 行是大规模语料过滤的关键性能保障。3.2 下载完成的目录约定下载完成后全部原始语料位于$WORKDIR_ROOT/ML50/raw文件命名遵循 fairseq 约定{split}.{src}-{tgt}.{lang}例如train.ja_XX-en_XX.ja_XX。注意这里的语言标签使用 mBART50 风格的带地区后缀形式如ja_XX、en_XX、ta_IN、zh_CN。已知注意事项脚本注释中明确标出部分数据源需要手动认证才能下载脚本中有 TODO 提示IWSLT 的下载 URL 曾经变更、globalvoices 的 URL 也已失效执行时可能需要对相应脚本做修复或手动下载。四、预处理去重 → 清洗 → BPE 二值化下载完成后执行预处理脚本export WORKDIR_ROOTa directory which will hold all working files export SPM_PATHa path pointing to sentencepiece spm_encode.py bash ./preprocess_ML50_v1.sh该脚本的核心逻辑见 preprocess_ML50_v1.shML50${WORKDIR_ROOT}/ML50 mkdir -p $ML50/dedup mkdir -p $ML50/cleaned_dedup python ./dedup_all.py --from-folder $ML50/raw --to-folder $ML50/dedup python ./remove_valid_test_in_train.py --from-folder $ML50/dedup --to-folder $ML50/clean python ./binarize.py --raw-folder $ML50/clean对应的三个中间目录含义原文档明确给出$WORKDIR_ROOT/ML50/raw解压后的原始数据$WORKDIR_ROOT/ML50/dedup去重后的数据$WORKDIR_ROOT/ML50/clean从去重数据中移除 valid/test 句子后的数据。4.1 第一步句子对去重dedupdedup_all.py 会自动扫描--from-folder下的所有train*文件解析出所有语言对方向--directions可手动指定逗号分隔然后对每个方向调用 utils/dedup.py 中的deup()函数。去重的核心实现非常朴素而高效以(源句, 目标句) 二元组作为 key 维护一个seen集合首次出现则写入输出文件重复出现则跳过并累加重复计数def deup(src_file, tgt_file, src_file_out, tgt_file_out): seen set() dup_count 0 with open(src_file, encodingutf-8) as fsrc, \ open(tgt_file, encodingutf-8) as ftgt, \ open(src_file_out, w, encodingutf-8) as fsrc_out, \ open(tgt_file_out, w, encodingutf-8) as ftgt_out: for s, t in zip(fsrc, ftgt): if (s, t) not in seen: fsrc_out.write(s) ftgt_out.write(t) seen.add((s, t)) else: dup_count 1 print(fnumber of duplication: {dup_count})由于多语言训练语料经常来自多个来源如 WMT 与 OPUS、CommonCrawl 之间高度重叠这一步骤能显著压缩训练集规模、避免模型在重复数据上过拟合。4.2 第二步剔除 valid/test 泄漏cleanremove_valid_test_in_train.py 是这套管线的「质检」环节目的是防止训练集与评测集valid/test句子重叠造成评测分数虚高。其处理逻辑分为三个阶段汇总全部 valid/test 句子get_all_test_data()收集所有方向的 valid 与 test 文件含反向tgt-src方向构建句子全集all_valid_test_data扫描训练集找出泄漏check_train_all()逐方向比对凡训练行中源句或目标句出现在 valid/test 集合中的记入mess_up_train并统计每个方向需要删除的条数与百分比写回清洗后的数据remove_messed_up_sentences()逐行过滤只有「源句、目标句均不在 mess_up 集合中」且「(s,t)、(t,s) 句子对均不在 valid/test 句子对集合中」的行才保留写入--to-foldervalid/test 以及未受影响方向的训练文件则直接shutil.copyfile拷贝过去。该脚本还会生成两份统计报表供数据审计clean_summary.tsv预测清理量基于句子级去重前的估算actual_clean_summary.tsv实际清理量因为存在重复句子实际值与预测值可能不同。报表列包括direction、train_size_after_remove、orig_size、num_to_remove、remove_percent。4.3 第三步SentencePiece 切词与 fairseq 二值化binarize.py 完成从纯文本到 fairseq 二进制格式的转换分为两个子阶段1自动下载 mBART50 的 SPM 模型与词表脚本启动时若检测不到本地文件会自动下载文件保存在$WORKDIR_ROOT下SPM_MODEL f{WORKDIR_ROOT}/sentence.bpe.model SPM_VOCAB f{WORKDIR_ROOT}/dict_250k.txt if not os.path.exists(SPM_MODEL): call(fwget https://dl.fbaipublicfiles.com/fairseq/models/mbart50/sentence.bpe.model -O {SPM_MODEL}) if not os.path.exists(SPM_VOCAB): call(fwget https://dl.fbaipublicfiles.com/fairseq/models/mbart50/dict_250k.txt -O {SPM_VOCAB})可见该管线默认对齐mBART50的 25 万词表dict_250k.txt与对应 SPM 模型——这正是本仓库多语言模型方案的核心配套资源。2SPM 编码 fairseq-preprocessencode_spm()对每个方向的 train/valid/test 三个 split 执行spm_encode.py以piece格式输出 BPE 文本随后binarize()/binarize_()调用fairseq-preprocess生成二进制数据cmds [ fairseq-preprocess, f--source-lang {src} --target-lang {tgt}, f--destdir {databin_dir}/, f--workers 8, ] # 使用 mBART50 的 joined dictionary cmds.extend([f--joined-dictionary, f--srcdict {spm_vocab}])关键参数说明--joined-dictionary --srcdict dict_250k.txt源/目标共享同一份 25 万词表多语言模型的标配做法--workers 8并行预处理进程数--trainpref/--validpref/--testpref按train.bpe、valid.bpe、test.bpe前缀自动拼接传入。脚本还支持pairs_per_shard分片模式binarize()中的shard*目录逻辑当语料过大时可将 train 切分成多个 shard 分别二值化而 valid/test 只在首个 shard 中二值化一次、其余 shard 通过符号链接共享从而避免重复劳动。五、目录结构与命名规范速查整个管线最终在$WORKDIR_ROOT/ML50下形成如下结构$WORKDIR_ROOT/ML50/ ├── raw/ # 原始语料train/valid/test.{src-tgt}.{lang} ├── dedup/ # 去重后的语料 ├── clean/ # 剔除 valid/test 泄漏后的语料含 clean_summary.tsv ├── bpe/ # SPM piece 切词结果{direction}/train.bpe.{lang} 等 └── databin/ # fairseq 二进制数据{direction}/ 下含 .bin/.idx/dict 文件配套的辅助脚本还包括check_iswlt_test_data.py、check_self_overlaps.py、check_valid_test_overlaps.py数据质量核查工具utils/strip_sgm.sh剥离 WMT 评测数据的 SGM/XML 标签utils/dedup.py 与 utils/fasttext_multi_filter.py去重与语言过滤的可复用工具模块。六、实战建议与已知限制磁盘与带宽规划ML50 多源语料体积巨大仅 WMT20 就包含数十 GB 压缩包建议WORKDIR_ROOT指向大容量磁盘且下载脚本默认保留中间文件脚本注释中标注了 TODO需要手动清理$TMP_DIR。依赖可重复性下载阶段会pip install fasttext、git clone mosesdecoder、下载lid.176.bin首次运行耗时较长若网络受限可提前手动准备这些资源再复用脚本。失效链接与手动认证脚本注释中明确标注 IWSLT 与 globalvoices 的 URL 已变化、部分网站需要手动认证下载复现时请优先检查 download_iwslt_and_extract.sh 与 download_flores_data.sh 的可用性。评测公平性remove_valid_test_in_train.py是防止数据泄漏的关键步骤其输出的actual_clean_summary.tsv中remove_percent可用于评估各方向的数据污染程度建议作为训练前必查指标。词表对齐默认二值化采用 mBART50 的 25 万共享词表若要自训 SPM 模型可替换SPM_MODEL/SPM_VOCAB两个变量并确保所有语言方向使用同一词表以支持多语言联合训练。结语ML50 数据管线展示了工业级多语言语料构建的标准范式多源下载 → 语言识别过滤 → 句子对去重 → 评测集泄漏剔除 → 共享词表 BPE → 并行二值化。其「数据质量优先」的设计尤其是 valid/test 泄漏检测对任何多语言预训练任务都有直接的借鉴价值。读者可直接复用本仓库 data_scripts 目录下的脚本结合自身语料格式微调后快速搭建属于自己的多语言训练数据流水线。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/13 18:07:57

PDFPatcher(PDF补丁丁):免费一站式 PDF 处理完整指南

PDFPatcher(PDF补丁丁):免费一站式 PDF 处理完整指南 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 …

2026/9/13 18:07:57

LunaTranslator OCR实操指南:5步搞定游戏文字识别配置

LunaTranslator OCR实操指南:5步搞定游戏文字识别配置 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 某款视觉小说的对话栏带飘花特效,OCR结果每…

2026/9/13 18:53:00

工业边缘智能的三大硬约束与落地铁律

1. 这不是“加个AI模块”就能叫智能——工业控制里“智能”的真实门槛在哪里很多人看到“智造”“边缘计算”“工业智能”这几个词,第一反应是:给PLC装个摄像头,接个云平台,再跑个YOLO模型,是不是就算完成了&#xff1…

2026/9/13 18:53:00

相关杂波生成与ZMNL方法:雷达海杂波仿真的关键

简介:面向无线通信与雷达系统中的相关杂波建模,MATLAB仿真资源包聚焦多类统计模型,适用于信号处理、通信工程等领域的研究生与研发工程师,可用于生成和分析多种统计分布的杂波场景。压缩包内共9个m文件,均为可直接运行…

2026/9/13 18:47:59

飞控二次开发路径详解:从树莓派外挂到源码级修改

开头先聊一个挺普遍的现象:我周围不少朋友一接到飞控二次开发的需求,第一反应就是去拉开源飞控的源码,然后埋头开始读。读了两周,文件目录还没理清楚,该写的功能反而一点没动。飞控二次开发和普通嵌入式项目不一样&…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码