File size: 3,453 Bytes
86fe6bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# 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。