tokenizers Tokenizer 类

news/2025/2/7 7:07:56/

Tokenizer 类

依赖安装

pip install tensorflow
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple

基类原型

tokenizers.Tokenizer(model)

基类说明

Tokenizer 函数构造一个分词器对象。分词方式主要有word-level、subword-level、char-level三种,其中,subword-level分词方式又有四种不同实现的方法:BPE、Unigram、WordPiece、SentencePiece。
参数 model 表示分词器使用的分词方式,接受一个Model对象,这里主要实现了 word-level 的分词方式以及 subword-level 的分词方式。Tokenizer 类主要的方法有:

# 从指定文件加载 Tokenizer 对象。
from_file(path)
# 从Hugging Face Hub官网上加载一个已存在的Tokenizer对象。参数identifier 就是加载的对象模型。
from_pretrained(identifier, revision = ‘main’, auth_token = None)
# 从 json 格式的字符串来加载 Tokenizer 对象。
from_str(json)
# 从缓冲区来加载 Tokenizer 对象。
from_buffer(buffer)
# 对于给定的一个分句进行编码,返回一个Encoding 对象。参数 pair 表示第二个分句。参数 is_pretokenized 表示是否已经预分词化,如果为 True,则输入的 sequence 和 pair 都应该为一个列表。
encode(sequence, pair = None, is_pretokenized = False, add_special_tokens = True)
# 对多个分句进行编码,返回一个 Encoding 对象。
encode_batch(input, is_pretokenized = False, add_special_tokens = True)
# 表示对一个 id 序列进行解码,将 id 映射为字符串。参数 skip_special_tokens 表示是否跳过特殊的字符串。这些特殊的字符串是由 add_special_tokens 函数来创建的。
decode(ids, skip_special_tokens = True)
# 表示对多个 id 序列进行解码。
decode_batch(sequences, skip_special_tokens = True)
# 添加新的分词,这些分词会添加到词汇表中。
add_tokens(tokens)
# 添加特殊的分词到词汇表中,与 add_tokens 函数不同的是,这些特殊的分词可以在解码时被忽略。
add_special_tokens(tokens)
# 设置在进行 encode_batch 操作时,当各个分句的长度不一样时应用填充。
enable_padding(direction = ‘right’, pad_id = 0, pad_type_id = 0, pad_token =[PAD], length = None, pad_to_multiple_of = None)
# 设置在进行 encode_batch 操作时,当各个分句的长度不一样时对分句进行截取。
enable_truncation(max_length, stride = 0, strategy = ‘longest_first’, direction = ‘right’)
# 禁用填充。
no_padding()
# 禁用截取。
no_truncation()
# 保存 tokenizer 模型(一个 json 文件)到指定路径,参数 pretty 表示用一行还是多行来表示 json 文件,默认为多行。
save(path, pretty = True)
# 用指定文件列表里面的数据来训练分词器。
train(files, trainer = None)
# 将单个 id 转换成单个字符。
id_to_token(id)
# 将单个字符转换成单个 id。
token_to_id(token)

函数使用

tokenizer 模型的加载

# 第一种加载方式
# 从 json 文件中加载 tokenizer 对象
tokenizer0 = tokenizers.Tokenizer.from_file("./tokenizer4/vocab.json")
# 从 hugging face 官网中在线加载 tokenzier 对象
tokenizer1 = tokenizers.Tokenizer.from_pretrained("distilbert-base-uncased")
# 根据 json 文件的内容字符串来加载 tokenizer 对象
with open("./tokenizer4/vocab.json", "r", encoding="utf8") as file:json_dict = json.load(file)json_string = json.dumps(json_dict)
tokenizer2 = tokenizers.Tokenizer.from_str(json_string)# 第二种加载方式
tokenizer = tokenizers.Tokenizer()
tokenizer.model = models.BPE().from_file(vocab="./tokenizer4/vocab.json", merges="./tokenizer4/merges.txt")

tokenizer 模型的训练

