Tokenizer 简介
Tokenizer 是 NLP 模型处理文本的 第一步,其质量和设计直接影响模型的效果。选择合适的分词方式、理解其工作流程,对于开发高质量的 NLP 应用至关重要。随着技术的发展,Tokenizer 不仅仅用于英文,还支持多语言、代码、语音等多种输入,为大模型的多模态发展奠定了基础。
在自然语言处理(NLP)和 Transformer 模型中,Tokenizer(分词器) 是连接原始文本与神经网络模型之间的关键桥梁。由于神经网络无法直接理解人类语言,文本必须先被转换为数字形式才能输入模型。而这个“翻译”过程,正是由 Tokenizer 来完成的。
1. 为什么需要 Tokenizer
人类语言是由单词、符号和上下文构成的,而深度学习模型只能理解数字。因此,在将文本送入模型之前,必须先将文本“编码”为模型可以处理的数值表示。
Tokenizer 的作用主要包括:
- 拆分文本:将一句话分解成更小的单位(token),这些单位可以是词、子词、甚至字符。
- 数字映射:将每个 token 转换成唯一的整数 ID。
- 添加特殊标记:如
[CLS]
(表示开始)、[SEP]
(分隔符)等,这些标记帮助模型理解句子结构。
2. 常见的分词方式
不同的 NLP 应用和模型,可能采用不同的分词策略。以下是几种常见的方式:
分词方式 | 说明 | 优点 | 缺点 |
---|---|---|---|
Word-level | 按单词拆分,如 “I love NLP” → [I, love, NLP] | 简单直观 | 词表大,对未登录词(OOV)不友好 |
Character-level | 按字符拆分,如 “NLP” → [N, L, P] | 不存在 OOV 问题 | 序列过长,难以捕捉语义 |
Subword-level | 将单词拆成更小的子词,如 “playing” → [play, ing] | 平衡词表大小与表达能力 | 需要训练分词模型 |
BPE(子词编码) | 基于统计的子词分词算法,许多 Transformer 模型的默认方式 | 高效,支持多语言 | 对非常小众语言效果略弱 |
目前 Hugging Face Transformers 中使用的多数分词器都是基于 BPE 或 WordPiece 算法的 Subword 分词。
3. Tokenizer 的工作流程
Tokenizer 的基本工作流程如下:
-
输入原始文本
例如:"Transformers are powerful."
-
分词 可能的输出:
['Transform', '##ers', 'are', 'powerful', '.']
-
映射为 ID
[30522, 1234, 2024, 6789, 1012]
-
添加特殊标记(如
[CLS]
,[SEP]
)[101, 30522, 1234, 2024, 6789, 1012, 102]
-
返回模型可用的张量(tensor)
这些数字会被送入 Transformer 模型进行后续处理。
4. 在 Hugging Face 中使用 Tokenizer
4.1 分词(Tokenlization)
Hugging Face 提供了丰富且易用的 分词器接口,能够快速完成从文本到模型输入张量的转换。 例如,以下示例展示了如何加载预训练模型对应的分词器,并对一句文本进行处理:
from transformers import AutoTokenizer
# 根据模型 checkpoint 自动下载并加载分词器
# 在transformer里,checkpoint通常就是一个已训练好的模型的名称或保存路径
# 这里的 "bert-base-uncased" 就是一个公开发布的模型 checkpoint 名称
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# 获得 tokenizer 后,可以直接将句子传递给它
# 通过 return_tensors 参数指定返回张量类型(如 PyTorch 张量 "pt" 或 NumPy 数组)
# 可以简单的把张量理解为Numpy数组
# 标量 → 0 维张量
# 向量 → 1 维张量
# 矩阵 → 2 维张量
# 还可以有更高维度(3D、4D...)
inputs = tokenizer("Transformers are powerful.", return_tensors="pt")
print(inputs)
当 return_tensors="pt"(PyTorch)时,输出结果如下:
{
'input_ids': tensor([[ 101, 19081, 2024, 3928, 1012, 102]]),
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0]]),
'attention_mask': tensor([[1, 1, 1, 1, 1, 1]])
}
如果不指定 return_tensors,则返回的是普通的 Python 列表格式:
{
'input_ids': [101, 19081, 2024, 3928, 1012, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1]
}
字段说明:
- input_ids: 每个句子对应一行整数,表示各个token的唯一ID。
- attention_mask: 用于指示哪些 token 需要被模型关注(1 表示有效位置,0 表示填充部分)。
- token_type_ids:区分句子对(例如在问答或句子对分类任务中),单句输入时通常全为 0。
4.2 保存Tokenizer
保存 Tokenizer 是为了固定“文本转数字”的规则,保证模型在任何地方都能一致、稳定地工作。保存到本地后,可以在没有网络的情况下快速加载 tokenizer,提高效率。
# 保存
tokenizer.save_pretrained("my_tokenizer_dir")
# 加载
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("my_tokenizer_dir")
4.3 解码(Decoding)
解码是将词汇索引转换回可读文本:
decoded_string = tokenizer.decode([101, 19081, 2024, 3928, 1012, 102])
print(decoded_string)
输出:
'transformers are powerful.'
decode 方法会将同一单词的 token 合并成完整单词,非常适合生成文本或序列到序列任务(如翻译、摘要)。
5. 总结
Tokenizer 是 NLP 模型处理文本的 第一步,其质量和设计直接影响模型的效果。选择合适的分词方式、理解其工作流程,对于开发高质量的 NLP 应用至关重要。 随着技术的发展,Tokenizer 不仅仅用于英文,还支持多语言、代码、语音等多种输入,为大模型的多模态发展奠定了基础。
更多推荐
所有评论(0)