Pytorch学习笔记(四:Pytorchtext处理数据集)
lambda函数
首先:讲解一下python语法中的lambda函数
使用lambda的语法是
- 后面紧跟的是参数
- 然后接冒号
- 然后紧跟函数返回值。
#匿名函数
s = "hello world"
ans = (lambda x: x.split())(s)
print(ans)
'''
['hello', 'world']
'''
#给匿名函数取名字、不再匿名
tokenize = lambda x: x.split()#将英文句子x单词化。
s = "hello world"
print(tokenize(s))
'''
['hello', 'world']
'''
#通用函数定义方式
def tokenize(x):
return x.split()
torchtext处理数据集
数据预处理流程:
- 读取数据
- 获取标签、对标签进行数字化
- 观察数据分布、找到合适的长度作为截断长度
- 由文本得到训练用的mini-batch数据(分词、去除停用词、建立词汇表、将分词去除停用词后的数据转换成下标数据,也就是转换成index、将数据分成mini-batch、根据mini-batch中index对应的向量得到最终输入(一般在网络里,也就是embedding))
数据预处理流程步骤:
-
导入库并查看数据
-
使用torchtext构建数据集
-
自定义Dataset
-
构建数据集
-
构建词表
-
构建数据迭代器
-
数据用于模型训练
torchtext方便地对文本进行预处理、eq:截断补长、构建词表等
torchtext概述: torchtext对数据的处理可以概括为Field,Dataset和迭代器这三部分。
Field对象:Field对象指定要如何处理某个字段
Dataset:Dataset定义数据源信息,继承自pytorch的Dataset,用于加载数据,提供了TabularDataset可以指点路径,格式,Field信息就可以方便的完成数据加载。同时torchtext还提供预先构建的常用数据集的Dataset对象,可以直接加载使用,splits方法可以同时加载训练集,验证集和测试集。
迭代器:迭代器返回模型所需要的处理后的数据.迭代器主要分为Iterator, BucketIerator, BPTTIterator三种。可以支持batch定制。
- Iterator:标准迭代器
- BucketIerator:相比于标准迭代器,会将类似长度的样本当做一批来处理,因为在文本处理中经常会需要将每一批样本长度补齐为当前批中最长序列的长度,因此当样本长度差别较大时,使用BucketIerator可以带来填充效率的提高。除此之外,我们还可以在Field中通过fix_length参数来对样本进行截断补齐操作。
- BPTTIterator: 基于BPTT(基于时间的反向传播算法)的迭代器,一般用于语言模型中。
Field对象
Field 包含写文本处理的通用参数的设置,同时还包含一个词典对象,可以把文本数据表示成数字类型,(即转换成index形式)进而可以把文本表示成需要的tensor类型完成了分词,固定长度,去掉停用词等
sequential: 是否把数据表示成序列,如果是False, 不能使用分词 默认值: True.
use_vocab: 是否使用词典对象. 如果是False 数据的类型必须已经是数值类型. 默认值: True.
init_token: 每一条数据的起始字符 默认值: None.
eos_token: 每条数据的结尾字符 默认值: None.
fix_length: 修改每条数据的长度为该值,不够的用pad_token补全. 默认值: None.为None则按每个Batch内的最大长度进行动态padding。
tensor_type: 把数据转换成的tensor类型 默认值: torch.LongTensor.
preprocessing:在分词之后和数值化之前使用的管道 默认值: None.
postprocessing: 数值化之后和转化成tensor之前使用的管道默认值: None.
lower: 是否把数据转化为小写 默认值: False.
tokenize: 分词函数. 默认值: str.split.
include_lengths: 是否返回一个已经补全的最小batch的元组和和一个包含每条数据长度的列表 . 默认值: False.
batch_first: Whether to produce tensors with the batch dimension first. 默认值: False.
pad_token: 用于补全的字符. 默认值: "<pad>".
unk_token: 不存在词典里的字符. 默认值: "<unk>".
pad_first: 是否补全第一个字符. 默认值: False.
TEXT = data.Field(lower=True, tokenize=tokenizer, stop_words=stop_words)
LABEL = data.Field(sequential=False)
Dataset
torchtext的Dataset是继承自pytorch的Dataset,提供了一个可以下载压缩数据并解压的方法(支持.zip, .gz, .tgz)完成了读取数据问题
splits方法可以同时读取训练集,验证集,测试集
TabularDataset可以很方便的读取CSV, TSV, or JSON格式的文件,例子如下:
加载数据后可以建立词典,建立词典的时候可以使用与训练的word vector
train, val, test = data.TabularDataset.splits( path='./data/',
train='train.tsv', validation='val.tsv', test='test.tsv',
format='tsv', fields=[('Text', TEXT), ('Label', LABEL)])
TEXT.build_vocab(train, vectors="glove.6B.100d")
Iterator
Iterator是torchtext到模型的输出,它提供了我们对数据的一般处理方式,比如打乱,排序,等等,可以动态修改batch大小,这里也有splits方法 可以同时输出训练集,验证集,测试集,类似dataloader
参数如下:
dataset: 加载的数据集
batch_size: Batch 大小.
batch_size_fn: 产生动态的batch大小 的函数
sort_key: 排序的key
train: 是否是一个训练集
repeat: 是否在不同epoch中重复迭代
shuffle: 是否打乱数据
sort: 是否对数据进行排序
sort_within_batch: batch内部是否排序
device: 建立batch的设备 -1:CPU ;0,1 ...:对应的GPU
train_iter, val_iter, test_iter = data.Iterator.splits( (train, val, test),
sort_key=lambda x: len(x.Text), batch_sizes=(32, 256, 256), device=-1)
使用Dataset类
数据集采用github中textcnn中情感分析二分类的中文数据集 text-classification
- 导入torchtext相关包、构建Field对象
# -*- coding:utf-8 -*-
from torchtext import data
from torchtext.vocab import Vectors
from torch.nn import init
from tqdm import tqdm
tokenize = lambda x: x.split()
# fix_length指定了每条文本的长度,截断补长
TEXT = data.Field(sequential=True, tokenize=tokenize, lower=True, fix_length=200)
LABEL = data.Field(sequential=False, use_vocab=False)
- 使用torchtext内置的Dataset构建数据集
torchtext预置的Dataset类的API如下,我们必须至少传入examples和fields这两个参数。examples为由torchtext中的Example对象构造的列表,Example为对数据集中一条数据的抽象。fields可简单理解为每一列数据和Field对象的绑定关系。
class torchtext.data.Dataset(examples, fields, filter_pred=None)
data.Example返回单个样本,提供了fromCSV和fromJSON等多个方法,可以从多种形式构建Dataset所需的标准数据。
自定义Dataset类
构建迭代器
在训练神经网络时,是对一个batch的数据进行操作,因此我们还需要使用torchtext内部的迭代器对数据进行处理。
构建词表
所谓构建词表,即需要给每个单词编码,也就是用数字来表示每个单词,这样才能够传入模型中。
最简单的方式,bulid_vocab()方法中传入用于构建词表的数据集 TEXT.build_vocab(train)
在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能,下面介绍如何在torchtext中使用预训练的词向量,进而传送给神经网络模型进行训练。
方式1:使用torchtext默认支持的预训练词向量
方式2:使用外部预训练好的词向量