常见的子词分割方法:

什么是 Tokenizer?

Tokenizer(分词器)可以将原始文本(raw text)转换为模型能够理解的数字序列,在模型输入和输出的两个主要阶段中发挥重要作用:

编码Encode阶段

  1. 分词(Tokenize)

    将文本拆分为词元(Token),常见的分词方式包括字级、词级、子词级(如 BPE、WordPiece)、空格分词等。

    输入: "你好"
    分词: ["你", "好"]
    
  2. 映射(Mapping)

    将每个词元映射为词汇表中的唯一 ID,生成的数字序列即为模型的输入。

    分词: ["你", "好"]
    映射: [1001, 1002]
    

解码Decode阶段

  1. 反映射(De-mapping)

    模型输出的数字序列通过词汇表映射回对应的词元,二者是一一对应的关系。

    输出: [1001, 1002]
    反映射: ["你", "好"]
    
  2. 文本重组

    将解码后的词元以某种规则重新拼接为完整文本。

    反映射: ["你", "好"]
    重组: "你好"
    

实际使用

在进一步讲解之前,我们先通过 Transformers 库中的 AutoTokenizer 类来使用 Tokenizer。

安装库

pip install transformers

BPE 分词器示例

from transformers import AutoTokenizer

# 使用 GPT-2 的分词器(BPE)
tokenizer = AutoTokenizer.from_pretrained("gpt2")

text = "Hello, world!"

# 编码
# 1. 将文本分词为 Tokens
tokens = tokenizer.tokenize(text)
print("Tokens:", tokens)

# 2. 将 Tokens 转换为 Token IDs
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print("Token IDs:", token_ids)

# 解码
# 1. Token IDs 转换为 Tokens
tokens = tokenizer.convert_ids_to_tokens(token_ids)
print("Tokens:", tokens)

# 2. Tokens 拼接为文本
decoded_text = tokenizer.convert_tokens_to_string(tokens)
print("Decoded Text:", decoded_text)

输出

Tokens: ['Hello', ',', 'Ġworld', '!']
Token IDs: [15496, 11, 995, 0]
Tokens: ['Hello', ',', 'Ġworld', '!']
Decoded Text: Hello, world!

Note