在自然语言处理(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 的基本工作流程如下:

  1. 输入原始文本
    例如:

    "Transformers are powerful."
    
  2. 分词 可能的输出:

    ['Transform', '##ers', 'are', 'powerful', '.']
    
  3. 映射为 ID

    [30522, 1234, 2024, 6789, 1012]
    
  4. 添加特殊标记(如 [CLS][SEP]

    [101, 30522, 1234, 2024, 6789, 1012, 102]
    
  5. 返回模型可用的张量(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 不仅仅用于英文,还支持多语言、代码、语音等多种输入,为大模型的多模态发展奠定了基础。

Logo

更多推荐