什么是Tokenizer
内容
在自然语言处理(NLP)中,Tokenizer(分词器/令牌生成器) 是将原始文本转换为模型可处理的结构化数据的核心组件。它的核心任务是将句子拆分为更小的单元(Token),并将这些单元映射为数字ID,供机器学习模型(如BERT、GPT)理解和计算。
一、Token 是什么?
Token 是文本的最小处理单元,其形式取决于分词策略:
-
单词级(Word-level)
将文本按空格或标点分割为完整单词。
示例:
"Don't hesitate."
→["Don", "t", "hesitate", "."]
缺点:词汇表庞大,无法处理未见过的新词(如专业术语)。 -
字符级(Character-level)
将文本拆分为单个字符。
示例:
"apple"
→["a", "p", "p", "l", "e"]
缺点:序列过长,语义信息稀疏。 -
子词级(Subword-level)(主流方法)
平衡单词和字符的优势,将词拆分为常见子词。
示例(使用 Byte-Pair Encoding, BPE):
"unhappy"
→["un", "happy"]
优势:能处理未知词汇,词汇表更紧凑。
二、Tokenizer 的核心功能
-
文本标准化
- 统一转为小写(可选)
- 去除多余空格
- 处理标点符号
- 处理特殊字符(如Emoji)
-
Token 拆分
根据预定义规则(如BPE、WordPiece)分割文本。 -
映射为数字ID
将Token转换为模型可理解的词汇表索引。
示例:tokenizer.encode("Hello world!") → [101, 7592, 2088, 102] # BERT的输入ID
-
添加模型所需特殊Token
[CLS]
:分类任务中表示句首(BERT)[SEP]
:分隔句子<s>
/</s>
:标记文本开头和结尾(如GPT)
三、常见 Tokenizer 类型
类型 | 算法 | 代表模型 | 特点 |
---|---|---|---|
WordPiece | 贪心合并高频子词 | BERT, DistilBERT | 适合处理英文、德文等空格分隔语言 |
Byte-Pair Encoding (BPE) | 统计合并高频字节对 | GPT, RoBERTa | 支持多语言,处理未知词能力强 |
SentencePiece | 无损分词 | T5, ALBERT | 直接处理原始文本(包括空格、特殊符号) |
Unigram | 概率模型 | XLNet | 灵活调整词汇表大小 |
四、如何使用 Tokenizer?(代码示例)
以 Hugging Face Transformers 库为例:
-
加载预训练 Tokenizer
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
-
文本 → Token ID
text = "I love natural language processing!" encoded_input = tokenizer(text, padding=True, truncation=True, return_tensors="pt") # 输出: # {'input_ids': tensor([[101, 1045, 2293, 3019, 2653, 2738, 999, 102]]), # 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])}
-
Token ID → 文本
decoded_text = tokenizer.decode(encoded_input["input_ids"][0]) # 输出: "[CLS] i love natural language processing! [SEP]"
五、Tokenizer 的关键文件
-
vocab.txt
词汇表文件,每行对应一个Token及其ID。[PAD] 0 [CLS] 1 [SEP] 2 hello 3 world 4 ...
-
merges.txt(BPE 用)
记录子词合并规则(从字符级逐步合并为子词)。e n t h i s ...
六、实际应用注意事项
-
匹配模型与 Tokenizer
使用与模型配套的 Tokenizer(如bert-base-uncased
模型对应同名的 Tokenizer)。 -
处理多语言文本
选择支持多语言的 Tokenizer(如xlm-roberta-base
)。 -
自定义词汇表
针对特定领域(如医学、法律)重新训练 Tokenizer:from tokenizers import BertWordPieceTokenizer tokenizer = BertWordPieceTokenizer() tokenizer.train(files=["data.txt"], vocab_size=32000) tokenizer.save_model("custom_tokenizer")
-
处理长文本
设置max_length
和truncation
策略:encoded_input = tokenizer(text, max_length=512, truncation=True)
七、总结
Tokenizer 是 NLP 模型的“翻译官”,将人类语言转化为机器语言。理解其工作原理和正确使用方式,是构建高效 NLP 系统的关键步骤。