torchtext0.14 实践手册(0.12版本同理)

2023-05-16

文章目录

  • 实践手册
    • 构建词典
      • 0.9版本
      • 0.14版本
      • 总结
    • 构建迭代器
      • 0.9版本
      • 0.14版本
      • 总结
    • 使用预训练词向量
      • 0.9版本
      • 0.14版本
      • 总结
  • 本文参考

torchtext的API有过两次较大变动:

  • 第一次是在0.9,将一些类库移入了legacy目录。对代码的影响是,import torchtext.data要改成import torchtext.legacy.data
  • 第二次是在0.12,将legacy目录移除,并提供了新的API。对代码的影响是,很多原本在legacy目录中的接口都废弃了,要重新构建代码逻辑。

实践手册

接下来,介绍使用tochtext0.14的各种步骤时的做法。本文会在介绍每一个做法时,对比两个版本下的具体代码,帮助读者更好地从旧版API的思维迁移到新API。

构建词典

假设输入是一个pands Dataframe对象train_df

train_df = pd.read_csv("processed_data/train.csv")

0.9版本

原本的做法如下。
首先创建Field

TEXT = data.Field(tokenize = 'spacy', include_lengths = True)
LABEL = data.LabelField(dtype = torch.float)

fields = [('text',TEXT), ('label',LABEL)]

再创建torchtext Dataset。DataFrameDataset继承了torchtext.legacy.data.Dataset,其实现复制于github/lextoumbourou。

train_ds, val_ds = DataFrameDataset.splits(fields, train_df=train_df, val_df=valid_df)

最后,传入数据集为参数调用Field::build_vocab,就构建词典了。

TEXT.build_vocab(train_ds,
                 max_size = MAX_VOCAB_SIZE,
                 vectors = 'glove.6B.200d',
                 unk_init = torch.Tensor.zero_)

LABEL.build_vocab(train_ds)

0.14版本

现在讲0.14版本。先定义分词函数yield_tokens,它使用spacy分词器对pandas Dataframe的每一行作分词操作。

这里用了yield语法,不懂的百度一下。

import spacy
spacy_tokenizer = spacy.load("en_core_web_sm")

def yield_tokens(data_df):
    for _, row in data_df.iterrows():
        yield [token.text for token in spacy_tokenizer(row.text)]

然后调用build_vocab_from_iterator,传入回调函数yield_tokens,就构建好词典了。

vocab = build_vocab_from_iterator(yield_tokens(train_df), min_freq=5, specials=['<unk>', '<pad>'])
vocab.set_default_index(vocab["<unk>"])

有了这个词典,可以将单词和序号之间互相转换了。尝试输出一下itos和stoi:

print(vocab.get_itos()[:10])
print(vocab.get_stoi()["<unk>"], vocab.get_stoi()["<pad>"], vocab.get_stoi()["the"])

得到如下输出

['<unk>', '<pad>', 'URL', 'the', '?', 'a', 'to', 'in', 'i', 'of']
0 1 3

总结

  • 原本做分词时,是Field内置spacy分词器,现在是手动调用spacy分词操作,还得提供分词函数
  • 原本是用torchtext的Dataset,现在是用pytorch的Dataset(之后会用到)
  • 原本构建词典时,要先创建Field,再调用Field::build_vocab。现在不用这么冗杂,直接调用build_vocab_from_iterator即可。

构建迭代器

0.9版本

在构建迭代器时,原本是用torchtext的迭代器data.BucketIterator

train_iterator, valid_iterator = data.BucketIterator.splits(
        (train_ds, val_ds),
        batch_size = BATCH_SIZE,
        sort_within_batch = True,
        device = device)

它会尽可能让长度相近的句子放在一个batch。使用迭代器时,只需要for循环即可。

从batch读出text属性时,是两个参数:句子和它们的长度。这个tuple形式的返回值权且当做是特性吧。

