位置: IT常识 - 正文

Torchtext快速入门(一)——Vocab(torchaudio教程)

编辑:rootadmin
Torchtext快速入门(一)——Vocab

推荐整理分享Torchtext快速入门(一)——Vocab(torchaudio教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:torchtrt,torchtext教程,torch.train,torchaudio教程,torchtext教程,torch教程,torch教程,torch tutorial,内容如对您有帮助,希望把文章链接给更多的朋友!

🧑‍💻 本系列文章采用 Torchtext 0.13.1 版本

目录前言一、创建词典1.1 根据有序字典进行创建1.2 根据可迭代对象进行创建1.2.1 从生成器中创建二、Vocab的用法2.1 获取词元到索引的映射/索引到词元的映射2.2 正/反向查询2.2.1 根据词元查询索引2.2.2 根据索引查询词元2.3 设置默认索引2.4 添加词元2.5 其他用法附录前言

词典(Vocab)是NLP任务中最为重要的工具之一,本文将详细介绍Torchtext中的词典类及其使用方法。

安装Torchtext:

conda install -c pytorch torchtext

导入本文所需要的所有包:

from collections import Counter, OrderedDictfrom torchtext.vocab import vocab, build_vocab_from_iterator一、创建词典

Torchtext中创建词典有两种方法,第一种是根据有序字典(OrderedDict)进行创建,第二种是根据生成器(Generator)/可迭代对象(Iterable)进行创建。

1.1 根据有序字典进行创建

NLP任务中,绝大多数时候 tokens 是一个二维列表,即 tokens[0] 代表一个句子,tokens[0][0] 代表一个词元(单词)。为了使用 Counter() 统计词频,我们需要先将 tokens 展平成一维列表(事实上展平成一维的可迭代对象即可),最常用的方法如下:

from tkinter import _flattentokens = _flatten(tokens) # 这里tokens是一个一维元组,是可迭代对象

如果 tokens 本身就是个一维列表,则 _flatten(tokens) 仍然会返回一维元组,因此我们可以总是使用 _flatten(tokens)。

之后我们可以对这个一维可迭代对象使用 Counter() 统计词频,并将其从高到低进行过排序

>>> tokens = [["I", "am", "very", "happy"], ["I", "seem", "to", "have", "lost", "something"]]>>> sorted(Counter(_flatten(tokens)).items(), key=lambda x: x[1], reverse=True)[('I', 2), ('am', 1), ('very', 1), ('happy', 1), ('seem', 1), ('to', 1), ('have', 1), ('lost', 1), ('something', 1)]

可以看出输出结果是形如 List[Tuple[str, int]] 这样的类型,我们可以根据此结果来构造有序字典

tokens = [["I", "am", "very", "happy"], ["I", "seem", "to", "have", "lost", "something"]]ordered_dict = OrderedDict(sorted(Counter(_flatten(tokens)).items(), key=lambda x: x[1], reverse=True))print(ordered_dict)# OrderedDict([('I', 2), ('am', 1), ('very', 1), ('happy', 1), ('seem', 1), ('to', 1), ('have', 1), ('lost', 1), ('something', 1)])

然后基于有序字典创建词典

v = vocab(ordered_dict)print(type(v))# <class 'torchtext.vocab.vocab.Vocab'>

⚠️ 这里的 vocab() 是一个函数,创建得到的 v 是 Vocab 类的实例。第二章节我们会详细介绍 Vocab 类的用法。

我们还可以向 vocab() 函数传入其他参数。例如如果一词元的出现次数低于 2 就丢弃,则可设置

v = vocab(ordered_dict, min_freq=2)

在NMT(机器翻译)任务中,我们往往需要一些特殊词元,这时可以使用 specials 参数进行指定

v = vocab(ordered_dict, min_freq=2, specials=['<pad>', '<unk>', '<bos>', '<eos>'])

此时这些特殊词元会被添加到词表的最上方。如果需要将特殊词元添加到词表的最下方,则可指定

v = vocab(ordered_dict, min_freq=2, specials=['<pad>', '<unk>', '<bos>', '<eos>'], special_first=False)1.2 根据可迭代对象进行创建

根据可迭代对象创建词典需要用到以下函数

build_vocab_from_iterator(iterator: Iterable, min_freq: int = 1, specials: Optional[List[str]] = None, special_first: bool = True, max_tokens: Optional[int] = None)

接下来重点讲解第一个和最后一个参数。

首先 iterator 是一个可迭代对象,观察 build_vocab_from_iterator 源码的 9~11 行可知(见本文附录),Counter 的实例每次会 update iterator 中的一个元素,而 Counter 的 update 方法源码如下:

def update(self, iterable=None, /, **kwds): if iterable is not None: if isinstance(iterable, _collections_abc.Mapping): if self: self_get = self.get for elem, count in iterable.items(): self[elem] = count + self_get(elem, 0) else: # fast path when counter is empty super().update(iterable) else: _count_elements(self, iterable) if kwds: self.update(kwds)Torchtext快速入门(一)——Vocab(torchaudio教程)

这说明 iterator 中的每一个元素仍是一个可迭代对象,所以我们可以直接向 iterator 传入二维列表 tokens,如下:

tokens = [["I", "am", "very", "happy"], ["I", "seem", "to", "have", "lost", "something"]]v = build_vocab_from_iterator(tokens)print(v.get_stoi())# {'to': 7, 'seem': 5, 'very': 8, 'something': 6, 'lost': 4, 'have': 3, 'happy': 2, 'am': 1, 'I': 0}

我们还可以指定词典的大小(算上特殊词元的大小)

v = build_vocab_from_iterator(tokens, max_tokens=3)print(v.get_stoi())# {'happy': 2, 'am': 1, 'I': 0}

⚠️ max_tokens 不能小于特殊词元的数量,否则词典中将只含特殊词元。

1.2.1 从生成器中创建

假如 ./data.txt 中的内容为

I am very happyI seem to have lost something

则我们可以构造一个生成器,然后使用它来创建词典。

def yield_tokens(path): with open(path) as f: for line in f.readlines(): yield line.strip().split()v = build_vocab_from_iterator(yield_tokens("./data.txt"))二、Vocab的用法

无论使用 vocab() 函数还是 build_vocab_from_iterator() 函数,返回的结果都是一个 Vocab 实例。

2.1 获取词元到索引的映射/索引到词元的映射

获取词元到索引到映射(字典)

tokens = [['a', 'a', 'b'], ['c', 'c', 'd', 'd', 'd']]v = build_vocab_from_iterator(tokens, specials=['<pad>', '<unk>'])print(v.get_stoi())# {'b': 5, 'd': 2, '<pad>': 0, '<unk>': 1, 'c': 4, 'a': 3}

获取索引到词元的映射(列表)

print(v.get_itos())# ['<pad>', '<unk>', 'd', 'a', 'c', 'b']2.2 正/反向查询2.2.1 根据词元查询索引

根据单个词元查询其索引

print(v['a'])# 3

根据多个词元查询它们对应的索引(常用)

print(v(['c', 'd', '<unk>']))# [4, 2, 1]2.2.2 根据索引查询词元

根据单个索引查询其词元

print(v.lookup_token(4))# c

根据多个索引查询它们对应的词元

print(v.lookup_tokens([0, 5, 2]))# ['<pad>', 'b', 'd']2.3 设置默认索引

在实际应用中,我们难免会遇到OOV(Out Of Vocabulary)词元,这时如果直接查询其索引会报错

print(v['f'])# RuntimeError: Token f not found and default index is not set

因此我们需要设置一个默认索引,所有OOV词元都会被映射到该索引上。通常来讲,我们会将默认索引设置为未知词元的索引,即

v.set_default_index(v['<unk>'])print(v['f'])# 1

如果要获取默认索引,可调用 get_default_index() 方法。

2.4 添加词元

如果一个词元不在词典当中,我们可以将其追加到词典的末尾

v.append_token('e')print(v.get_stoi())# {'b': 5, 'd': 2, '<pad>': 0, '<unk>': 1, 'e': 6, 'c': 4, 'a': 3}

除了追加到末尾之外,我们还可以在词典中的任意位置插入新词元,此时需要同时提供词元和索引

v.insert_token('e', 3)print(v.get_stoi())# {'b': 6, 'c': 5, 'e': 3, 'd': 2, '<pad>': 0, '<unk>': 1, 'a': 4}2.5 其他用法

获取词典大小

print(len(v))# 6

判断词元是否在词典当中

print('c' in v)# Trueprint('k' in v)# False附录

vocab 函数源码:

def vocab(ordered_dict: Dict, min_freq: int = 1, specials: Optional[List[str]] = None, special_first: bool = True) -> Vocab: specials = specials or [] for token in specials: ordered_dict.pop(token, None) tokens = []# Save room for special tokens for token, freq in ordered_dict.items(): if freq >= min_freq: tokens.append(token) if special_first: tokens[0:0] = specials else: tokens.extend(specials) return Vocab(VocabPybind(tokens, None)) # 这里的VocabPybind是C++对象

build_vocab_from_iterator 函数源码:

def build_vocab_from_iterator( iterator: Iterable, min_freq: int = 1, specials: Optional[List[str]] = None, special_first: bool = True, max_tokens: Optional[int] = None,) -> Vocab: counter = Counter() for tokens in iterator: counter.update(tokens) specials = specials or [] # First sort by descending frequency, then lexicographically sorted_by_freq_tuples = sorted(counter.items(), key=lambda x: (-x[1], x[0])) if max_tokens is None: ordered_dict = OrderedDict(sorted_by_freq_tuples) else: assert len(specials) < max_tokens, "len(specials) >= max_tokens, so the vocab will be entirely special tokens." ordered_dict = OrderedDict(sorted_by_freq_tuples[:max_tokens - len(specials)]) word_vocab = vocab(ordered_dict, min_freq=min_freq, specials=specials, special_first=special_first) return word_vocab
本文链接地址:https://www.jiuchutong.com/zhishi/299056.html 转载请保留说明!

上一篇:如何通过nodejs快速搭建一个服务器(nodejs如何使用)

下一篇:【SpringMVC】集成Web、MVC执行流程、数据响应、数据交互(spring集成xfire)

  • 京东付款如何调出银联云闪付(京东付款如何调整顺序)

    京东付款如何调出银联云闪付(京东付款如何调整顺序)

  • excel怎么锁定单元格不被修改(excel怎么锁定单元格)

    excel怎么锁定单元格不被修改(excel怎么锁定单元格)

  • 华为微信深夜模式如何设置(华为微信深夜模式怎么免打扰)

    华为微信深夜模式如何设置(华为微信深夜模式怎么免打扰)

  • 华为ai摄影大师的作用是(华为ai摄影大师识别不出来)

    华为ai摄影大师的作用是(华为ai摄影大师识别不出来)

  • mate30pro音量键不灵敏(mate30pro音量键不方便)

    mate30pro音量键不灵敏(mate30pro音量键不方便)

  • 已邀请群成员一起编辑别人能看到吗(已邀请群成员一起进群)

    已邀请群成员一起编辑别人能看到吗(已邀请群成员一起进群)

  • 佳能6200d用什么硒鼓(佳能eos620)

    佳能6200d用什么硒鼓(佳能eos620)

  • 华为手机怎么设置蓝牙(华为手机怎么设置下面的三个功能键)

    华为手机怎么设置蓝牙(华为手机怎么设置下面的三个功能键)

  • 美图秀秀怎么保存到相册(美图秀秀怎么保存不了图片)

    美图秀秀怎么保存到相册(美图秀秀怎么保存不了图片)

  • 小米6跑分多少

    小米6跑分多少

  • 笔记本没有鼠标怎么右击(笔记本没有鼠标怎么拖动桌面上的文件)

    笔记本没有鼠标怎么右击(笔记本没有鼠标怎么拖动桌面上的文件)

  • 苹果无痕浏览还能看到记录吗(苹果无痕浏览还会被运营商记录吗)

    苹果无痕浏览还能看到记录吗(苹果无痕浏览还会被运营商记录吗)

  • 手机如果被监听了会有什么表现(手机如果被监听了,微信,信息都会被看到吗)

    手机如果被监听了会有什么表现(手机如果被监听了,微信,信息都会被看到吗)

  • qq基友标识怎么升级(qq基友标识怎么设置)

    qq基友标识怎么升级(qq基友标识怎么设置)

  • 手机显示hd怎么关闭(手机显示HD怎么消除)

    手机显示hd怎么关闭(手机显示HD怎么消除)

  • 微信删除后重新下载聊天记录还在吗(微信删除后重新下载后怎么恢复群聊)

    微信删除后重新下载聊天记录还在吗(微信删除后重新下载后怎么恢复群聊)

  • word2010怎么显示分页符(Word2010怎么显示标尺)

    word2010怎么显示分页符(Word2010怎么显示标尺)

  • 红米note8怎么设置一键锁屏(红米note8怎么设置返回键)

    红米note8怎么设置一键锁屏(红米note8怎么设置返回键)

  • 基本维恩图在哪儿(基本维恩图在哪个位置)

    基本维恩图在哪儿(基本维恩图在哪个位置)

  • 如何不让淘宝显示热榜(淘宝如何不显示)

    如何不让淘宝显示热榜(淘宝如何不显示)

  • 苹果11哪天发售(iphone 11什么时候发售)

    苹果11哪天发售(iphone 11什么时候发售)

  • 火山直播视频怎么删除(火山小视频直播怎么放电影)

    火山直播视频怎么删除(火山小视频直播怎么放电影)

  • ios未受信任怎么解决(未受信任苹果怎么弄)

    ios未受信任怎么解决(未受信任苹果怎么弄)

  • SOUL集满几颗心可以点亮一个字母(soul几个心)

    SOUL集满几颗心可以点亮一个字母(soul几个心)

  • 广州地铁扫码怎么用(广州乘地铁扫码)

    广州地铁扫码怎么用(广州乘地铁扫码)

  • 微信辅助扫码是什么(微信辅助扫码是干什么的)

    微信辅助扫码是什么(微信辅助扫码是干什么的)

  • win11输入法怎么最小化?win11输入法最小化教程(WIN11输入法怎么隐藏到任务栏)

    win11输入法怎么最小化?win11输入法最小化教程(WIN11输入法怎么隐藏到任务栏)

  • 微服务框架:如果不用 Spring Boot,还可以选择谁?(微服务框架图)

    微服务框架:如果不用 Spring Boot,还可以选择谁?(微服务框架图)

  • python字典中添加新的键值(python字典添加数据)

    python字典中添加新的键值(python字典添加数据)

  • 印花税处罚适用征管法吗
  • 企业技术转让享受税收优惠政策应符合哪些条件
  • 广告费的税前扣除是多少
  • 模具发票如何入账
  • 股东个人将钱打入公司对公账户,能否算作投资款
  • 外贸企业出口退税计算公式
  • 报关单和进口增值税专用缴款书联系
  • 工程总包如何开具发票和征税
  • 钻井勘探支出已费用化的探井
  • 公司员工的车外地的停车费怎么做分录
  • 担保预计负债要如何做账?
  • 出售固定资产取得的收入
  • 购销合同印花税怎么算
  • 小型微利企业免于填报
  • 递延所得税资产怎么计算
  • 转让股权收入属于企业所得税收入吗
  • 茶具可以作为固定资产吗
  • 股票派息后会除权吗
  • 开发票货物或应税服务两行怎么开
  • 无法取得房地产原值怎么缴纳房产税?
  • 进口关税和增值税在哪里交
  • 如何修改mac系统密码
  • 企业三大期间费用是什么
  • 文化事业建设费2023年是否减免了
  • windows history命令
  • 做汽车配件销售怎么找客户
  • 在win7系统中将打开窗口拖到屏幕顶端
  • seti@home.exe - seti@home是什么进程 有什么用
  • url传变量
  • PHP:__halt_compiler()的用法_misc函数
  • 阿里云jar包
  • 增值税纳税人的相关规定
  • 基于thinkphp的cms
  • 不抵扣的进项税怎么做账
  • php 数组相加
  • setsid命令
  • php如何实现多进程
  • word element
  • 公司的投资利税是什么
  • 织梦如何添加浮动广告
  • mysql存储过程之错误处理
  • 预提的费用当年必须冲掉吗
  • 用友要怎么删除凭证
  • 支付宝付款对面知道名字吗
  • 营改增之后账务怎么处理
  • 增值税发票日用品开票明细
  • 确认资产减值损失后可以转回的
  • 进口关税减免政策
  • 银行开户的费用计入什么科目
  • 政府补贴专项资金补贴开发票
  • 为什么银行结息不加入账户
  • 出口货物索赔如何确认收入
  • 生产车间的保险有哪些
  • mysql查询语句优先级
  • sqlserver代理服务启动失败
  • 苹果序列号查询
  • Win10预览版桌面图标和任务栏不翼而飞怎么办?
  • freebsd的软件管理工具ports详解
  • 如何关掉数据
  • centos中netspeeder网络加速/优化器的安装方法
  • window1020h2
  • 手动为LiteSpeed安装eAccelerator和XCache的方法分享
  • 微软补丁发布时间
  • 怎么禁止电脑qq自动启动
  • win8外接显示器没反应怎么办
  • linux系列
  • linux k
  • 微信小程序列表显示
  • JavaScript数组去重
  • 有nodejs就不需要用java了么
  • linux for i in
  • [置顶]JM259194
  • vue远程调用组件
  • python的删除命令
  • javascript函数大全
  • gridlayout用法
  • 国家 税务 总局
  • 北京地方税务局电话
  • 发票事业单位有税号吗
  • 主题党日活动标题副标题格式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设