# 中文分词方式,除了 BPE,还有 WordPiece、Unigram 两种
tokenizer = tokenizers.Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
tokenizer.decoder = decoders.BPEDecoder()
trainer = trainers.BpeTrainer()
tokenizer.train(["ch_demo_sm.txt"], trainer)# 英文分词方式,word-level 分词方式
tokenizer = tokenizers.Tokenizer(models.WordLevel())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.WordLevelTrainer(special_tokens=["[PAD]"])
tokenizer.train(["en_demo_sm.txt"], trainer)# 英文分词方式,subword-level 分词方式
# 这里使用 wordpiece 分词方法
tokenizer = tokenizers.Tokenizer(models.WordPiece())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.WordPieceTrainer(special_tokens=["[PAD]"])
tokenizer.train(["en_demo_sm.txt"], trainer)

tokenizer 模型的保存

# 使用 tokenizer.save 函数保存,会生成一个 vocab.json 文件
tokenizer.save("./tokenizer4/vocab.json")# 使用 tokenizer.model.save 保存,会生成一个 vocab.json 和一个 merges.txt 文件
# 注意这个 vocab.json 和上面的 vocab.json 文件内容不一样。
tokenizer.model.save("./tokenizer4")

使用 tokenizer 模型进行 encode 和 decode 操作

# 编码一个句子
encoding0 = tokenizer.encode("any attempt to leave surprises me.")
# 编码一个有两个分句的句子
encoding1 = tokenizer.encode("any attempt to leave surprises me.", pair="arrival of John dead surprised me.")
# 参数 is_pretokenized=True 时,参数 sequence 应为一个列表
encoding2 = tokenizer.encode(["any attempt to leave surprises me."],is_pretokenized=True)
# 编码多个句子
encodings0 = tokenizer.encode_batch(["any attempt to leave surprises me.","the arrival of John dead surprised me."])
# 编码多个有两个分词的句子
encodings1 = tokenizer.encode_batch([("any attempt to leave surprises me.", "John's arrival dead surprised me."),("John's attempt to leave surprised me.", "the arrival of John dead surprised me.")])
# 参数 is_pretokenized=True 时,参数 sequence 应为一个列表
encodings2 = tokenizer.encode_batch([["any attempt to leave surprises me."],["the arrival of John dead surprised me."]], is_pretokenized=True)# 对一个 ids 进行解码
decode_string = tokenizer.decode(encoding1.ids, skip_special_tokens=False)
# 对多个 ids 进行解码
decode_strings = tokenizer.decode_batch([encodings1[0].ids, encodings1[1].ids])# 将单词变成 id
token_id = tokenizer.token_to_id("me")
# 将 id 变成单词
token = tokenizer.id_to_token(62)

实操

指定单个文件

参考:
https://www.utheme.cn/aigc/28687.html

from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespacedef train_tokenizer():# 创建一个空的 BPE 模型tokenizer = Tokenizer(BPE())# 创建一个 Trainer,并指定一些训练参数trainer = BpeTrainer(special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"])# 创建一个 PreTokenizerpre_tokenizer = Whitespace()# 使用 Trainer 和 PreTokenizer 训练 BPE 模型tokenizer.pre_tokenizer = pre_tokenizer#files = ["/path/to/your/dataset.txt"] # 替换为你用来训练tokenizer的文本数据的路径# 参考地址:https://job.yanxishe.com/blogDetail/18050# 下载地址:https://wortschatz.uni-leipzig.de/en/download/Chinesefiles = ["/home/*/tokenizers/zho_news_2020_10K/zho_news_2020_10K-words.txt"]tokenizer.train(files, trainer)return tokenizerdef count_tokens(text, tokenizer):# 使用 tokenizer 将文本转化为 tokensoutput = tokenizer.encode(text)print("count_tokens", output.tokens)print("count_tokens", output)# 输出的 tokens 的数量return len(output.tokens)# 创建 tokenizer
tokenizer = train_tokenizer()# 测试字符串的 tokens 数量
text = "这是一个测试句子。"
print(count_tokens(text, tokenizer))

运行结果
tokenizers

指定路径

参考:
https://job.yanxishe.com/blogDetail/18050

