[ PROMPT_NODE_23008 ]
Tokenization Huggingface Tokenizers 算法
[ SKILL_DOCUMENTATION ]
# 分词算法深度解析
关于 BPE、WordPiece 和 Unigram 算法的全面解释。
## 字节对编码 (BPE)
### 算法概述
BPE 迭代地合并语料库中最频繁的 Token 对。
**训练过程:**
1. 使用所有字符初始化词汇表
2. 计算所有相邻 Token 对的频率
3. 将最频繁的对合并为新 Token
4. 将新 Token 添加到词汇表
5. 用新 Token 更新语料库
6. 重复直到达到词汇表大小
### 分步示例
**语料库:**
low: 5
lower: 2
newest: 6
widest: 3
**迭代 1:**
统计对:
'e' + 's': 9 (newest: 6, widest: 3) ← 最频繁
'l' + 'o': 7
'o' + 'w': 7
...
合并: 'e' + 's' → 'es'
更新后的语料库:
low: 5
lower: 2
newest: 6 → newes|t: 6
widest: 3 → wides|t: 3
词汇表: [a-z] + ['es']
**迭代 2:**
统计对:
'es' + 't': 9 ← 最频繁
'l' + 'o': 7
...
合并: 'es' + 't' → 'est'
更新后的语料库:
low: 5
lower: 2
newest: 6 → new|est: 6
widest: 3 → wid|est: 3
词汇表: [a-z] + ['es', 'est']
**持续进行直到达到期望的词汇表大小...**
### 使用训练好的 BPE 进行分词
给定词汇表: `['l', 'o', 'w', 'e', 'r', 'n', 's', 't', 'i', 'd', 'es', 'est', 'lo', 'low', 'ne', 'new', 'newest', 'wi', 'wid', 'widest']`
分词 "lowest":
步骤 1: 拆分为字符
['l', 'o', 'w', 'e', 's', 't']
步骤 2: 应用训练期间学习到的合并顺序
- 合并 'l' + 'o' → 'lo' (如果已学习)
- 合并 'lo' + 'w' → 'low' (如果已学习)
- 合并 'e' + 's' → 'es' (已学习)
- 合并 'es' + 't' → 'est' (已学习)
最终: ['low', 'est']
### 实现
python
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespace
# 初始化
tokenizer = Tokenizer(BPE(unk_token="[UNK]"))
tokenizer.pre_tokenizer = Whitespace()
# 配置训练器
trainer = BpeTrainer(
vocab_size=1000,
min_frequency=2,
special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"]
)
# 训练
corpus = [
"This is a sample corpus for BPE training.",
"BPE learns subword units from the training data.",
# ... 更多句子
]
tokenizer.train_from_iterator(corpus, trainer=trainer)
# 使用
output = tokenizer.encode("This is tokenization")
print(output.tokens) # ['This', 'is', 'token', 'ization']
### 字节级 BPE (GPT-2 变体)
**问题**:标准 BPE 的字符覆盖范围有限(256+ Unicode 字符)
*