NLP from Scratch 自学笔记
NLP From Scratch
NLP From Scratch: Classifying Names with a Character-Level RNN
我们将构建并训练一个基础的字符级循环神经网络(RNN)来实现词汇分类
字符级RNN将单词作为字符序列进行读取,在每一步输出预测结果和hidden state,并将其前一步的hidden state输入到下一个步骤。以最终的预测结果作为输出,即判断该词汇属于哪个类别
我们将使用来自18种语源的数千个姓氏进行训练,然后根据拼写来预测名字的来源语言
Preparing Torch
- 设置 torch 默认使用对应硬件所支持的设备(CPU 或 CUDA)以实现 GPU 加速
1 | import torch |
Preparing the Data
data/names 目录中包含 18 个名为 [Language].txt 的文本文件。每个文件包含若干姓名,每行一个姓名,大多已罗马化(但我们仍需将 Unicode 转换为 ASCII)
第一步是定义和清理数据。首先需要将 Unicode 转换为纯 ASCII 以限制 RNN 输入层维度。通过将 Unicode 字符串转换为 ASCII 并仅允许保留特定字符集来实现
1 | import string |
Turning Names into Tensors
现在我们已经整理好所有姓名,需要将其转换为 Tensor 才能进行后续处理
表示单个字母时,我们使用大小为 <1 x n_letters> 的 “one-hot vector”。one-hot vector 除当前字母索引位置为 1 外其余全为 0,例如 “b” = <0 1 0 0 0 …>
对于单词而言,我们将多个 one-hot vector 组合成二维矩阵 <line_length x 1 x n_letters>
额外的维度 1 是因为 PyTorch 默认所有输入都包含 batch 维度——这里我们使用的 batch size 为 1
1 | # Find letter index from all_letters, e.g. "a" = 0 |
可以使用类似的方法处理其他基于文本的 RNN 任务
接下来,我们需要将所有样本整合为 dataset 以便训练、测试和验证模型
为此我们将使用 Dataset 和 DataLoader 类来存储数据。每个 Dataset 需要实现三个函数:init、len 和 getitem
1 | from io import open |
使用 dataset 对象可以轻松将数据划分为 train 和 test sets。这里我们采用 80/20 的比例进行分割,但 torch.utils.data 还提供了更多实用工具
此处我们指定 generator 是因为需要使其与 PyTorch 默认使用的设备保持一致
1 | train_set, test_set = torch.utils.data.random_split(alldata, [.85, .15], generator=torch.Generator(device=device).manual_seed(2024)) |
- 现在我们已构建包含 20074 个样本的基础 dataset,每个样本都是 label 和 name 的配对组合。同时已完成 training 和 testing 的数据集划分,以便后续验证所构建的模型