【HuggingFace Transformer库学习笔记】基础组件学习:Tokenizer

基础组件——Tokenizer

在这里插入图片描述
在这里插入图片描述

(1)模型加载

from transformers import AutoTokenizersen = "弱小的我也有大梦想!"
# 从HuggingFace加载,输入模型名称,即可加载对于的分词器
tokenizer = AutoTokenizer.from_pretrained("model/robert-base-chinese-extractive-qa")
tokenizerBertTokenizerFast(name_or_path='model/robert-base-chinese-extractive-qa', vocab_size=21128, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True),  added_tokens_decoder={0: AddedToken("[PAD]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),100: AddedToken("[UNK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),101: AddedToken("[CLS]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),102: AddedToken("[SEP]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),103: AddedToken("[MASK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}

保存到本地

# tokenizer 保存到本地
tokenizer.save_pretrained("./roberta_tokenizer")('./roberta_tokenizer/tokenizer_config.json','./roberta_tokenizer/special_tokens_map.json','./roberta_tokenizer/vocab.txt','./roberta_tokenizer/added_tokens.json','./roberta_tokenizer/tokenizer.json')

加载本地中保存的tokenizer

# 从本地加载tokenizer
tokenizer = AutoTokenizer.from_pretrained("./roberta_tokenizer/")
tokenizerBertTokenizerFast(name_or_path='./roberta_tokenizer/', vocab_size=21128, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True),  added_tokens_decoder={0: AddedToken("[PAD]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),100: AddedToken("[UNK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),101: AddedToken("[CLS]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),102: AddedToken("[SEP]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),103: AddedToken("[MASK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}

(2)句子分词

# 会将之前输入的文本,拆分成字典中对应的字词
tokens = tokenizer.tokenize(sen)			# 将sen输入给tokenizer
tokens      # 如果词表中没有对应的词,就会变成[UNK]['弱', '小', '的', '我', '也', '有', '大', '梦', '想', '!']

(3)查看字典

tokenizer.vocab{'##曄': 16334,'##絡': 18238,'##啼': 14639,'瞬': 4746,'##推': 16029,'##蔥': 18977,'沂': 3752,'嘘': 1656,'苜': 5730,'##即': 14372,'徉': 2524,'carlo': 12628,'##歙': 16686,'飛': 7606,'##ᵘ': 13495,'##蜊': 19106,'##85': 9169,'##页': 20609,'##ved': 11667,'lonzo': 12688,'旋': 3181,'##count': 12369,'狼': 4331,'次': 3613,'话': 6413,
...'1936': 9481,'小': 2207,'宜': 2139,'##獄': 17409,...}

查看词表大小

# 查看词表大小
tokenizer.vocab_size21128

(4)索引转换

# 将词序列转换为id序列
ids = tokenizer.convert_tokens_to_ids(tokens)
ids[2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106]

转换成token

# 将id序列转换为token序列
tokens = tokenizer.convert_ids_to_tokens(ids)
tokens

转换为string

# 将token序列转换为string
str_sen = tokenizer.convert_tokens_to_string(tokens)
str_sen

简洁的一步实现方式:

# 将字符串转换为id序列,又称之为编码
ids = tokenizer.encode(sen, add_special_tokens=True)        # add_special_tokens=False时候,不显示加入标签后的id
ids     # 这个id和之前的id前后分别多了一个101和102,是因为BERT在句子前后加了标志标签[101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106, 102]

解码

# 将id序列转换为字符串,又称之为解码
str_sen = tokenizer.decode(ids, skip_special_tokens=False)
str_sen'[CLS] 弱 小 的 我 也 有 大 梦 想! [SEP]'

(5)填充与截断

# 填充
ids = tokenizer.encode(sen, padding="max_length", max_length=15)        # 填充到最大长度15
ids[101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106, 102, 0, 0, 0]
# 截断
ids = tokenizer.encode(sen, max_length=5, truncation=True)
ids     # 保留了头尾标签和从前到后的三个词[101, 2483, 2207, 4638, 102]

(6)其他输入部分

# 先重新进行填充
ids = tokenizer.encode(sen, padding="max_length", max_length=15)
ids[101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106, 102, 0, 0, 0]
# attention_mask:标记哪些部分是真实输入,哪些部分是填充
attention_mask = [1 if idx != 0 else 0 for idx in ids]      # tokenizer中不为0时候,将其记录为1,标记为真实填充
# token_type_ids:用来区别哪个部分是第一个句子,哪个部分是第二个句子
token_type_ids = [0] * len(ids) 
ids, attention_mask, token_type_ids([101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106, 102, 0, 0, 0],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

* 使用函数,直接快速调用

inputs = tokenizer.encode_plus(sen, padding="max_length", max_length=15)        # 直接调用库实现上面功能
inputs{'input_ids': [101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106, 102, 0, 0, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]}
inputs = tokenizer(sen, padding="max_length", max_length=15)            # 直接调用tokenizer结果也一样
inputs{'input_ids': [101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 106, 102, 0, 0, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]}

(7)处理batch数据

sens = ["弱小的我也有大梦想","有梦想谁都了不起","追逐梦想的心,比梦想本身,更可贵"]
res = tokenizer(sens)
res{'input_ids': [[101, 2483, 2207, 4638, 2769, 738, 3300, 1920, 3457, 2682, 102], [101, 3300, 3457, 2682, 6443, 6963, 749, 679, 6629, 102], [101, 6841, 6852, 3457, 2682, 4638, 2552, 8024, 3683, 3457, 2682, 3315, 6716, 8024, 3291, 1377, 6586, 102]], 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]}

测试循环耗时

%%time          
# 该指令可计算cell的处理时间
# 单条循环处理
for i in range(1000):tokenizer(sen)CPU times: user 117 ms, sys: 0 ns, total: 117 ms
Wall time: 258 ms    

测试矩阵运算耗时

%%time
# 处理batch数据
res = tokenizer([sen] * 1000)       # 数据只需要进行tokenizer的时候,以batch方式去处理,速度最快CPU times: user 90 ms, sys: 20.3 ms, total: 110 ms
Wall time: 30.2 ms

可以发现采用矩阵运算花费事件远小于循环事件

tokenizerBertTokenizerFast(name_or_path='./roberta_tokenizer/', vocab_size=21128, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True),  added_tokens_decoder={0: AddedToken("[PAD]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),100: AddedToken("[UNK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),101: AddedToken("[CLS]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),102: AddedToken("[SEP]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),103: AddedToken("[MASK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}

* Fast/slow Tokenizer组件

在这里插入图片描述
默认加载

sen = "弱小的我也有大Dreaming!"# 默认方式创建下,为fast,即use_fast=True
fast_tokenizer = AutoTokenizer.from_pretrained("/u01/zhanggaoke/project/transformers-code-master/model/roberta-base-finetuned-dianping-chinese")
fast_tokenizerDistilBertTokenizerFast(name_or_path='/u01/zhanggaoke/project/transformers-code-master/model/roberta-base-finetuned-dianping-chinese', vocab_size=30522, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True),  added_tokens_decoder={0: AddedToken("[PAD]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),100: AddedToken("[UNK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),101: AddedToken("[CLS]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),102: AddedToken("[SEP]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),103: AddedToken("[MASK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}

加载use_fast=False

slow_tokenizer = AutoTokenizer.from_pretrained("/u01/zhanggaoke/project/transformers-code-master/model/roberta-base-finetuned-dianping-chinese", use_fast=False)
slow_tokenizerDistilBertTokenizer(name_or_path='/u01/zhanggaoke/project/transformers-code-master/model/roberta-base-finetuned-dianping-chinese', vocab_size=30522, model_max_length=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True),  added_tokens_decoder={0: AddedToken("[PAD]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),100: AddedToken("[UNK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),101: AddedToken("[CLS]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),102: AddedToken("[SEP]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),103: AddedToken("[MASK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}

处理时间对比

%%time
# 单条循环处理
for i in range(10000):fast_tokenizer(sen)CPU times: user 729 ms, sys: 11 ms, total: 740 ms
Wall time: 774 ms    
%%time
# 单条循环处理
for i in range(10000):slow_tokenizer(sen)     
# 可以发现slow的方法比fast慢的多    CPU times: user 1.74 s, sys: 0 ns, total: 1.74 s
Wall time: 1.75 s

批处理测试

%%time
# 处理batch数据
res = fast_tokenizer([sen] * 10000)CPU times: user 1.91 s, sys: 195 ms, total: 2.11 s
Wall time: 319 ms
%%time
# 处理batch数据
res = slow_tokenizer([sen] * 10000)CPU times: user 1.44 s, sys: 15.6 ms, total: 1.46 s
Wall time: 1.45 s

fast_tokenizer中专用的分词方式

# fast中offset_mapping,其中(0, 0)为首尾标记
inputs = fast_tokenizer(sen, return_offsets_mapping=True)
inputs{'input_ids': [101, 100, 1829, 1916, 1855, 1750, 1873, 1810, 12802, 999, 102], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'offset_mapping': [(0, 0), (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 15), (15, 16), (0, 0)]}
# 将词token去id化,其中None为首尾标记
inputs.word_ids()[None, 0, 1, 2, 3, 4, 5, 6, 7, 8, None]

* 远程加载

from transformers import AutoTokenizer# 当我们想要加载chatglm-6b远程代码库里的分词器时候,需要设置trust_remote_code=True
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)       
tokenizer.save_pretrained("chatglm_tokenizer")
tokenizer = AutoTokenizer.from_pretrained("chatglm_tokenizer", trust_remote_code=True)
tokenizer.decode(tokenizer.encode(sen))'弱小的我也有大Dreaming!'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208110.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

〖大前端 - 基础入门三大核心之JS篇㊸〗- DOM事件对象及它的属性

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024),这场科学盛宴,会议在中…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功,同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题,因为ts切片数据是保存在oss中的,我使用的是自己的oss账号,同事使用的是公司…

Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引

本文介绍如何使用 Azure AI 搜索 REST AP和用于发送和接收请求的 REST 客户端以交互方式构建请求。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员&…

Python 安装mysqlclient 错误 无法打开包括文件: “mysql.h”: 解决方法

解决方案:python最新3.12.0不支持mysqlclient 请下载 python3.9.9 版本 高速下载地址CNPM Binaries Mirror 官方下载地址Welcome to Python.org 下载完成后将python添加到环境变量 pycharm 虚拟环境下的python版本切换到你刚才下载的3.9.9的python版本 Avai…

C++动态内存管理new,delete

C动态内存管理new,delete 1.C/C内存分布2.C语言中的内存管理方式3.C中的内存管理方式new,delete3.1C中的内置类型new,delete3.2new,delete操作自定义类型3.3 new和delete匹配 4. operator new与operator delete函数4.1new和delete…

反转链表的实现

题目描述: 给出一个链表的头节点,将其反转,并返回新的头节点 思路1:反转地址 将每个节点里的地址由指向下一个节点变为指向前一个节点 定义三个结构体指针n1,n2,n3,n1表示改后指针的地址,n2表示要修改结构体里next的…

PT读spef报PARA-006如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 There are multiple causes that can trigger PARA-006 errors. Here is a checklist. 1) SPEF reading order Functionally, the parasitic files can be read in any order. For best stitching…

百度飞桨(张江)人工智能产业赋能中心入驻申请

中心如何赋能 百度飞桨(张江)人工智能产业赋能中心是浦东“大企业开放创新中心计划”首批企业代表,百度和张江集团将联合为入驻初创企业及生态合作伙伴提供以下服务: 降低AI使用门槛 通过“百度飞桨人工智能公共技术平台”&#x…

解决git与huggingface项目下载速度慢或者失败的问题

git clone 项目报错 比如使用git clone 下载项目: git clone https://github.com/ChuRuaNh0/FastSam_Awsome_TensorRT.git有时候会报以下错误: fatal: unable to access ‘https://github.com/xxx.git/’: Failed to connect to github.com port 443 …

[读论文]meshGPT

概述 任务:无条件生成mesh (无颜色)数据集:shapenet v2方法:先trian一个auto encoder,用来获得code book;然后trian一个自回归的transformermesh表达:face序列。face按规定的顺序&a…

大型网站系统架构演化(Web)

大型网站系统架构演化 大型网站系统架构演化需要关注的维度涉及的技术演进过程单体架构垂直架构使用缓存改善网站性能缓存与数据库的数据一致性问题缓存技术对比Redis分布式存储方案Redis集群切片的常见方式Redis数据类型Redis 淘汰算法使用服务集群改善网站并发能力 大型网站系…

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

利用Python中的Manim进行数学绘画和创作

相信很多同学就算没听过3Blue1Brown,也一定曾看过他们出品的视频,其从独特的视觉角度解说各种数学概念,内容包括线性代数、微积分、神经网络、傅里叶变换以及四元数等晦涩难懂的知识点。例如最火的《线性代数本质》系列视频。 那么这些视频是…

[学习记录]Node event loop 总结流程图

文章目录 文章来源根据内容输出的流程图待处理遗留的问题参考 文章来源 详解JavaScript中的Event Loop(事件循环)机制 根据内容输出的流程图 待处理 这里从polling阶段开始 好像有些问题 遗留的问题 为什么“在I/O事件的回调中,setImmediate…

Android 获取应用签名

Android 获取应用签名 本文主要讲下在android中如何获取应用签名. 也方便平时用来区分一个应用是不是原包应用. 1: 通过PackageManager获取签名信息 首先,通过packageManager获取到指定应用的PackageInfo. 这里需要传入的flag是PackageManager.GET_SIGNATURES /*** {link P…

matlab 汽车单车模型固定点跟踪算法

1、内容简介 略 29-可以交流、咨询、答疑 2、内容说明 单车模型固定点跟踪算法 单车模型,固定点跟踪算法,动画演示, 汽车单车模型、转弯动画、固定点跟踪算法、pid控制 3、仿真分析 略 A[0,5;0,0];B[0;1]; Q10*eye(2);R1; Klqr(A…

2015年五一杯数学建模A题不确定性条件下的最优路径问题解题全过程文档及程序

2015年五一杯数学建模 A题 不确定性条件下的最优路径问题 原题再现 目前,交通拥挤和事故正越来越严重的困扰着城市交通。随着我国交通运输事业的迅速发展,交通“拥塞”已经成为很多城市的“痼疾”。在复杂的交通环境下,如何寻找一条可靠、快…

C++利剑string类(详解)

前言:大家都知道在C语言里面的有 char 类型,我接下来要讲的 string 类功能是使用 char 类型写的类,当然这个是C官方写的,接下来我们将会学会使用它,我们会发现原来 char 这种类型是还能这么好用,授人以…

数学建模-基于LightGBM和BP神经网络的互联网招聘需求分析与预测

基于LightGBM和BP神经网络的互联网招聘需求分析与预测 整体求解过程概述(摘要) 就业是民生之本,是发展之基,也是安国之策。2020 年新冠肺炎疫情的爆发,稳就业成为应对疫情、稳定社会的重要保障之一。随着数据新动能的发展,互联网…