BertTokenizer 是 Hugging Face 的 transformers 库中用于处理 BERT 模型输入的分词器类。它基于 WordPiece 分词算法,能够将文本分割成词汇单元(tokens),并将其转换为 BERT 模型可以理解的格式。BertTokenizer 是 BERT 模型的核心工具之一,广泛用于自然语言处理任务。 以下是关于 BertTokenizer 的详细介绍,包括其功能、使用方法和一些高级特性。
功能概述
BertTokenizer
的主要功能包括:
-
分词(Tokenization):将输入文本分割成词汇单元(tokens)。
-
编码(Encoding):将分词结果转换为 Token ID。
-
解码(Decoding):将 Token ID 转换回文本。
-
处理特殊标记:自动处理
[CLS]
、[SEP]
、[PAD]
等特殊标记。 -
生成模型输入:将文本转换为适合 BERT 模型的输入格式(包括
input_ids
和attention_mask
)。
1. 初始化 BertTokenizer
BertTokenizer
可以通过以下两种方式初始化:
1.1 加载预训练模型的分词器:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") # 使用预训练模型
-
from_pretrained
方法会自动下载并加载指定预训练模型的分词器配置和词汇表文件。 -
常见的预训练模型包括
bert-base-uncased
、bert-base-cased
、bert-base-chinese
等。
1.2 加载本地词汇表文件:
tokenizer = BertTokenizer.from_pretrained("path/to/vocab.txt") # 使用本地词汇表
-
如果你有本地的词汇表文件(
vocab.txt
),可以直接加载。
2. 分词与编码
2.1 分词
BertTokenizer
使用 WordPiece 分词算法,将输入文本分割成词汇单元。
text = "这是一个测试文本。"
tokens = tokenizer.tokenize(text)
print("分词结果:", tokens)
分词结果示例
2.2 编码
将分词结果转换为 Token ID。
token_ids = tokenizer.convert_tokens_to_ids(tokens) # 将 Token 转换为 ID
print("Token ID:", token_ids) # 输出: [101, 102, 103, ...]
编码结果示例
2.3 解码
将 Token ID 转换回文本。
decoded_text = tokenizer.decode(token_ids, skip_special_tokens=True)
print("解码结果:", decoded_text)
skip_special_tokens
参数
-
如果设置为
True
,解码时会忽略特殊标记(如[CLS]
和[SEP]
)。 -
如果设置为
False
,解码结果会包含这些特殊标记。
解码结果示例
2.4 生成模型输入
inputs = tokenizer(
text,
max_length=60, # 指定最大长度
padding="max_length", # 填充到最大长度
truncation=True, # 截断超出部分
return_tensors="pt" # 返回 PyTorch 张量
)
print("Input IDs:", inputs["input_ids"]) # 输出: tensor([[101, 102, ...]])
print("Attention Mask:", inputs["attention_mask"]) # 输出: tensor([[1, 1, ...]])
3. 参数解析
BertTokenizer
的 __call__
方法支持多种参数,用于控制分词和编码的行为。
3.1 参数说明
-
max_length
:指定序列的最大长度。 -
padding
:是否填充序列。可选值为"max_length"
或"longest"
。 -
truncation
:是否截断超出max_length
的部分。 -
return_tensors
:返回的数据类型。可选值为"pt"
(PyTorch 张量)、"tf"
(TensorFlow 张量)或"np"
(NumPy 数组)。
4. 分词器与模型结合
预处理后的输入可以直接用于 BERT 模型的推理。
from transformers import BertModel
# 加载预训练的 BERT 模型
model = BertModel.from_pretrained("bert-base-chinese")
# 使用分词器生成的输入进行推理
outputs = model(**inputs)
# 输出结果
print("Last Hidden State Shape:", outputs.last_hidden_state.shape) # 输出: torch.Size([1, 60, 768])
print("Pooler Output Shape:", outputs.pooler_output.shape) # 输出: torch.Size([1, 768])
5. 完整代码示例
以下是一个完整的示例,展示如何使用 BertTokenizer
和 BertModel
进行文本处理和推理。
from transformers import BertTokenizer, BertModel
# 初始化分词器和模型
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model = BertModel.from_pretrained("bert-base-chinese")
# 输入文本
text = "睡一觉醒睡不着咋搞的?"
# 生成模型输入
inputs = tokenizer(
text,
max_length=60,
padding="max_length",
truncation=True,
return_tensors="pt"
)
# 模型推理
outputs = model(**inputs)
# 输出结果
print("Input IDs:", inputs["input_ids"])
print("Attention Mask:", inputs["attention_mask"])
print("Last Hidden State Shape:", outputs.last_hidden_state.shape)
print("Pooler Output Shape:", outputs.pooler_output.shape)
6. 特殊标记的处理
BERT 分词器会自动处理特殊标记(如 [CLS]
和 [SEP]
),但也可以手动添加。
# 手动添加特殊标记
tokens = ["[CLS]"] + tokenizer.tokenize(text) + ["[SEP]"]
token_ids = tokenizer.convert_tokens_to_ids(tokens)
7. 多文本处理
BertTokenizer
也支持批量处理多个文本。
texts = ["这是一个测试文本。", "另一个文本。"]
inputs = tokenizer(
texts,
max_length=60,
padding="max_length",
truncation=True,
return_tensors="pt"
)
8. 获取隐藏层和注意力权重
如果需要获取模型的中间层输出(如隐藏层或注意力权重),可以在模型初始化时设置相关参数。
model = BertModel.from_pretrained("bert-base-chinese", output_hidden_states=True, output_attentions=True)
outputs = model(**inputs)
print("Hidden States:", outputs.hidden_states) # 每一层的隐藏层输出
print("Attentions:", outputs.attentions) # 每一层的注意力权重
9. 使用预训练的下游任务模型
如果使用的是针对特定任务(如分类或命名实体识别)的预训练模型,可以直接加载对应的模型。
from transformers import BertForTokenClassification
# 加载预训练的命名实体识别模型
tokenizer = BertTokenizer.from_pretrained("dbmdz/bert-large-cased-finetuned-conll03-english")
model = BertForTokenClassification.from_pretrained("dbmdz/bert-large-cased-finetuned-conll03-english")