huggingface的tokenizer解读

文章目录

  • 前言
  • 一、huggingface的tokenizer含义
    • 1、含义
    • 2、整体概括
  • 二、加载lmsys/vicuna-7b-v1.5模型的tokenizer
  • 三、调用tokernizer方法
  • 四、字符串的tokens应用
    • 1、tokenizer应用
    • 2、tokenizer进行token分词(tokenizer.tokenize)
    • 3、tokens转模型识别ids(tokenizer.convert_tokens_to_ids)
    • 4、ids转token(tokenizer.convert_ids_to_token)
  • 五、tokenizer的decode应用(tokenizer.decode)
  • 六、tokenizer的encode应用
    • 1、tokenizer的tokenizer.encode
    • 2、tokenizer的tokenizer.encode_plus
    • 3、tokenizer的tokenizer.batch_encode_plus
      • a、tokenizer.batch_encode_plus函数含义
      • b、tokenizer.batch_encode_plus使用方法
      • c、tokenizer.batch_encode_plus运行结果
  • 七、完整代码


前言

目前很多大模型或NLP相关模型可使用huggingface实现,是一个非常好用的集成库,特别是transformer库。而Hugging Face的Tokenizer模块是该平台的重要组成部分,主要用于文本的处理和编码。Tokenizer模块提供了各种先进的文本处理工具,包括分词、编码、解码等功能。本文将以llama模型作为tokenizer列子,介绍tokenizer相关使用内容。


一、huggingface的tokenizer含义

1、含义

Tokenizers are one of the core components of the NLP pipeline. They serve one purpose: to translate text into data that can be processed by the model. Models can only process numbers, so tokenizers need to convert our text inputs to numerical data. In this section, we’ll explore exactly what happens in the tokenization pipeline.
However, models can only process numbers, so we need to find a way to convert the raw text to numbers. That’s what the tokenizers do, and there are a lot of ways to go about this. The goal is to find the most meaningful representation — that is, the one that makes the most sense to the model — and, if possible, the smallest representation.

翻译理解为:Hugging Face的tokenizer是用于将文本转换为模型可以理解的格式的工具。它可以将输入文本分解成ids,并根据模型的要求进行编码。这样可以确保模型能够正确地理解输入并进行处理。也就是说模型只能加工数字,toknizer就是处理文本到数字过程。不同模型有不同tokenizer表示。我将以小羊驼语言模型作为列子说明。

直白理解:处理文本能被模型处理的输入格式。

官网解释链接:https://huggingface.co/learn/nlp-course/chapter2/4?fw=pt

2、整体概括

其主要内容可以总结如下:

Tokenization(分词):Tokenizer模块支持多种语言的分词器,能够将输入的文本分割成单词、子词或字符,为后续的处理和编码做准备。这对于不同NLP任务来说非常重要,因为文本的分割方式直接影响到模型的输入表示。

编码和解码:Tokenizer能够将文本转换成模型可接受的输入编码,并能够将模型输出的编码解码成可读的文本。这对于使用预训练模型进行推理和生成任务非常关键。

特殊标记处理:Tokenizer能够处理特殊标记,如掩码标记(mask token)、分隔标记(separator token)等,这些标记在不同的NLP任务中扮演着重要的角色。

多种预训练模型支持:Tokenizer模块支持多种预训练模型,包括BERT、GPT、LLMA等,用户可以根据自己的需求选择合适的模型和相应的Tokenizer进行文本处理。

总之,Hugging Face的Tokenizer模块为用户提供了强大而灵活的文本处理工具,能够满足各种NLP任务对于文本处理的需求,并与Hugging Face平台上的其他模块无缝集成,为NLP研究和开发提供了便利。

二、加载lmsys/vicuna-7b-v1.5模型的tokenizer

huggingface最强大库的transformer,内有很多语言模型,也提供了很简单操作可实现tokenizer,你只需在官网下载对应模型库文件,然后使用对应包.from_pretrained(模型文件夹地址)

代码如下:

