Hugging Face transformers
库中的 BertTokenizer
常用方法和属性
BertTokenizer
是 BERT 模型专用的分词器,用于 文本预处理、分词、转换为 token ID、解码 token ID。BertTokenizer
主要基于 WordPiece 分词法,适用于 文本分类、问答、命名实体识别等 NLP 任务。
1. BertTokenizer
的常见属性
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
属性 | 作用 | 示例 |
---|---|---|
tokenizer.vocab_size | 词汇表大小 | 30522 |
tokenizer.model_max_length | 最大序列长度 | 512 |
tokenizer.pad_token | [PAD] 填充标记 | '[PAD]' |
tokenizer.cls_token | [CLS] 句子起始标记 | '[CLS]' |
tokenizer.sep_token | [SEP] 句子分隔标记 | '[SEP]' |
tokenizer.unk_token | [UNK] 未知单词标记 | '[UNK]' |
tokenizer.mask_token | [MASK] 掩码标记 | '[MASK]' |
tokenizer.special_tokens_map | 特殊标记映射 | {'cls_token': '[CLS]', 'sep_token': '[SEP]'} |
2. BertTokenizer
的常用方法
方法 | 作用 |
---|---|
tokenizer.tokenize(text) | 将文本分词 |
tokenizer.encode(text, add_special_tokens=True) | 将文本编码为 token ID |
tokenizer.encode_plus(text, return_tensors="pt") | 获取 input_ids、attention_mask |
tokenizer.batch_encode_plus(texts, padding=True, truncation=True) | 批量编码文本 |
tokenizer.decode(ids, skip_special_tokens=True) | 将 token ID 解码回文本 |
tokenizer.convert_tokens_to_ids(tokens) | 将 token 转换为 ID |
tokenizer.convert_ids_to_tokens(ids) | 将 ID 转换为 token |
3. BertTokenizer
详细用法
3.1. 分词 (tokenize
)
text = "Hugging Face is great!"
tokens = tokenizer.tokenize(text)
print(tokens)
输出
['hugging', 'face', 'is', 'great', '!']
3.2. 编码 (encode
)
input_ids = tokenizer.encode(text, add_special_tokens=True)
print(input_ids)
输出
[101, 17662, 18781, 2003, 2307, 999, 102]
101
是[CLS]
102
是[SEP]
3.3. 获取完整输入 (encode_plus
)
inputs = tokenizer.encode_plus(text, return_tensors="pt")
print(inputs)
输出
{
"input_ids": [[101, 17662, 18781, 2003, 2307, 999, 102]],
"attention_mask": [[1, 1, 1, 1, 1, 1, 1]]
}
input_ids
:Token ID 序列attention_mask
:0 表示PAD
,1 表示有效 token
3.4. 批量编码 (batch_encode_plus
)
sentences = ["Hugging Face is great!", "Transformers are amazing!"]
batch_inputs = tokenizer.batch_encode_plus(sentences, padding=True, truncation=True)
print(batch_inputs)
输出
{
"input_ids": [[101, 17662, 18781, 2003, 2307, 999, 102],
[101, 10938, 2024, 6429, 999, 102, 0]],
"attention_mask": [[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0]]
}
padding=True
自动填充到相同长度truncation=True
截断超长文本
3.5. 解码 (decode
)
decoded_text = tokenizer.decode(input_ids, skip_special_tokens=True)
print(decoded_text)
输出
Hugging Face is great!
skip_special_tokens=True
忽略[CLS]
和[SEP]
3.6. ID 和 Token 互转
tokens = tokenizer.tokenize(text)
token_ids = tokenizer.convert_tokens_to_ids(tokens)
reconstructed_tokens = tokenizer.convert_ids_to_tokens(token_ids)
print(tokens) # ['hugging', 'face', 'is', 'great', '!']
print(token_ids) # [17662, 18781, 2003, 2307, 999]
print(reconstructed_tokens) # ['hugging', 'face', 'is', 'great', '!']
4. BertTokenizer
在 PyTorch DataLoader
中使用
from torch.utils.data import DataLoader
from transformers import DataCollatorWithPadding
# 数据
texts = ["Hugging Face is great!", "Transformers are amazing!"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# DataLoader
data_collator = DataCollatorWithPadding(tokenizer)
data_loader = DataLoader(inputs, batch_size=2, collate_fn=data_collator)
batch = next(iter(data_loader))
print(batch)
5. BertTokenizer
在 Trainer
训练时使用
from datasets import load_dataset
dataset = load_dataset("imdb")
def preprocess_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length")
encoded_dataset = dataset.map(preprocess_function, batched=True)
6. BertTokenizer
的高级功能
6.1. 添加新的特殊 Token
new_tokens = ["[NEW_TOKEN]"]
tokenizer.add_tokens(new_tokens)
6.2. 训练自定义分词器
custom_tokenizer = tokenizer.train_new_from_iterator(["This is custom tokenizer."], 5000)
6.3. fast
vs slow
分词器
Hugging Face 提供两种 BertTokenizer
:
类型 | 速度 | 适用情况 |
---|---|---|
Fast Tokenizer (BertTokenizerFast ) | 快(基于 tokenizers Rust 实现) | 推荐 |
Slow Tokenizer (BertTokenizer ) | 慢(Python 实现) | 仅用于调试 |
默认 AutoTokenizer.from_pretrained("bert-base-uncased")
会加载 Fast Tokenizer。
7. 总结
BertTokenizer
是 BERT 专用分词器,基于 WordPiece,适用于 文本分类、翻译、摘要、问答等 NLP 任务。
常见方法:
tokenizer.tokenize(text)
→ 分词tokenizer.encode(text)
→ 转换为 IDtokenizer.decode(ids)
→ 解码tokenizer.batch_encode_plus(texts)
→ 批量编码tokenizer.convert_tokens_to_ids(tokens)
→ Token 转 IDtokenizer.convert_ids_to_tokens(ids)
→ ID 转 Token
如果你希望 加载预训练的 BERT 分词器,并在 NLP 任务中使用,推荐 BertTokenizer.from_pretrained("bert-base-uncased")
。