9.5.dataset

为了防止词表太大,将低频词元替换为 <unk>


最后生成的 iter 接口为:

```py
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
for X, X_valid_len, Y, Y_valid_len in train_iter:
    print('X:', X.type(torch.int32))
    print('X的有效长度:', X_valid_len)
    print('Y:', Y.type(torch.int32))
    print('Y的有效长度:', Y_valid_len)
    break

# X: (2, 8) (n, ns)
# Y: 也是 (n, ns)
# 小批量中训练数据的长度统一为 num_steps(上面有),不足的用 1 即 <pad> 填充
X: tensor([[62, 25,  4,  3,  1,  1,  1,  1],
        [99, 10,  4,  3,  1,  1,  1,  1]], dtype=torch.int32)

# 可能代表的数据形如 [["I", "try", ".", <eos>, <pad>, <pad>, <pad>, <pad>], ["This", "is", ".", <eos>, <pad>, <pad>, <pad>, <pad>]]
X的有效长度: tensor([4, 4])
Y: tensor([[186,   5,   3,   1,   1,   1,   1,   1],
        [  0,   8,   4,   3,   1,   1,   1,   1]], dtype=torch.int32)
Y的有效长度: tensor([3, 4])

# <bos> 在 train_seq2seq() 中再加入

注意这并非要求网络输入层维数为 num_steps,比如 rnn 中也有 num_steps 但输入层维数就是词表大小(即一个单词的独热编码)