from transformers import LlamaTokenizer
def llama2_tokenizer(tokenizer_path, signal_type="base"):tokenizer = LlamaTokenizer.from_pretrained(tokenizer_path)# 向tokenizer中添加变量与值if tokenizer.pad_token_id is None:tokenizer.pad_token_id = 32000tokenizer.boi = "[IMG]"tokenizer.eoi = "[/IMG]"assert signal_type in ["base", "chat", "vqa", "chat_old"]tokenizer.signal_type = signal_typereturn tokenizer

以上实现基于llma模型的tokenizer方法调用,实际是文本转模型识别数字的一些包装。当然,你也可参考映射map方法博客点击这里。

三、调用tokernizer方法

下载好对应文件权重如下格式:
在这里插入图片描述
在二中实现加载tokenizer方式,在使用如下代码给出tokenizer,如下:

    llama_path = '/home/lmsys/vicuna-7b-v1.5'tokenizer = llama2_tokenizer(llama_path)

四、字符串的tokens应用

1、tokenizer应用

直接使用tokenizer方法,可返回input_ids与attention_mask,这里attention_mask表示每个文本对应位置值,若有文本词则为1否则为0,后面我会进一步说明。

    text = 'It is a nice day't=tokenizer(text)print(t)t = tokenizer(['It is a nice day', 'nice day'])print(t)

结果如下:

第一个输出值为一个文本:
{'input_ids': [1, 739, 338, 263, 7575, 2462], 'attention_mask': [1, 1, 1, 1, 1, 1]}
第二个输出值为文本列表:
{'input_ids': [[1, 739, 338, 263, 7575, 2462], [1, 7575, 2462]], 'attention_mask': [[1, 1, 1, 1, 1, 1], [1, 1, 1]]}

当然,不同模型的tokenizer会多一些值,如官网返回值:

{'input_ids': [101, 7993, 170, 11303, 1200, 2443, 1110, 3014, 102],'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0],'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}

2、tokenizer进行token分词(tokenizer.tokenize)

使用tokenizer.tokenize可输出字符串列表或叫token,官网解释The output of this method is a list of strings, or tokens,其代码如下:

    text = 'It is a nice day'# tokenize,#仅用于分词tokens = tokenizer.tokenize(text)print("token分词结果:\n", tokens)

结果如下:

 ['▁It', '▁is', '▁a', '▁nice', '▁day']

实际是对文本text进行分词方法,完成了分词就能找到对应数字,也就是模型能识别的数字了。

3、tokens转模型识别ids(tokenizer.convert_tokens_to_ids)

使用tokenizer.convert_tokens_to_ids将token转成模型识别ids,官网解释The conversion to input IDs is handled by the convert_tokens_to_ids() tokenizer method:,其代码如下:

    # convert_tokens_to_ids,将token转化成ids,在分词之后,ids = tokenizer.convert_tokens_to_ids(tokens)print("tokens Ids:\n", ids)

结果如下:

 [739, 338, 263, 7575, 2462]

输出转为张量结构,模型可输入数字,实际是文本text分词后找映射数字。

注:映射数字id只对应分词,无开始和结束id

4、ids转token(tokenizer.convert_ids_to_token)

应用ids转回token,需要根据对应模型,有的模型提供可直接使用,若没有提供则不需要使用。恰好llama为提供该转换方法。

    # convert_ids_to_tokens,将id转化成token,通常用于模型预测出结果,查看时使用。tokens = tokenizer.convert_ids_to_token(ids)print("tokenize Id2token:\n", tokens)

五、tokenizer的decode应用(tokenizer.decode)

使用tokenizer.decode将token转成模型的ids,官网解释The conversion to input IDs is handled by the convert_tokens_to_ids() tokenizer method:,其代码如下:

    # ids映射回原来文本内容decoded_string = tokenizer.decode(ids)print('ids2text', decoded_string)

结果如下:

 [739, 338, 263, 7575, 2462]

实际是文本text分词后找映射数字。

