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