torchtext入门教程必看,带你轻松玩转文本数据处理

论坛 期权论坛     
niminba   2021-5-23 05:23   46   0
<p>用深度学习做nlp也有一段时间了,熟悉这块内容的同学都知道,实践算法的时候,写模型是个简单的事,最麻烦的是数据处理,数据处理不仅会浪费我们大部分时间,而且会消耗很大的计算资源,浪费人力物力。</p>
<p>今年开始接触pytorch,简洁的API,动态图,更加灵活的编写模式,诸多优点不用多说。</p>
<p>最近尝试使用torchtext工具,这里想先说明的是,torchtext并不是pytorch所独有的,使用其它深度学习框架,torchtext仍然可以使用。</p>
<p>但是比较麻烦的是,并没有很好很全面的torchtext教程,给同学们入门造成了一定麻烦,这也是我写这篇文章的目的。</p>
<h2>首先整体介绍一下torchtext的组件</h2>
<p>torchtext包含以下组件:</p>
<p><code>Field</code> :主要包含以下数据预处理的配置信息,比如指定分词方法,是否转成小写,起始字符,结束字符,补全字符以及词典等等</p>
<p><code>Dataset </code>:继承自pytorch的Dataset,用于加载数据,提供了TabularDataset可以指点路径,格式,Field信息就可以方便的完成数据加载。同时torchtext还提供预先构建的常用数据集的Dataset对象,可以直接加载使用,splits方法可以同时加载训练集,验证集和测试集。</p>
<p><code>Iterator </code>: 主要是数据输出的模型的迭代器,可以支持batch定制</p>
<h2>1. Field</h2>
<p>Field 包含一写文本处理的通用参数的设置,同时还包含一个词典对象,可以把文本数据表示成数字类型,进而可以把文本表示成需要的tensor类型</p>
<h3>以下是Field对象包含的参数:</h3>
<p>sequential: 是否把数据表示成序列,如果是False, 不能使用分词 默认值: True.</p>
<p>use_vocab: 是否使用词典对象. 如果是False 数据的类型必须已经是数值类型. 默认值: True.</p>
<p>init_token: 每一条数据的起始字符 默认值: None.</p>
<p>eos_token: 每条数据的结尾字符 默认值: None.</p>
<p>fix_length: 修改每条数据的长度为该值,不够的用pad_token补全. 默认值: None.</p>
<p>tensor_type: 把数据转换成的tensor类型 默认值: torch.LongTensor.</p>
<p>preprocessing:在分词之后和数值化之前使用的管道 默认值: None.</p>
<p>postprocessing: 数值化之后和转化成tensor之前使用的管道默认值: None.</p>
<p>lower: 是否把数据转化为小写 默认值: False.</p>
<p>tokenize: 分词函数. 默认值: str.split.</p>
<p>include_lengths: 是否返回一个已经补全的最小batch的元组和和一个包含每条数据长度的列表 . 默认值: False.</p>
<p>batch_first: Whether to produce tensors with the batch dimension first. 默认值: False.</p>
<p>pad_token: 用于补全的字符. 默认值: "&lt;pad&gt;".</p>
<p>unk_token: 不存在词典里的字符. 默认值: "&lt;unk&gt;".</p>
<p>pad_first: 是否补全第一个字符. 默认值: False.</p>
<h3>重要的几个方法:</h3>
<p>pad(minibatch): 在一个batch对齐每条数据</p>
<p>build_vocab(): 建立词典</p>
<p>numericalize(): 把文本数据数值化,返回tensor</p>
<p>简单的栗子如下,建一个Field对象</p>
<div class="blockcode">
<pre class="brush:py;">
TEXT = data.Field(tokenize=data.get_tokenizer('spacy'),
                  init_token='&lt;SOS&gt;', eos_token='&lt;EOS&gt;',lower=True)</pre>
</div>
<h2>2.Dataset</h2>
<p>torchtext的Dataset是继承自pytorch的Dataset,提供了一个可以下载压缩数据并解压的方法(支持.zip, .gz, .tgz)</p>
<p>splits方法可以同时读取训练集,验证集,测试集</p>
<p>TabularDataset可以很方便的读取CSV, TSV, or JSON格式的文件,例子如下:</p>
<div class="blockcode">
<pre class="brush:py;">
train, val, test = data.TabularDataset.splits(
        path='./data/', train='train.tsv',
        validation='val.tsv', test='test.tsv', format='tsv',
        fields=[('Text', TEXT), ('Label', LABEL)])
</pre>
</div>
<p>加载数据后可以建立词典,建立词典的时候可以使用与训练的word vector</p>
<div class="blockcode">
<pre class="brush:py;">
TEXT.build_vocab(train, vectors="glove.6B.100d")</pre>
</div>
<h2>3. Iterator</h2>
<p>Iterator是torchtext到模型的输出,它提供了我们对数据的一般处理方式,比如打乱,排序,等等,可以动态修改batch大小,这里也有splits方法 可以同时输出训练集,验证集,测试集</p>
<h3>参数如下:</h3>
<p>dataset: 加载的数据集</p>
<p>batch_size: Batch 大小.</p>
<p>batch_size_fn: 产生动态的batch大小 的函数</p>
<p>sort_key: 排序的key</p>
<p>train: 是否是一个训练集</p>
<p>repeat: 是否在不同epoch中重复迭代</p>
<p>shuffle: 是否打乱数据</p>
<p>sort: 是否对数据进行排序</p>
<p>sort_within_batch: batch内部是否排序</p>
<p>device: 建立batch的设备 -1:CPU ;0,1 ...:对应的GPU</p>
<p>使用方式如下:</p>
<div class="blockcode">
<pre class="brush:py;">
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)</pre>
</div>
<h2>4.其他</h2>
<p>torchtex
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP