| # EasyTranslate Data 模块使用说明 | |
| 本目录负责英中翻译任务的数据加载、清洗、分词、样本构造和动态批处理。推荐主数据集使用 WMT19 zh-en,调试或小样本实验可使用 OPUS-100 en-zh。 | |
| ## 文件职责 | |
| - `dataset.py`: 加载 WMT/OPUS/custom 数据,并提供 `TranslationDataset`。 | |
| - `tokenizer.py`: 训练 BPE tokenizer,并用 `TokenizerWrapper` 统一 tokenizer 接口。 | |
| - `preprocessing.py`: 文本标准化、长度过滤、去重。 | |
| - `collator.py`: batch padding、attention mask、动态 token batch。 | |
| ## 推荐数据集 | |
| 正式实验建议使用: | |
| ```python | |
| from easytranslate.data import load_wmt_dataset | |
| raw = load_wmt_dataset(year="19", language_pair="zh-en") | |
| ``` | |
| 快速调试建议使用: | |
| ```python | |
| from easytranslate.data import load_opus_dataset | |
| raw = load_opus_dataset(subset="en-zh") | |
| ``` | |
| 两个加载函数都会把样本统一成: | |
| ```python | |
| {"src": "English sentence", "tgt": "中文句子"} | |
| ``` | |
| ## 从文本到 DataLoader | |
| ```python | |
| from torch.utils.data import DataLoader | |
| from easytranslate.data import ( | |
| DynamicBatchSampler, | |
| TranslationCollator, | |
| TranslationDataset, | |
| preprocess_pipeline, | |
| train_bpe_tokenizer, | |
| ) | |
| src_texts = raw["train"]["src"] | |
| tgt_texts = raw["train"]["tgt"] | |
| src_texts, tgt_texts = preprocess_pipeline( | |
| src_texts, | |
| tgt_texts, | |
| lowercase_src=False, | |
| remove_punctuation=False, | |
| max_src_len=256, | |
| max_tgt_len=256, | |
| length_ratio_threshold=3.0, | |
| ) | |
| tokenizer = train_bpe_tokenizer( | |
| list(src_texts) + list(tgt_texts), | |
| vocab_size=32000, | |
| min_frequency=2, | |
| save_path="outputs/tokenizer/bpe.json", | |
| ) | |
| train_dataset = TranslationDataset( | |
| src_texts, | |
| tgt_texts, | |
| tokenizer=tokenizer, | |
| max_src_len=256, | |
| max_tgt_len=256, | |
| ) | |
| lengths = [ | |
| (len(tokenizer.encode(src, add_special_tokens=True)), len(tokenizer.encode(tgt, add_special_tokens=True))) | |
| for src, tgt in zip(src_texts, tgt_texts) | |
| ] | |
| batch_sampler = DynamicBatchSampler(lengths, max_tokens_per_batch=8192) | |
| collator = TranslationCollator(pad_token_id=tokenizer.pad_token_id) | |
| loader = DataLoader( | |
| train_dataset, | |
| batch_sampler=batch_sampler, | |
| collate_fn=collator, | |
| num_workers=4, | |
| pin_memory=True, | |
| ) | |
| ``` | |
| ## Batch 字段 | |
| `TranslationCollator` 输出: | |
| - `src_ids`: `[B, S]` | |
| - `tgt_input_ids`: `[B, T]`,以 `<s>` 开头,用于 teacher forcing | |
| - `labels`: `[B, T]`,以 `</s>` 结尾,padding 为 `-100` | |
| - `src_padding_mask`: `[B, S]`,padding 位置为 `True` | |
| - `tgt_padding_mask`: `[B, T]`,padding 位置为 `True` | |
| - `src_attention_mask` / `tgt_attention_mask`: 有效 token 为 `1` | |
| - `src_lens` / `tgt_lens`: 原始长度 | |
| ## 自定义平行语料 | |
| ```python | |
| from easytranslate.data import load_custom_dataset | |
| data = load_custom_dataset( | |
| train_src="data/train.en", | |
| train_tgt="data/train.zh", | |
| val_src="data/val.en", | |
| val_tgt="data/val.zh", | |
| test_src="data/test.en", | |
| test_tgt="data/test.zh", | |
| ) | |
| ``` | |
| ## 处理原则 | |
| - 保留英文大小写和中英文标点,默认不做 lowercase、不去标点。 | |
| - 清洗只做 Unicode NFKC、控制字符删除、空白合并。 | |
| - tokenizer 只用训练集训练,不使用验证集或测试集。 | |
| - 从零训练 Transformer 时建议使用共享 bilingual BPE;微调 NLLB 时直接使用 NLLB tokenizer。 | |