当前位置:   article > 正文

torchtext入门教程,轻松玩转文本数据处理_torchtext iterator

torchtext iterator

深度学习做nlp也有一段时间了,熟悉这块内容的同学都知道,实践算法的时候,写模型是个简单的事,最麻烦的是数据处理,数据处理不仅会浪费我们大部分时间,而且会消耗很大的计算资源,浪费人力物力。今年开始接触pytorch,简洁的API,动态图,更加灵活的编写模式,诸多优点不用多说。最近尝试使用torchtext工具,这里想先说明的是,torchtext并不是pytorch所独有的,使用其它深度学习框架,torchtext仍然可以使用。但是比较麻烦的是,并没有很好很全面的torchtext教程,给同学们入门造成了一定麻烦,这也是我写这篇文章的目的。

首先整体介绍一下torchtext的组件。

torchtext包含以下组件

  • Field :主要包含以下数据预处理的配置信息,比如指定分词方法,是否转成小写,起始字符,结束字符,补全字符以及词典等等
  • Dataset :继承自pytorch的Dataset,用于加载数据,提供了TabularDataset可以指点路径,格式,Field信息就可以方便的完成数据加载。同时torchtext还提供预先构建的常用数据集的Dataset对象,可以直接加载使用,splits方法可以同时加载训练集,验证集和测试集。
  • Iterator : 主要是数据输出的模型的迭代器,可以支持batch定制
1. Field

Field 包含一写文本处理的通用参数的设置,同时还包含一个词典对象,可以把文本数据表示成数字类型,进而可以把文本表示成需要的tensor类型

以下是Field对象包含的参数:

  • sequential: 是否把数据表示成序列,如果是False, 不能使用分词 默认值: True.
  • use_vocab: 是否使用词典对象. 如果是False 数据的类型必须已经是数值类型. 默认值: True.
  • init_token: 每一条数据的起始字符 默认值: None.
  • eos_token: 每条数据的结尾字符 默认值: None.
  • fix_length: 修改每条数据的长度为该值,不够的用pad_token补全. 默认值: None.
  • 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: 用于补全的字符. 默认值: “”.
  • unk_token: 不存在词典里的字符. 默认值: “”.
  • pad_first: 是否补全第一个字符. 默认值: False.
重要的几个方法:
  • pad(minibatch): 在一个batch对齐每条数据
  • build_vocab(): 建立词典
  • numericalize(): 把文本数据数值化,返回tensor

简单的栗子如下,建一个Field对象

TEXT = data.Field(tokenize=data.get_tokenizer('spacy'), 
                  init_token='<SOS>', eos_token='<EOS>',lower=True)
  • 1
  • 2
2.Dataset

torchtext的Dataset是继承自pytorch的Dataset,提供了一个可以下载压缩数据并解压的方法(支持.zip, .gz, .tgz)

splits方法可以同时读取训练集,验证集,测试集

TabularDataset可以很方便的读取CSV, TSV, or JSON格式的文件,例子如下:

train, val, test = data.TabularDataset.splits(
        path='./data/', train='train.tsv',
        validation='val.tsv', test='test.tsv', format='tsv',
        fields=[('Text', TEXT), ('Label', LABEL)])
  • 1
  • 2
  • 3
  • 4

加载数据后可以建立词典,建立词典的时候可以使用与训练的word vector

TEXT.build_vocab(train, vectors="glove.6B.100d")
  • 1
3. Iterator

Iterator是torchtext到模型的输出,它提供了我们对数据的一般处理方式,比如打乱,排序,等等,可以动态修改batch大小,这里也有splits方法 可以同时输出训练集,验证集,测试集

参数如下:

  • 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)
  • 1
  • 2
  • 3
4.其他

torchtext提供常用文本数据集,并可以直接加载使用:

train,val,test = datasets.WikiText2.splits(text_field=TEXT)
  • 1

现在包含的数据集包括:

  • Sentiment analysis: SST and IMDb
  • Question classification: TREC
  • Entailment: SNLI
  • Language modeling: WikiText-2
  • Machine translation: Multi30k, IWSLT, WMT14

完整例子如下,短短几行就把词典和数据batch做好了。

import jieba
import torch
from torchtext import data, datasets

regex = re.compile(r'[^\u4e00-\u9fa5aA-Za-z0-9]')

def tokenizer(text): # create a tokenizer function
    text = regex.sub(' ', text)
    return [word for word in jieba.cut(text) if word.strip()]

text = data.Field(sequential=True, tokenize=tokenizer, fix_length=150)
label = data.Field(sequential=False, use_vocab=False)
train, val = data.TabularDataset.splits(
        path='./data/',
        train='/brucewu/projects/pytorch_tutorials/chinese_text_cnn/data/train.tsv',
        validation='/brucewu/projects/pytorch_tutorials/chinese_text_cnn/data/dev.tsv',
        format='tsv',
        fields=[('text', text), ('label', label)])
text.build_vocab(train,
                 val,
                vectors=Vectors(name="/brucewu/projects/pytorch_tutorials/chinese_text_cnn/data/eco_article.vector"))
train_iter, val_iter = data.Iterator.splits(
        (train, val), sort_key=lambda x: len(x.text),
        batch_sizes=(32, 256), device=-1)
vocab = text.vocab
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
需要注意的一些点
  • 如果运行在 CPU 上,需要设置 device=-1, 如果运行在GPU 上,需要设置device=0
  • torchtext 使用了动态 padding,意味着 batch内的所有句子会 pad 成 batch 内最长的句子长度

参考自https://zhuanlan.zhihu.com/p/31139113

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/378411
推荐阅读
相关标签
  

闽ICP备14008679号