赞
踩
首先:讲解一下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构建数据集
自定义Dataset
构建数据集
构建词表
构建数据迭代器
数据用于模型训练
torchtext方便地对文本进行预处理、eq:截断补长、构建词表等
torchtext概述: torchtext对数据的处理可以概括为Field,Dataset和迭代器这三部分。
Field对象:Field对象指定要如何处理某个字段
Dataset:Dataset定义数据源信息,继承自pytorch的Dataset,用于加载数据,提供了TabularDataset可以指点路径,格式,Field信息就可以方便的完成数据加载。同时torchtext还提供预先构建的常用数据集的Dataset对象,可以直接加载使用,splits方法可以同时加载训练集,验证集和测试集。
迭代器:迭代器返回模型所需要的处理后的数据.迭代器主要分为Iterator, BucketIerator, BPTTIterator三种。可以支持batch定制。
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)
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是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)
数据集采用github中textcnn中情感分析二分类的中文数据集 text-classification
- # -*- 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类的API如下,我们必须至少传入examples和fields这两个参数。examples为由torchtext中的Example对象构造的列表,Example为对数据集中一条数据的抽象。fields可简单理解为每一列数据和Field对象的绑定关系。
class torchtext.data.Dataset(examples, fields, filter_pred=None)
data.Example返回单个样本,提供了fromCSV和fromJSON等多个方法,可以从多种形式构建Dataset所需的标准数据。
在训练神经网络时,是对一个batch的数据进行操作,因此我们还需要使用torchtext内部的迭代器对数据进行处理。
所谓构建词表,即需要给每个单词编码,也就是用数字来表示每个单词,这样才能够传入模型中。
最简单的方式,bulid_vocab()方法中传入用于构建词表的数据集 TEXT.build_vocab(train)
在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能,下面介绍如何在torchtext中使用预训练的词向量,进而传送给神经网络模型进行训练。
方式1:使用torchtext默认支持的预训练词向量
方式2:使用外部预训练好的词向量
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。