[NLP] TorchText 使用指南_torchtext使用指南-csdn-程序员宅基地

技术标签: deep learning  PyTorch  NLP  

TorchText 是 PyTorch 的一个功能包,主要提供文本数据读取、创建迭代器的的功能与语料库、词向量的信息,分别对应了 torchtext.datatorchtext.datasetstorchtext.vocab 三个子模块。本文参考了三篇文章

1. 语料库 torchtext.datasets

TorchText 内建的语料库有:

  • Language Modeling
    • WikiText-2
    • WikiText103
    • PennTreebank
  • Sentiment Analysis
    • SST
    • IMDb
  • Text Classification
    • TextClassificationDataset
    • AG_NEWS
    • SogouNews
    • DBpedia
    • YelpReviewPolarity
    • YelpReviewFull
    • YahooAnswers
    • AmazonReviewPolarity
    • AmazonReviewFull
  • Question Classification
    • TREC
  • Entailment
    • SNLI
    • MultiNLI
  • Machine Translation
    • Multi30k
    • IWSLT
    • WMT14
  • Sequence Tagging
    • UDPOS
    • CoNLL2000Chunking
  • Question Answering
    • BABI20
  • Unsupervised Learning
    • EnWik9

2. 预训练的词向量 torchtext.vocab

TorchText 内建的预训练词向量有:

  • charngram.100d
  • fasttext.en.300d
  • fasttext.simple.300d
  • glove.42B.300d
  • glove.840B.300d
  • glove.twitter.27B.25d
  • glove.twitter.27B.50d
  • glove.twitter.27B.100d
  • glove.twitter.27B.200d
  • glove.6B.50d
  • glove.6B.100d
  • glove.6B.200d
  • glove.6B.300d

3. 数据读取、数据框的创建 torchtext.data

3.1 创建 Field

Field 可以理解为一个告诉 TorchText 如何处理字段的声明。

torchtext.data.Field(sequential=True, use_vocab=True, init_token=None, eos_token=None, fix_length=None, dtype=torch.int64, preprocessing=None, postprocessing=None, lower=False, tokenize=None, tokenizer_language='en', include_lengths=False, batch_first=False, pad_token='<pad>', unk_token='<unk>', pad_first=False, truncate_first=False, stop_words=None, is_target=False)

参数很多,这里仅仅介绍主要参数:

  • sequential:是否为已经被序列化的数据,默认为 True;
  • use_vocab:是否应用词汇表。若为 False 则数据应该已经是数字形式,默认为 True;
  • init_token:序列开头填充的 token,默认为 None 即不填充;
  • eos_token:序列结尾填充的 token,默认为 None 即不填充;
  • lower:是否将文本转换为小写,默认为 False;
  • tokenize:分词器,默认为 string.split
  • batch_first:batch 是否在第一维上;
  • pad_token:填充的 token,默认为 “”;
  • unk_token:词汇表以外的词汇的表示,默认为 “”;
  • pad_first:是否在序列的开头进行填充;默认为 False;
  • truncate_first:是否在序列的开头将序列超过规定长度的部分进行截断;默认为 False;
  • stop_words:是否过滤停用词,默认为 False;
  • is_target:这个 Field 是否为标签,默认为 False。

tokenize 可以使用 SpaCy 的分词功能,使用以前要先构建分词功能:

import spacy
spacy_en = spacy.load('en')
def tokenizer(text):
	return [token for toekn in spacy_en.tokenizer(text)]

spacy 分词的效果比原生的 split 函数好一点,但是速度也慢一些。然后可以创建对应文本的 Field 了:

TEXT = data.Field(sequential=True, tokenize=tokenizer, lower=True) # 假设文本为 raw data
LABEL = data.Field(sequential=False, use_vocab=False) # 假设标签为离散的数字变量

3.2 创建 Dataset

如果文本数据保存在 csvtsvjson 文件中,我们优先使用 torchtext.data.TabularDataset 进行读取。

torchtext.data.TabularDataset(path, format, fields, skip_header=False, csv_reader_params={}, **kwargs)

  • path:数据的路径;
  • format:文件的格式,为 csvtsvjson
  • fields:上面已经定义好的 Field;
  • skip_header:是否跳过第一行;
  • csv_reader_params:当文件为 csvtsv 时,可以自定义文件的格式。

例子:

train, val = data.TabularDataset.splits(
        path='.', train='train.csv',validation='val.csv', format='csv',skip_header=True,
        fields=[('PhraseId',None),('SentenceId',None),('Phrase', TEXT), ('Sentiment', LABEL)])

test = data.TabularDataset('test.tsv',
        format='tsv',skip_header=True,
        fields=[('PhraseId',None),('SentenceId',None),('Phrase', TEXT)])

上面的例子说,'PhraseId''SentenceId' 不读取(FieldNone),'Phrase'TEXT 的方式进行读取,'Sentiment'LABEL 的方式进行读取。

3.3 建立词汇表

现在我们需要将词转化为数字,并在模型中载入预训练好的词向量。词汇表存储在之前声明好的 Field 里面。

TEXT.build_vocab(train_data, # 建词表是用训练集建,不要用验证集和测试集
                  max_size=400000, # 单词表容量
                  vectors='glove.6B.300d', # 还有'glove.840B.300d'已经很多可以选
                  unk_init=torch.init.xavier_uniform # 初始化train_data中不存在预训练词向量词表中的单词
)

# 在神经网络里加载词向量
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)
UNK_IDX = REVIEW.vocab.stoi[REVIEW.unk_token]
PAD_IDX = REVIEW.vocab.stoi[REVIEW.pad_token]
# 因为预训练的权重的unk和pad的词向量不是在我们的数据集语料上训练得到的,所以最好置零
model.embedding.weight.data[UNK_IDX] = torch.zeros(EMBEDDING_DIM)
model.embedding.weight.data[PAD_IDX] = torch.zeros(EMBEDDING_DIM)

3.4 创建迭代器

迭代器推荐使用 BucketIterator,因为它会将文本中长度相似的序列尽量放在同一个 batch 里,减少 padding,从而减少计算量,加速计算。

torchtext.data.BucketIterator(dataset, batch_size, sort_key=None, device=None, batch_size_fn=None, train=True, repeat=False, shuffle=None, sort=None, sort_within_batch=None)
  • dataset:目标数据;
  • batch_size:batch 的大小;
  • sort_key:排序的方式默认为 None;
  • device:载入的设备,默认为 CPU;
  • batch_size_fn:取 batch 的函数,默认为 None;
  • train:是否为训练集,默认为 True;
  • repeat:在不同的 epoch 中是否重复相同的 iterater,默认为 False;
  • shuffle:在不同的 epoch 中是否打乱数据的顺序,默认为 None;
  • sort:是否根据 sort_key 对数据进行排序,默认为 None;
  • sort_within_batch:是否根据 sort_key 对每个 batch 内的数据进行降序排序。

举例:

train_iter, val_iter = data.BucketIterator.split((train, val), batch_size=128, sort_key=lambda x: len(x.Phrase), 
                                 shuffle=True,device=DEVICE)

# 在 test_iter , sort一定要设置成 False, 要不然会被 torchtext 搞乱样本顺序
test_iter = data.Iterator(dataset=test, batch_size=128, train=False,
                          sort=False, device=DEVICE)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44614687/article/details/106582015

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法