for batch in train_iterator:
      text, text_lengths = batch.text
      ...

0.14版本

在0.14版本里,读取数据只需要复用pytorch的原生接口Dataset。先定义一个DataFrameDataset,其实就是在pandas DataFrame上包了一层。复习Dataset接口可以先参考pytorch dataset dataloader。

class DataFrameDataset(Dataset):
    def __init__(self, content, label):
        self.content = content
        self.label = label

    def __getitem__(self, index):
        return self.content[index], self.label[index]

    def __len__(self):
        return len(self.label)

然后定义train和valid数据集的Dataloader。传入参数有collate_batch函数,它会对每一批数据作预处理。该函数的实现比较自由,根据训练时的需要去实现即可,总之和原生的一样。

这里用到了python的partial语法,不懂的可以百度一下。

train_iter = DataFrameDataset(list(train_df['text']), list(train_df['target']))
train_loader = DataLoader(train_iter, batch_size=8, shuffle=True,
                          collate_fn=partial(collate_batch, vocab=vocab, device=device))

这样,读取数据的时候,用for循环读出来就行。这里batch返回几个参数都由collate_batch的实现决定。

for batch in iterator:
	text, text_lengths, labels = batch

总结

在0.9版本里,必须定义data.BucketIterator才能读取数据。而到了0.14版本,只要复用pytorch原生的接口Dataset、DataLoader,并善用后者的collate_fn参数,就能读取批次数据了。

使用预训练词向量

为了做迁移学习,我们常常要用预训练的词向量,赋值给模型的词向量矩阵,完成初始化。torchtext提供了一些预训练的词库,比如Glove。在版本的变迁中,使用这些预训练向量的方法也在变化。

0.9版本

"使用预训练向量"原本创建词库时附带的功能。在调用Field::build_vocab构建词库之后,调用Field.vocab.vectors就能取到词库的向量矩阵了,然后就能赋值给模型:

pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)

0.14版本

在0.14版本里,Field被移除了,在Vocab中也没找到vectors成员。但是,torchtext留了预训练词库(比如Glove),只要手动地读取向量,一行行地赋值到模型的词向量矩阵中,就能完成迁移学习的初始化了。

model = LSTM_net(INPUT_DIM,
                     EMBEDDING_DIM,
                     HIDDEN_DIM,
                     OUTPUT_DIM,
                     N_LAYERS,
                     BIDIRECTIONAL,
                     DROPOUT,
                     PAD_IDX)

...

# 迁移学习glove预训练词向量
pretrained = torchtext.vocab.GloVe(name="6B", dim=200)
print(f"pretrained.vectors device: {pretrained.vectors.device}, shape: {pretrained.vectors.shape}")
for i, token in enumerate(vocab.get_itos()):
   model.embedding.weight.data[i] = pretrained.get_vecs_by_tokens(token)

这里有几处值得说明:

  • torchtext.vocab.GloVe是一个预训练词库,name=6B只是词库名前缀,dim=200代表希望加载向量长度为200的那个词库。如果想用其它名字的词库,可以自行百度一下。
  • vocab.get_itos()可以取得映射数组,完成序号->单词的映射。
  • pretrained.get_vecs_by_tokens(token)可以完成单词->词向量的映射。

总结

在0.9版本,当调用Field::build_vocab创建词库时,加载预训练词库的操作就顺带完成了。
到了0.14版本,预训练词库占用单独的接口,你需要显式地加载,再逐行赋值给模型的词向量矩阵。

0.14版本看起来麻烦一点,但代码并没有变得复杂,而且for循环效率其实不慢(因为0.9版本的实现里,Field也是用for循环从预训练词库读取向量,再赋值给成员矩阵的)

本文参考

感谢以下文章作者:

  • torchtext 0.12 中文语料加载
  • 还在手动构造词表?试试torchtext.vocab
  • Torchtext 0.12+新版API学习与使用示例(1)
  • 基于torchtext的文本分类
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

