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]