API 说明
关于数据处理的 API 变来变去,不知道到底在想什么玩意? 在 0.9 版本以前 data 相关方法是直接 torchtext 下面,如下:
torchtext.data
- torchtext.data.Example : 用来表示一个样本,数据+标签
- torchtext.vocab.Vocab: 词汇表相关
- torchtext.data.Datasets: 数据集类,getitem 返回 Example实例
- torchtext.data.Field : 用来定义字段的处理方法(文本字段,标签字段)
- 创建 Example时的预处理
- batch 时的一些处理操作。
- torchtext.data.Iterator: 迭代器,用来生成 batch
torchtext.datasets: 包含了常见的数据集.
在 0.9 版本及以后移动到 torchtext.legacy 下面,然而,到了 0.12.0 版本,又挪回去了。
数据处理及加载
torchtext对数据的处理可以概括为Field,Dataset和迭代器三部分。
Field 定义
[TABLE]
定义文本及标签对象处理方式。
-
sequential:是否把数据表示成序列,如果是False, 则不能使用分词。默认值:True。
-
lower:是否把数据转化为小写。默认值:False。
-
fix_length:在构建迭代器时,将每条文本数据的长度修改为该值,进行截断补长,用pad_token补全。默认值:None。
-
use_vocab:是否使用词典对象. 如果是False,数据的类型必须已经是数值类型。默认值:True。
数据集定义
可以直接使用内置的TabularDataset类和split类方法来实现,该类支持读取csv,tsv等格式。
[TABLE]
但是当我们需要对数据进行更多的预处理时,例如shuffle,dropout等数据增强操作时,自定义Dataset会更灵活。
构建词表、加载预训练词向量
构建词表,即给每个单词编码,也就是用数字表示每个单词,这样才能传入模型。将文本数据构建成词-索引的形式,接着,加载了预训练的词向量之后,每个词会对应一个词向量,即词-向量的形式,最后,在后面的模型训练中,我们就可以使用词嵌入矩阵了,即Embedding层。这样我们就将每个词都转换为向量了,可以输入到模型中进行训练了
最简单的方法:build_vocab()方法中传入用于构建词表的数据集。
使用预训练词向量
在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能,下面介绍如何在torchtext中使用预训练的词向量,进而传送给神经网络模型进行训练。
[TABLE]
这样预训练的词嵌入向量即完成加载。
迭代器定义
迭代器有Iterator和BucketIterator
- Iterator:跟原始数据顺序相同,构建批数据。
- BucketIterator:将长度类似的数据构建成一批数据,这样就会减少截断补长操作时的填充。
Iterator的定义方式如下:
[TABLE]
[TABLE]
BucketIterator 相比 Iterator 的优势是会自动选取样本长度相似的数据来构建批数据。但是在测试集中一般不想改变样本顺序,因此测试集使用Iterator迭代器来构建。 sort_within_batch参数设置为True时,按照sort_key按降序对每个小批次内的数据进行排序。如果我们需要padded序列使用pack_padded_sequence转换为PackedSequence对象时,这是非常重要的,我们知道如果想pack_padded_sequence方法必须将批样本按照降序排列。由此可见,torchtext不仅可以对文本数据进行很方便的处理,还可以很方便的和torchtext的很多内建方法进行结合使用。
在模型中指定Embedding层的权重
在使用预训练好的词向量时,我们需要在神经网络模型的Embedding层中明确地传递嵌入矩阵的初始权重。权重包含在词汇表的vectors属性中。以Pytorch搭建的Embedding层为例:
[TABLE]
在定义模型嵌入层的时候初始化权重:
[TABLE]
模型定义
完成上述数据处理之后,则可以定义各种模型处理相关 nlp 任务了,具体内容略去。
备忘:混淆矩阵显示
[TABLE]