torchtext0.14 实践手册(0.12版本同理) 的相关文章

  • cookie和session

    文章目录 会话跟踪技术Cookie基本使用 Session服务器重启后 xff0c Session中的数据是否还在 会话跟踪技术 会话 xff1a 用户打开浏览器 xff0c 访问web服务器的资源 xff0c 会话建立 xff0c 直到一
  • 【Django】修改端口号与地址

    在启动 Django 项目时 xff0c Django 默认监听的端口号为 8000 xff0c 设置的默认 IP 地址为 127 0 0 1 如果需要修改默认的端口号和 IP 地址 xff0c 可以通过命令行 配置文件 PyCharm 这
  • 【mdk报错】Error: L6218E: Undefined symbol XXXX (referred from main.o)

    一种情况就是没有在用户文件夹中添加文件 xff08 如LED c xff09 第二种错误 xff1a 错误描述为 xff1a OBJ Template axf Error L6218E Undefined symbol main refer
  • Codeforces 1462 C. Unique Number

    Codeforces 1462 C Unique Number 题目链接 xff1a https codeforces com problemset problem 1462 C You are given a positive numbe
  • nohup: failed to run command 'java': No such file or directory

    文章目录 问题现象 xff1a 解决办法 xff1a 问题现象 xff1a 在Ambari平台启动某个服务时 xff0c 会在ambari server节点执行类型nohup java jar XX jar这样的指令 如果把这个指令单独拿出
  • opencv学习笔记(二)-对xml和yaml文件的读写操作

    一 xml和yaml的简单介绍 所谓的xml 就是eXtensible Markup Language 翻译成中文就是 可扩展标识语言 首先XML是一种元标记语言 xff0c 所谓 元标记 就是开发者可以根据自己的需要定义自己的标记 xff
  • 图形化CentOS7.5安装Xrdp服务使通过Windows远程桌面连接

    文章目录 安装启动远程连接 安装 离线的操作系统iso中没有这个包 xff0c 这里使用阿里的yum原下载安装 span class token comment 备份本地源 span span class token function mv
  • centos7 安装FreeSWITCH1.10.7

    好长时间没有安装新的FreeSWITCH了 xff0c 只是知道1 10 4以后spandsp和sofia sip分离出来 xff0c 需要单独编译 xff0c 但上次的实际操作还是很久之前 xff0c 今天又安装了一次 xff0c 索性将
  • Golang实现字符串长度截取,支持正反向

    func main fmt Println SubStr 34 helloword 34 1 1 start xff1a 起始下标 xff0c 负数从尾部开始 xff0c 1为最后一个 length xff1a 截取长度 xff0c 负数表
  • 配置CDN加速域名

    cdn域名加速配置教程 xff0c 切记加速域名与源站域名不能是同一个 第一步 xff1a 打开服务器管理控制台 找到cdn管理 第二部 xff1a 配置源站信息 第三步 xff1a 点击下一步进行审批 第四步 xff1a 审批通过后进行配
  • Proxmox VE(PVE) 添加Web控制台显示CPU和主板温度

    PVE 默认是没有CPU和主板温度显示的 xff0c 为方便使用 xff0c 我们自己加上 实际效果 版本和软件 Virtual Environment 6 1 3putty 或 PVE自带的Shell 或 MobaXterm 等工具 安装
  • python logging 日志输出 学习笔记 时间格式化

    一 logging介绍 Logging是python自带的模块 xff0c 这个模块支持输出不同级别的日志 xff0c 可以输出到控制台和写入文件 xff0c 支持 TCP HTTP GET POST SMTP Socket等 协议 xff
  • vim编辑器的工作模式及切换

    vim编辑器的工作模式及切换 vim编辑器包括哪几种模式 xff0c 各自的作用是什么 xff0c 如何切换 xff1f 主要包括三种工作模式 xff1a 命令模式 xff1a 启动vim编辑器后默认进入命令模式 xff0c 该模式中主要完
  • opencv学习之(三)-LBP算法的研究及其实现

    一 xff0c 原始LBP算法 LBP的基本思想是对图像的像素和它局部周围像素进行对比后的结果进行求和 把这个像素作为中心 xff0c 对相邻像素进行阈值比较 如果中心像素的亮度大于等于他的相邻像素 xff0c 把他标记为1 xff0c 否
  • opencv学习之(五)-直方图计算和绘制图像直方图

    1 直方图 灰度直方图的定义 灰度直方图是灰度级的函数 xff0c 描述图像中该灰度级的像素个数 xff08 或该灰度级像素出现的频率 xff09 xff1a 其横坐标是灰度级 xff0c 纵坐标表示图像中该灰度级出现的个数 xff08 频
  • 学习opencv之(六)-图像切割,使用ROI

    一 ROI介绍 在OpenCV中我们能够非常方便地获取指定ROI区域的子图像 如果你对图像设置了ROI xff0c 那么 xff0c Opencv的大多数函数只在该ROI区域内运算 xff08 只处理该ROI区域 xff09 xff0c 如
  • 虚拟机Ubuntu蓝屏闪屏解决方法

    问题分析 启动 Ubuntu 可以进入登录界面 xff0c 但是系统界面蓝屏 xff0c 说明系统是可以运行起来的 证明系统是没有问题的 应该是系统插件发生了错误 没有发生大块的核心数据损坏 xff0c linux 系统一般都以修复 xff
  • meta标签清理缓存

    meta标签清理缓存 如果需要在html页面上设置不缓存 xff0c 这在 lt head gt 标签中加入如下语句 xff1a lt meta http equiv 61 34 Pragma 34 content 61 34 no cac
  • Go语言入门(二)——Ubuntu系统中Go的安装

    下载并安装 安装包地址 xff1a https golang google cn dl 选择这个下载 xff0c 稍等几秒即可 下载下来的压缩包在Downloads文件夹中 解压二进制文件 将下载的二进制包解压至 usr local目录 x
  • /etc/apt/sources.list" E212: Can't open file for writing解决方案

    w sudo tee gt dev null 解决 转载于 https www cnblogs com tangyouwei p 10109090 html

随机推荐

  • poj 1947 树形dp(得到含P个节点联通块的最小切边数)

    题意 xff1a 给定一颗树 xff0c 通过删除边要得到一个含有P个节点的连通块 xff0c 问最小的删边数 思路 xff1a 树形DP dp x i 记录x结点 xff0c 要得到一棵i个节点的子树去掉的最少边数 搜索到x节点时 xff
  • BMC相关

    BMC基本概念介绍 xff1a BMC xff1a 基板管理控制器 Baseboard Management Controller BMC xff08 Baseboard Management Controller xff0c 基板管理控制
  • ARM ASPEED 2500 uboot openbmc linux 启动记录

    支持原创 xff0c 转载请注明出处 ARM ASPEED 2500 uboot openbmc linux 启动记录 前言 其实openbmc 官方推荐的方法是使用Yocto poky方法来定制aspeed 2500相关的组件 xff0c
  • Serdes 原理及调试学习

    Serdes原理与设计实践之一 xff1a Serdes简介 1 Serdes简介 为了提高接口传输带宽 xff0c 设计中经常采用并行总线设计 并行总线通过提高时钟速率和数据位宽来提高传输带宽 限制接口传输带宽主要有2个方面 xff1a
  • 查看当前Linux系统的内核编译config文件,生成编译驱动所需的内核头文件

    1 xff09 查看内核配置选项 有时候我们需要查看Linux系统的内核是否在编译的时候的编译选项 xff0c 从而确定某个模块是否已经加入到内核以及参数设置等等 xff0c 方法有两种 xff1a zcat proc config gz
  • objdump adr2line定位驱动问题

    https linux kernel labs github io refs heads master labs kernel modules html https linux kernel labs github io refs head
  • debian查询命令所属软件包的方法

    在debian系统中 xff0c 类似centos的yum whatprovides这条查询系统中某个命令属于哪个安装包的命令 xff0c 有如下两类方法 xff08 离线查找和非离线查找 xff09 xff1a 第一种 xff0c 查本机
  • warning: function declaration isn’t a prototype(函数声明不是原型)的解决办法

    linux驱动中定义一个无参的函数 int probe num 警告 xff1a 函数声明不是一个原型 Wstrict prototypes 应对方法 xff1a 改成 int probe num void 警告消失
  • fstat函数

    stat系统调用系列包括了fstat stat和lstat xff0c 它们都是用来返回 相关文件状态信息 的 xff0c 三者的不同之处在于设定源文件的方式不同 1 首先隆重介绍的是一个非常重要的 VIP 人物 xff0c 他是fstat
  • c语言中用宏定义一个常量,数字后面带个U, L, F的含义

    c语言中数字后面带个U是什么意思 xff1f define F CPU 12000000U 答 xff1a U表示该常数用无符号整型方式存储 xff0c 相当于unsigned int L表示该常数用长整型方式存储 xff0c 相当于lon
  • 解决sudo: npm: command not found

    sudo ln s opt node v11 4 0 bin npm usr bin npm sudo ln s opt node v11 4 0 bin node usr bin node 转载于 https www cnblogs co
  • python 安装本地包的方法

    pip install whl 直接在pip install命令后添加whl包的全路径名就能本地安装成功了 下载需要的包 xff0c 一般为zip tar gz等的压缩包 xff0c 解压后 xff0c 打开命令行 xff0c 进入解压目录
  • 光模块规范下载网站 (sff 8472 sff 8436)

    https www snia org technology communities sff specifications field doc status value 61 All amp combine 61 8472 amp items
  • Android 项目必备(四)--> 获取设备唯一标识

    文章目录 一 设备ID的作用二 获取设备ID的API三 设备ID的特性分析四 具体实现 设备唯一标识对于 app 开发是很重要的一个点 xff0c 主要应用于统计 xff0c 有时也应用于业务 Android 平台提供了很多获取唯一标识的
  • visual studio 全局搜索 找不到文字

    问题 xff1a 在vs中ctrl 43 shift 43 F呼出全局搜索框 xff0c 结果搜索不到文字 xff0c 而用sublime却能找到 解决 xff1a 需要设置查找范围为选定的文件夹 xff0c 而非当前项目 之后就能像sub
  • 查看visual studio编译器版本

    通常windows平台上项目有两种途径 xff1a 用cmake gui生成的项目 xff0c 并点击open project xff0c 在vs内编译 xff0c 这种情况下是用MSVC编译 xff0c 版本对照列于文末 用cmake 命
  • Mac 上快速切换同一程序的窗口

    系统偏好设置 gt 调度中心里可以看到这三组快捷键
  • k8s 防止pod调度到同一节点

    参考节点亲和性 xff0c pod affinity 可以这样理解 xff1a 调度的时候选择 xff08 或者不选择 xff09 这样的节点 N xff0c 这些节点上已经运行了满足条件 X 条件 X 是一组 label 选择器 xff0
  • TeaPearce/Conditional_Diffusion_MNIST 源码阅读

    文章目录 tqdm超参数预运算nn Module register buffer绘制动画ddpmforward U net噪声预测模型信息向量掩码向量conext mask上采样层的信息融合恢复阶段 总结后记 tqdm dataset sp
  • torchtext0.14 实践手册(0.12版本同理)

    文章目录 实践手册构建词典0 9版本0 14版本总结 构建迭代器0 9版本0 14版本总结 使用预训练词向量0 9版本0 14版本总结 本文参考 torchtext的API有过两次较大变动 xff1a 第一次是在0 9 xff0c 将一些类