Hugging Face Transformers 库中的 AutoTokenizer
AutoTokenizer
是 Hugging Face transformers
库中的一个 自动分词器(tokenizer)加载器,用于根据 预训练模型的名称 自动选择合适的分词器(Tokenizer)。它的主要作用是让用户无需手动指定模型对应的分词方式,而是通过模型名称自动加载相匹配的分词器。
1. 为什么使用 AutoTokenizer?
在 transformers
库中,每种模型都有自己的专用分词器。例如:
BertTokenizer
适用于 BERTGPT2Tokenizer
适用于 GPT-2T5Tokenizer
适用于 T5BartTokenizer
适用于 BART
手动选择分词器可能会很繁琐,而 AutoTokenizer
可以根据模型名称 自动匹配 正确的分词器。例如:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
这里 AutoTokenizer
自动识别 bert-base-uncased
是一个 BERT 模型,并加载 BertTokenizer
。
2. Tokenizer 的作用
分词器的主要作用是:
- 将文本转换为模型可以理解的输入格式
- 将字符串转换为 token ID
- 处理特殊 token,例如
[CLS]
、[SEP]
- 支持不同的分词算法,如 BPE、WordPiece、Unigram
例如:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "Hugging Face is amazing!"
tokens = tokenizer(text)
print(tokens)
输出:
{'input_ids': [101, 17662, 2227, 2003, 12476, 999, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
这里:
input_ids
是文本的 token IDtoken_type_ids
用于区分不同句子attention_mask
指示哪些 token 需要被模型关注
3. AutoTokenizer 的基本用法
3.1. 加载预训练分词器
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
它会自动下载 bert-base-uncased
对应的分词器。
3.2. 分词(Tokenization)
使用 tokenizer.encode()
或 tokenizer()
进行文本分词:
text = "Hugging Face is amazing!"
tokens = tokenizer(text)
print(tokens)
输出:
{'input_ids': [101, 17662, 2227, 2003, 12476, 999, 102],
'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
3.3. 处理批量文本
如果要一次性处理多个文本,可以传入列表:
texts = ["Hugging Face is amazing!", "Transformers are powerful."]
tokens = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
print(tokens)
这里:
padding=True
会在较短的句子后面补零,使其与最长的句子对齐truncation=True
会截断超长的文本return_tensors="pt"
会返回 PyTorch 格式的张量
3.4. 将 Token ID 转换回文本
可以使用 decode()
将 token ID 还原为原始文本:
input_ids = tokens["input_ids"][0].tolist()
decoded_text = tokenizer.decode(input_ids)
print(decoded_text)
输出:
[CLS] Hugging Face is amazing! [SEP]
4. Tokenization 的不同方式
不同模型使用不同的分词方法:
-
BERT 使用 WordPiece
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") print(tokenizer.tokenize("Hugging Face is amazing!"))
输出:
['hugging', 'face', 'is', 'amazing', '!']
-
GPT-2 使用 Byte Pair Encoding(BPE)
tokenizer = AutoTokenizer.from_pretrained("gpt2") print(tokenizer.tokenize("Hugging Face is amazing!"))
输出:
['Hugging', 'ĠFace', 'Ġis', 'Ġamazing', '!']
注意
Ġ
表示空格 -
T5 和 BART 使用 SentencePiece
tokenizer = AutoTokenizer.from_pretrained("facebook/bart-large") print(tokenizer.tokenize("Hugging Face is amazing!"))
输出:
['Hugging', 'ĠFace', 'Ġis', 'Ġamazing', '!']
5. 处理特殊 Token
5.1. 查看特殊 Token
print(tokenizer.cls_token) # [CLS]
print(tokenizer.sep_token) # [SEP]
print(tokenizer.pad_token) # [PAD]
print(tokenizer.unk_token) # [UNK]
5.2. 自定义特殊 Token
如果你的任务需要额外的特殊 Token,可以这样做:
tokenizer.add_special_tokens({"additional_special_tokens": ["[NEW_TOKEN]"]})
6. 训练自己的分词器
如果你的数据集没有合适的分词器,可以使用 tokenizers
训练自己的:
from tokenizers import ByteLevelBPETokenizer
tokenizer = ByteLevelBPETokenizer()
tokenizer.train(files=["my_dataset.txt"], vocab_size=5000)
tokenizer.save_model("tokenizer_model")
然后可以用 AutoTokenizer
加载:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("tokenizer_model")
7. 总结
AutoTokenizer
是transformers
提供的自动分词器加载器,可以根据模型名称自动匹配适用的 Tokenizer。- Tokenizer 主要作用:
- 将文本转换为 Token ID
- 处理特殊 Token
- 适配不同模型的分词方式
- 适用于不同模型的 Tokenizer 方式:
- BERT 使用 WordPiece
- GPT-2 使用 Byte Pair Encoding(BPE)
- T5 和 BART 使用 SentencePiece
- 可以使用
encode()
进行分词,使用decode()
还原文本。 - 支持批量处理、特殊 Token 定义,并可以训练自定义分词器。