from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespacefrom pathlib import Pathdef train_tokenizer():# 创建一个空的BPE模型tokenizer = Tokenizer(BPE())# 创建一个Trainer,并指定一些训练参数trainer = BpeTrainer(special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"])# 创建一个PreTokenizerpre_tokenizer = Whitespace()# 使用Trainer和PreTokenizer训练BPE模型tokenizer.pre_tokenizer = pre_tokenizer##files = ["/path/to/your/dataset.txt"] # 替换为你用来训练tokenizer的文本数据的路径##files = ["/home/lianap/llm/datasets/test/rm-static/dataset_infos.json"] # 替换为你用来训练tokenizer的文本数据的路径#files = ["/home/lianap/tokenizers/zho_news_2020_10K/zho_news_2020_10K-words.txt"] # 替换为你用来训练tokenizer的文本数据的路径#tokenizer.train(files, trainer)paths = [str(x) for x in Path("./zho_news_2020_10K/").glob("**/*.txt")]#tokenizer.train(files=paths, vocab_size=52_000, min_frequency=2, special_tokens=[#    "<s>",#    "<pad>",#    "</s>",#    "<unk>",#    "<mask>",#])tokenizer.train(files=paths, trainer=trainer)return tokenizerdef count_tokens(text, tokenizer):# 使用tokenizer将文本转化为tokensoutput = tokenizer.encode(text)print("count_tokens", output.tokens)print("count_tokens", output)# 输出的tokens的数量return len(output.tokens)# 创建tokenizer
tokenizer = train_tokenizer()# 测试字符串的tokens数量
text = "这是一个测试句子。"
#text = "测试字符串的tokens数量。"
#text = "hello world"
print(count_tokens(text, tokenizer))

tokenizers2

收藏

https://zhuanlan.zhihu.com/p/591335566
https://blog.csdn.net/m0_74053536/article/details/134151336


http://www.ppmy.cn/news/1236336.html

相关文章

宣传技能培训1——《新闻摄影技巧》光影魔法:理解不同光线、角度、构图的摄影效果,以及相机实战操作 + 新闻摄影实例讲解

新闻摄影技巧 写在最前面摘要 构图与拍摄角度景别人物表情与叙事远景与特写 构图与拍摄角度案例 主体、陪体、前景、背景强调主体利用前景和背景层次感的创造 探索新闻摄影中的构图技巧基本构图技巧构图技巧的应用实例实例分析1. 黄金分割和九宫格2. 三角型构图3. 引导线构图4.…

Idea 2023.2.5配置(插件、Maven等)

IDEA2023.2.5配置 一. 插件Alibaba Java Coding Guidelines plugin supportMaven HelperMyBatisXSonarLintTranslationVuesion Theme 二. 自定义创建live template&#xff0c;快速写代码三. 修改全局配置3.1 Maven配置3.1.1 安装MavenStep1. 下载Step2. 安装Step3. 创建系统环…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十一)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

Redis的四种模式:单机、主从、哨兵、集群

一、简单理解 单机模式&#xff1a;安装你的redis&#xff0c;启动服务即为单机模式。 主从模式&#xff1a;一个主节点搭配一个或多个从节点&#xff0c;无自动故障转移功能&#xff0c;主节点发生故障后&#xff0c;需要人工将其中一个从节点设置为主节点。 哨兵模式&…

机器学习【01】相关环境的安装

学习实例 参考资料&#xff1a;联邦学习实战{杨强}https://book.douban.com/subject/35436587/ 项目地址&#xff1a;https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification 一、环境准备 GPU安装CUDA、cuDNN pytho…

Ubuntu端口用法介绍

一、端口概述 端口是用于网络通讯中标识应用程序的通信机制。在Ubuntu系统中&#xff0c;共有65536个端口。 其中&#xff0c;0号端口保留&#xff0c;1-1023为系统端口&#xff0c;一般被系统进程或服务占用。1024-49151为注册端口&#xff0c;可以被用户进程或服务使用。49…

Linux中的进程程序替换

Linux中的进程程序替换 1. 替换原理2. 替换函数3. 函数解释4. 命名理解程序替换的意义 1. 替换原理 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的…

matlab绘图函数plot和fplot的区别

一、背景 有的函数用plot画就会报错&#xff0c;显示数据必须为可转换为双精度值的数值、日期时间、持续时间、分类或数组。 如下图所示&#xff1a; 但用fplot函数就没有问题&#xff0c;因此这里记录一下两者的区别&#xff0c;如果使用不当&#xff0c;画出的图可能就是下…