0x01 理解 tokenizer.json 结构
855 字
4 分钟
0x01 理解 tokenizer.json 结构
#1 作用
在自然语言处理里,tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 库生成的,它是分词器配置的核心文件。这里面的 vocab 和 merges 是子词分词算法(像 BPE 这种)的重要构成要素。
#2 字段解释
1. vocab(词汇表)
- 功能:vocab 是一个从 token(子词)到 ID 的映射表,其作用是把文本转换为模型能够处理的数字表示。
- 内容形式:
- 基础字符:涵盖了单个字符,例如
["a", "b", "c", ...]。 - 常见子词:包含常见的前缀、后缀或者词片段,例如
["Ġthe", "Ġquick", "Ġbrown", ...](这里的Ġ代表空格)。 - 特殊 token:有用于填充的
[PAD]、句子开始的[CLS]、分隔的[SEP]、未知词的[UNK]等。
- 基础字符:涵盖了单个字符,例如
- 运作机制:在分词时,文本会先被分解成基础字符,接着依据 merges 规则合并成子词,最后通过 vocab 将这些子词转换为对应的 ID。
2. merges(合并规则)
- 功能:merges 是一系列的合并规则,其目的是把基础字符组合成子词。这体现了 BPE(字节对编码)算法的核心思想。
- 内容形式:它是一个按照合并优先级排序的二元组列表,格式为
["ab", "Ġt", "he", ...]。排序越靠前的规则,应用的优先级越高。 - 运作机制:
- 初始状态:文本被拆分成单个字符,比如
"The dog"会变成["Ġ", "T", "h", "e", "Ġ", "d", "o", "g"]。 - 应用合并规则:按照 merges 中的顺序依次进行合并。
- 首先合并
"Ġ"和"T",得到["ĠT", "h", "e", "Ġ", "d", "o", "g"]。 - 然后合并
"h"和"e",得到["ĠT", "he", "Ġ", "d", "o", "g"]。 - 继续合并
"d"和"o",得到["ĠT", "he", "Ġ", "do", "g"]。 - 最后合并
"do"和"g",得到["ĠT", "he", "Ġ", "dog"]。
- 首先合并
- 映射到 ID:利用 vocab 将这些子词转换为 ID,例如
[103, 4, 0, 500](假设"ĠT"是未知词,对应[UNK]的 ID 为 103)。
- 初始状态:文本被拆分成单个字符,比如
#3 构造流程
1. 训练流程
- 从所有出现的字符构成初始词汇表。
- 统计训练数据中字符对的出现频率。
- 不断合并最常出现的字符对,每合并一次就更新一次词汇表。
- 重复上述合并过程,直到达到预设的词汇表大小或者合并次数。
2. 分词流程
- 把输入文本拆分成字符序列。
- 按照
merges规则进行合并,直到无法再合并或者达到最大子词长度。 - 查找
vocab,将子词转换为 ID。
#4 案例
假设 vocab 和 merges 已经训练好,对句子 "Hello world!" 进行分词:
- 初始字符:
["Ġ", "H", "e", "l", "l", "o", "Ġ", "w", "o", "r", "l", "d", "!"]。 - 应用合并规则:
- 合并
"H"和"e",得到["Ġ", "He", "l", "l", "o", "Ġ", "w", "o", "r", "l", "d", "!"]。 - 合并
"l"和"l",得到["Ġ", "He", "ll", "o", "Ġ", "w", "o", "r", "l", "d", "!"]。 - 合并
"He"和"ll",得到["Ġ", "Hell", "o", "Ġ", "w", "o", "r", "l", "d", "!"]。 - 合并
"Hell"和"o",得到["Ġ", "Hello", "Ġ", "w", "o", "r", "l", "d", "!"]。 - 合并
"Ġ"和"Hello",得到["ĠHello", "Ġ", "w", "o", "r", "l", "d", "!"]。 - 合并
"w"和"o",得到["ĠHello", "Ġ", "wo", "r", "l", "d", "!"]。 - 合并
"wo"和"r",得到["ĠHello", "Ġ", "wor", "l", "d", "!"]。 - 合并
"wor"和"l",得到["ĠHello", "Ġ", "worl", "d", "!"]。 - 合并
"worl"和"d",得到["ĠHello", "Ġ", "world", "!"]。 - 合并
"Ġ"和"world",得到["ĠHello", "Ġworld", "!"]。
- 合并
- 转换为 ID:假设 vocab 中有对应的项,那么结果就是
[1000, 1001, 1002]。
参考文献
[1] Zjun3021. 【知识扫盲】tokenizer.json中的vocab和merges是什么?[EB]//CSDN. (2025-07-15). https://blog.csdn.net/xyz3120/article/details/149358472.
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
0x01 理解 tokenizer.json 结构
https://firefly.cuteleaf.cn/posts/0x01/ 相关文章 智能推荐
1
0x00 理解 tokenizer.json 中没有中文
深度思考 2026-02-06
2
0x02 理解 embedding 层中 padding_idx 的作用
深度思考 2026-02-08
3
0x05 连续手语识别思考
深度思考 2026-06-17
4
0x03 设计游戏框架
框架设计 2026-05-24
随机文章 随机推荐