注:映射数字id只对应分词,无开始和结束id

六、tokenizer的encode应用

1、tokenizer的tokenizer.encode

使用tokenizer.encode将文本转为对应ids,其代码如下:

    #  encode,进行分词和token转换,encode=tokenize+convert_tokens_to_idsencode_num = tokenizer.encode(text)print("text=",text)print('encode=', encode_num)decoded_string = tokenizer.decode(encode_num)print('decode=', decoded_string)

结果如下:

text= It is a nice day
encode= [1, 739, 338, 263, 7575, 2462]
decoded_string= <s> It is a nice day

可看出输出多了文字,这个应该是模型需要的,类似seq

2、tokenizer的tokenizer.encode_plus

将encode的输出变成input_ids变量,其值完全不变,且多出attention_mask变量,也会根据模型方法会多出其它变量,其代码如下:

    # encode_plus,在encode的基础之上生成input_ids、token_type_ids、attention_maskencode_plus_text = tokenizer.encode_plus(text)print("验证encode_plus编码\nencode_plus=", encode_plus_text)

结果如下:


encode_plus= {'input_ids': [1, 739, 338, 263, 7575, 2462], 'attention_mask': [1, 1, 1, 1, 1, 1]}

在encode基础上多了attention_mask内容,有的模型会提供一些其它多余输出结果(如:token_type_ids)。

3、tokenizer的tokenizer.batch_encode_plus

a、tokenizer.batch_encode_plus函数含义

tokenizer.batch_encode_plus函数用于批量对文本进行编码处理,它可以同时处理多个文本,并提供填充、截断、返回张量类型等选项。

texts: 待编码的文本列表
return_tensors: 指定返回的张量类型,如'tensor''pt'
padding: 是否对文本进行填充
truncation: 是否对文本进行截断
max_length: 最大长度限制
return_attention_mask: 是否返回注意力掩码张量

b、tokenizer.batch_encode_plus使用方法

    batch_encode_plus = tokenizer.batch_encode_plus(text_batch, max_length=10, padding='max_length', truncation='longest_first')  # 长的截,短的补print("验证batch_encode_plus编码\nbatch_encode_plus=", batch_encode_plus)

c、tokenizer.batch_encode_plus运行结果

batch_encode_plus= {'input_ids': [[1, 739, 338, 263, 7575, 2462, 0, 0, 0, 0], [1, 7575, 2462, 0, 0, 0, 0, 0, 0, 0]], 'attention_mask': [[1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0]]}

七、完整代码

from transformers import LlamaTokenizer
def llama2_tokenizer(tokenizer_path, signal_type="base"):tokenizer = LlamaTokenizer.from_pretrained(tokenizer_path)# 向tokenizer中添加变量与值if tokenizer.pad_token_id is None:tokenizer.pad_token_id = 32000tokenizer.boi = "[IMG]"tokenizer.eoi = "[/IMG]"assert signal_type in ["base", "chat", "vqa", "chat_old"]tokenizer.signal_type = signal_typereturn tokenizerdef tokenizer_tutor():llama_path = '/extend_disk/tj/CogVLM-main/lmsys/vicuna-7b-v1.5'tokenizer = llama2_tokenizer(llama_path)text_batch = ['It is a nice day', 'nice day']text = 'It is a nice day't=tokenizer(text)print(t)t = tokenizer(text_batch)print(t)# tokenize,#仅用于分词tokens = tokenizer.tokenize(text)print("token分词结果:\n", tokens)# convert_tokens_to_ids,将token转化成ids,在分词之后,ids = tokenizer.convert_tokens_to_ids(tokens)print("tokens Ids:\n", ids)# # convert_ids_to_tokens,将id转化成token,通常用于模型预测出结果,查看时使用。# tokens = tokenizer.convert_ids_to_token(ids)# print("tokenize Id2token:\n", tokens)# ids映射回原来文本内容decoded_string = tokenizer.decode(ids)print('decode=', decoded_string)#  encode,进行分词和token转换,encode=tokenize+convert_tokens_to_idsencode_num = tokenizer.encode(text)print("验证encode编码\ntext=",text)print('encode=', encode_num)decoded_string = tokenizer.decode(encode_num)print('decoded_string=', decoded_string)# encode_plus,在encode的基础之上生成input_ids、token_type_ids、attention_maskencode_plus_text = tokenizer.encode_plus(text)print("验证encode_plus编码\nencode_plus=", encode_plus_text)batch_encode_plus = tokenizer.batch_encode_plus(text_batch, max_length=10, padding='max_length', truncation='longest_first')  # 长的截,短的补print("验证batch_encode_plus编码\nbatch_encode_plus=", batch_encode_plus)if __name__ == '__main__':tokenizer_tutor()

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

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

相关文章

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-00x10

如上表所示&#xff0c;MOE0&#xff0c;OSSI0&#xff0c;CCxE1&#xff0c;CCxNE0时&#xff0c;OCx与OCxN的输出状态取决于GPIO端口上下拉状态。 ---------------------------------------------------------------------------------------------------------------------…

Python 中的运算符介绍(1)

算数运算符 常见的% 、//、/ 用法 赋值运算符 赋值运算&#xff1a;将等号右边赋值给等号左边 常见场景&#xff1a; 比较运算符 代码解析&#xff1a; 逻辑运算符 位运算符&#xff08;了解&#xff09; 三目运算符 身份证运算符 成员运算符

考研后SpringBoot复习2—容器底层相关注解

考研后SpringBoot复习2 SpringBoot底层注解学习 与容器功能相关的注解与springboot的底层原理密切相关 组件添加注解configuration Spring Ioc容器部分回顾 包括在配置中注册&#xff0c;开启包扫描和注解驱动开发等需要在进行重新的学习回顾 实例 package com.dzu.boot;imp…

zyqn-arm软中断设置

所有SGI都是边缘触发的&#xff0c;sgi的灵敏度类型是固定的&#xff0c;不能改变。 软中断初始化流程 1、初始化异常处理 2、初始化中断控制器 3、注册异常处理回调函数到CPU 4、连接软中断信号与注册软中断回调函数 5、使能中断控制器中的软中断中断 6、使能异常处理 …

Android 10.0 mtp模式下PC上显示两个内部存储的问题解决办法

1. 前言 在10.0的系统产品开发中,在mtp模式下,有些时候会在pc端显示两个手机内部存储空间,所以这时候显得特别不友好,出于对产品 的完善,所以要求解决这个问题,接下来分析下这个问题 2.mtp模式下PC上显示两个内部存储的问题解决办法的核心类 frameworks\base\media\jav…

k8s学习 — 各章节重要知识点

k8s学习 — 各章节重要知识点 学习资料k8s版本0 相关命令0.1 yaml配置文件中粘贴内容格式混乱的解决办法0.2 通用命令0.3 Node 相关命令0.4 Pod 相关命令0.5 Deployment 相关命令0.6 Service 相关命令0.7 Namespace 相关命令 1 k8s学习 — 第一章 核心概念1.1 Pod、Node、Servi…

Python装饰器的专业解释

装饰器&#xff0c;其实是用到了闭包的原理来进行操作的。 单个装饰器&#xff1a; 以下是一个简单的例子&#xff1a; def outer(func):print("OUTER enter ...")def wrapper(*args, **kwargs):print("调用之前......")result func(*args, **kwargs)p…

【Vue2+3入门到实战】(17)VUE之VueCli脚手架自定认创建项目、ESlint代码规范与修复、 ESlint自动修正插件的使用 详细示例

目录 一、本节内容二、VueCli 自定义创建项目三、ESlint代码规范及手动修复1.JavaScript Standard Style 规范说明2.代码规范错误3.手动修正 四、通过eslint插件来实现自动修正 一、本节内容 VueCli脚手架自定认创建项目ESlint代码规范与修复ESlint自动修正插件 二、VueCli 自…

FA模板制作流程

1、FA模板制作的流程&#xff08;完整复制模板制作&#xff09; 总结&#xff1a; FA完整复制云桌面模板流程&#xff1a; 1、安装一个全新的Windows&#xff0c;挂载并安装tools 2、关闭防火墙、启动administrator本地超管用户 3、挂载FusionAccess_WindowsDesktop_Instal…

使用iris数据集学习基础的机器学习分类任务

通过一个案例来理解机器学习的分类任务 关于数据集的相关介绍大家可以观看下面的连接&#xff1a; iris数据集的介绍 根据数据集的特征值来预测目标值 即通过x来预测y 相应的代码如下&#xff1a; # Training Machine Learning Algorithms for Classification # 加载数据 s h…

C/C++面向对象(OOP)编程-回调函数详解(回调函数、异步编程、函数指针、)

本文主要介绍回调函数的使用&#xff0c;包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;C/C精进之路 &…

黑马程序员SSM框架-SpringBoot

视频连接&#xff1a;SpringBoot-01-SpringBoot工程入门案例开发步骤_哔哩哔哩_bilibili SpringBoot简介 入门程序 也可以基于官网创建项目。 SpringBoot项目快速启动 下面的插件将项目运行所需的依赖jar包全部加入到了最终运行的jar包中&#xff0c;并将入口程序指定。 Spri…

【网络面试(2)】DNS原理-域名和IP地址的查询转换

从上一篇博客我们得知浏览器是如何生成了HTTP消息了&#xff0c;但是浏览器作为应用程序&#xff0c;是不具备向网络中发送请求的能力&#xff0c;而是需要委托给操作系统的内核协议栈来发送请求。在委托协议栈之前&#xff0c;浏览器还要做的一件事情就是将域名转换为IP地址。…

gn入门(Chromium)

Chromium是用gn和ninja进行编译的,即gn把.gn文件转换成.ninja文件,然后ninja根据.ninja文件将源码生成目标程序。gn和ninja的关系就与cmake和make的关系差不多。 代码下载:https://download.csdn.net/download/arv002/88668243 1. 环境配置 在我们自己的项目中,也可以使用…

java进阶(三)

IO与网络编程 3 输入输出流IO3.1 基础定义3.2 IO框架3.3 读取字节输入流-InputStream3.3.1 InputStream.read3.3.2 FileInputStream类说明 3.4读取字符输入流Reader3.4.1 Reader.read3.4.2 FileReader类说明 3.5 字节输出流OutputStream3.5.1 OutputStream.write3.5.2 FileOutp…

NumPy 中级教程——通用函数(ufuncs)

Python NumPy 中级教程&#xff1a;通用函数&#xff08;ufuncs&#xff09; NumPy 中的通用函数&#xff08;ufuncs&#xff09;是一种能够对数组进行元素级操作的函数&#xff0c;支持数组的快速、逐元素的操作&#xff0c;是进行数据处理的关键工具之一。在本篇博客中&…

nodejs微信小程序+python+PHP特困救助供养信息管理系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

分库分表之Mycat应用学习四

4 分片策略详解 分片的目标是将大量数据和访问请求均匀分布在多个节点上&#xff0c;通过这种方式提升数 据服务的存储和负载能力。 4.1 Mycat 分片策略详解 总体上分为连续分片和离散分片&#xff0c;还有一种是连续分片和离散分片的结合&#xff0c;例如先 范围后取模。 …

基于AT89C51单片机可做实物的温度烟雾火灾报警设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88658141?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤02 摘要 随着现代家庭用火、用电量的增加&#xff0c;家庭火灾发生的频率越来越高。火灾报警…

快排例题——第k个数

做道简单一点的题巩固一下 基本思路 与上一个整体相似&#xff0c;通过快速排序将长度为n的整数数列变为从小到大的有序数组&#xff0c;在拿出其中第k个数。 题目描述 给定一个长度为 n 的整数数列&#xff0c;以及一个整数 k&#xff0c;请用快速选择算法求出数列从小到大…