0x01 理解 tokenizer.json 结构

855 字
4 分钟
0x01 理解 tokenizer.json 结构

#1 作用#

在自然语言处理里,tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 库生成的,它是分词器配置的核心文件。这里面的 vocabmerges 是子词分词算法(像 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!" 进行分词:

  1. 初始字符:["Ġ", "H", "e", "l", "l", "o", "Ġ", "w", "o", "r", "l", "d", "!"]
  2. 应用合并规则:
    • 合并 "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", "!"]
  3. 转换为 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/
作者
Firefly
发布于
2026-02-07
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Firefly
Hello, I'm Firefly.
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
6
分类
3
标签
4
总字数
17,732
运行时长
0
最后活动
0 天前

文章目录