A Comprehensive Introduction to Torchtext
1.概览
torchtext按下面的流程来处理文本数据
读取textfiles,csv/tsv files,json files或directiories,将他们转换为dataset。然后将dataset转换为iterator。iterator进行numericalizing, batching, packaging, and moving the data to the GPU.
2.声明fields
fields指明了如何处理一个field。
使用的是情感分析数据集。
包含两类field:
一类:the comment text
二类: the labels (toxic, severe toxic, obscene, threat, insult, and identity hate)
数据结构如下:
id comment_text toxic ... threat insult identity_hate
0 0000997932d777bf Explanation\nWhy the edits made under my usern... 0 ... 0 0 0
1 000103f0d9cfb60f D'aww! He matches this background colour I'm s... 0 ... 0 0 0
2 000113f07ec002fd Hey man, I'm really not trying to edit war. It... 0 ... 0 0 0
3 0001b41b1c6bb37e "\nMore\nI can't make any real suggestions on ... 0 ... 0 0 0
4 0001d958c54c6e35 You, sir, are my hero. Any chance you remember... 0 ... 0 0 0
comment text field则给了tokenizer(分词),并全部小写,并声明是sequential(序列)。除了这些还可以指定:
参数 | 描述 |
---|---|
unk_token | out-of-vocabulary words |
pad_token | padding |
eos_token | end of a sentence |
init_token | start of the sentence |
?? | choose whether to make the first dimension the batch or the sequence (the first dimension is the sequence by default) |
?? | choose whether to allow the sequence lengths to be decided at runtime or decided in advance |
Label field很简单,默认,所有的field都希望读入的是词序列,如果读入的field已经是数字而且不是序列,则需要指定参数use_vocab=False and sequential=False.
from torchtext.data import Field
tokenize = lambda x: x.split()
TEXT = Field(sequential=True, tokenize=tokenize, lower=True)
LABEL = Field(sequential=False, use_vocab=False)
3.构建dataset
对不同的数据格式有不同的类来处理,对csv和tsv格式的使用TabularDataset
fields必须和csv中的column顺序相同,如果不需要某个column则赋值为None
from torchtext.data import TabularDataset# 训练集和验证集field对应关系
tv_datafields = [("id", None), # id不需要所以舍弃("comment_text", TEXT), ("toxic", LABEL),("severe_toxic", LABEL), ("threat", LABEL),("obscene", LABEL), ("insult", LABEL),("identity_hate", LABEL)]
# 获得训练集和验证集
trn, vld = TabularDataset.splits(path="data", #数据存放的根目录train='train.csv', # 训练集validation="valid.csv", #验证集format='csv', #类型skip_header=True, # 跳过headerfields=tv_datafields) # 将字段和字段处理对齐
# 测试集field对应关系
tst_datafields = [("id", None),("comment_text", TEXT)]
# 获得测试集
tst = TabularDataset(path="data/test.csv",format='csv',skip_header=True,fields=tst_datafields)
可以查看新生成的数据集,trn是一个列表,其中每一个元素是Example对象。该对象包含了相关的属性key。
comment_text已经被tokenized(分词),但还没有转换为数字。
trn[0] # <torchtext.data.example.Example object at 0x000001F9EAFDBA20>
trn[0].__dict__.keys() # dict_keys(['comment_text', 'toxic', 'severe_toxic', 'threat', 'obscene', 'insult', 'identity_hate'])
trn[0].comment_text[:3] # ['explanation', 'why', 'the'] 句子被分词
在training set上创建词库(vocabulary),要检测training和TEXT相关的field,将其中的词语都注册进词库。torchtext的Vocab类来管理词库。Vocab在stoi中保存了word到id的映射,而在itos保存了反映射。
可以使用预训练的embedding matrix比如word2vect。
TEXT.build_vocab(trn)
TEXT.vocab.itos # word - id
TEXT.vocab.stoi # id - word
TEXT.vocab.freqs # word频次
TEXT.vocab.UNK # 超出词库表示
4.构造迭代器
在torchvision中通过DataLoaders来处理数据,由于一些原因,在torchtext中我们更名为Iterators。基本的方法是一样的,但是Iterators有一些处理文本的便捷方法。
sort_within_batch为真时,在每个minibatch中进行排序。当使用pack_padded_sequence和PackedSequence对象时是必须的
BucketIterator自动的shuffles和buckets序列,让他们等长。
sort_key不但是 batch 内的排序方式(降序排列),也是通过它,BucketIterator才知道将长度相近的数据放到同一个 batch 内来sample,这样可以最小化每个 batch 需要padding的个数,提高计算效率。在padding的时候是取每个minibatch最长的句子作为padding的依据。这样可以提高padding的效率。
而在test set上,我们不能shuffle数据,因为要进行结果输出,所以使用标准的iterator
from torchtext.data import Iterator, BucketIterator
# 使用BucketIterator
train_iter, val_iter = BucketIterator.splits((trn, vld), batch_sizes=(64, 64),device=-1, # 指明GPU的编号,-1是CPUsort_key=lambda x: len(x.comment_text), # 指明排序的标准sort_within_batch=False,repeat=False
)
test_iter = Iterator(tst, batch_size=64, device=-1, sort=False, sort_within_batch=False, repeat=False)print(train_iter.dataset.examples[7].comment_text)
print(train_iter.dataset.examples[7].toxic)
print(train_iter.dataset.examples[7].severe_toxic)
print(train_iter.dataset.examples[7].threat)
print(train_iter.dataset.examples[7].obscene)
print(train_iter.dataset.examples[7].insult)
print(train_iter.dataset.examples[7].identity_hate)
但问题是标签有多个,我们需要将toxic,severe_toxic等标签整合成Y
class BatchWrapper:def __init__(self, dl, x_var, y_vars):self.dl, self.x_var, self.y_vars = dl, x_var, y_vars # we pass in the list of attributes for xdef __iter__(self):for batch in self.dl:x = getattr(batch, self.x_var) # we assume only one input in this wrapperif self.y_vars is None: # we will concatenate y into a single tensory = torch.cat([getattr(batch, feat).unsqueeze(1) for feat in self.y_vars], dim=1).float()else:y = torch.zeros((1))yield (x, y)def __len__(self):return len(self.dl)train_dl = BatchWrapper(train_iter, "comment_text", ["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"])
valid_dl = BatchWrapper(val_iter, "comment_text", ["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"])
test_dl = BatchWrapper(test_iter, "comment_text", None)import torch
next(train_dl.__iter__())(tensor([[ 738, 38575, 738, ..., 1056, 180, 40301],[ 2, 515, 274, ..., 1056, 222, 14],[19777, 1013, 10, ..., 1056, 8, 6],...,[ 1, 1, 1, ..., 1, 1, 1],[ 1, 1, 1, ..., 1, 1, 1],[ 1, 1, 1, ..., 1, 1, 1]]), tensor([0.]))
参考:
https://mlexplained.com/2018/02/08/a-comprehensive-tutorial-to-torchtext/
https://blog.csdn.net/qq_40367479/article/details/95354563
https://www.jianshu.com/p/e5adb235399e
A Comprehensive Introduction to Torchtext相关推荐
- pyTorch api
应用 pytorch FC_regression pytorch FC_classification pytorch RNN_regression pytorch LSTM_regression py ...
- 《Java: The Complete Reference》等书读书笔记
春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...
- 推荐:一本“高颜值”的R语言数据可视化图书(包邮送3本)
文章留言点赞前3名的朋友,每人送1本<R语言数据化可视化之美增强版>,名单揭晓日期为:本周日 (2020年7月12日晚7点).到时,获奖的朋友可以直接添加微信:meta-genomics, ...
- 半折预售:新书-R语言数据可视化之美|ggplot2作者推荐
我本来想等正式发售的时候,再告诉大家我的新书<R语言数据可视化之美>已经出版,奈何新书还太贵,这几天刚好京东有买100减50的活动,所以想想还是赶紧告诉大家吧,不然平时购买的话,太真有点小 ...
- 报名 | 二值化网络 基于素描图的图像检索论坛
[论坛主题]二值化网络 & 基于素描图的图像检索 [时间]2018年11月04日(周日)下午2:00 -- 4:00 [地点]中国科学院自动化研究所 [报名方式]扫描下方二维码进行报名 [论坛 ...
- [Share]10 Free EBooks for Web Designers
Introduction to Good Usability This guide is especially handy if you haven't done a lot of webdesign ...
- 一文读懂区块链上的隐私与监管问题
区块链--作为公开账本,解决了各方如何建立信任的问题,却也同时带来了一个新的问题:隐私如何得到保护?当用户的所有交易信息都暴露在大众面前,如果这些交易信息被恶意挖掘及利用,将给用户隐私带来严重的威胁. ...
- 计算机网络校园网建设设计摘要,计算机网络专业论文校园网建设设计.doc
计算机网络专业论文校园网建设设计 目录 摘要I 第1章 校园网概述1 第2章 校园网的需求分析与设计方案3 2.1需求分析3 2.2网络层次分析4 2.3总体设计方案5 2.4网络设备选型6 2.5校 ...
- 【推荐系统】变分自编码器(VAEs)在推荐系统中的应用
「本文概览」 今天给大家介绍一篇VAEs用于推荐系统召回侧的文章,论文题目为<Variational Autoencoders for Collaborative Filtering>.V ...
最新文章
- 公路病害检测有了“智慧眼”,思谋AI“助力”广东省高速公路
- 32位系统和64位系统的选择
- curl请求本地域名问题
- oracle12c考试内容,12c ocp考试内容
- 湖北大学计算机科学与技术怎么样,湖北大学(专业学位)计算机技术考研难吗
- Nest入门教程 - 模块
- 数据中心的容器操作系统--k8s理解
- python工程代码语法_python编码环境安装与基本语法
- DFS-分布式文件系统对比
- armstrong number in python_Python3 From Zero——{最初的意识:008~初级实例演练}
- 计算机操作系统--文件管理
- Eplan2.7 安装教程
- 编辑器使用方法 1. 下载编辑器 下载 KindEditor 最新版本,下载之后打开 examples/index.html 就可以看到演示。 下载页面: http://www.kindsoft.
- java知识竞赛题库_java程序设计题库
- 基于node+mysql的微信商城小程序全栈系统(vue后台管理系统+微信小程序+node服务端)
- 案例三:小明左右手分别拿两张纸牌:黑桃10和红心8,现在交换手中的牌。编写一个程序模拟这一个过程:两个整数分别保存在两个变量中,将这两个变量的值互换,并输出互换后的结果。...
- Content Provider(二)之 FileProvider 实现应用文件共享
- Java Web一维条形码生成工具选择
- python打开xls_用Python读取Excel(*.xls)文件——xlrd模块的使用
- i3 7100黑苹果_苹果连发三款新品,售价更低!性能更强!| 数码
热门文章
- 用C#写的汉语转拼音缩写的例子
- r语言 图形一览_R语言实战(第2版):第三章 图形初阶(01)
- sql 单引号_三种数据库的 SQL 注入详解
- 自学python 编程基础科学计算及数据分析 pdf_自学Python:编程基础、科学计算及数据分析...
- Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制
- 微课|玩转Python轻松过二级(2.2.4节):位运算符与集合运算符
- 技术要点|Python监控学生端电脑屏幕自动识别学习状态
- BeautifulSoup解析库select方法实例——获取企业信息
- oracle全文检索 分区表,oracle全文检索
- 5渲染判断_Vue页面渲染中key的应用实例教程