当前位置: 首页 > news >正文

【NLP251】BertTokenizer 的全部 API 及 使用案例

BertTokenizer 是 Hugging Face 的 transformers 库中用于处理 BERT 模型输入的分词器类。它基于 WordPiece 分词算法,能够将文本分割成词汇单元(tokens),并将其转换为 BERT 模型可以理解的格式。BertTokenizer 是 BERT 模型的核心工具之一,广泛用于自然语言处理任务。

以下是关于 BertTokenizer 的详细介绍,包括其功能、使用方法和一些高级特性。

 功能概述

BertTokenizer 的主要功能包括:

  1. 分词(Tokenization):将输入文本分割成词汇单元(tokens)。

  2. 编码(Encoding):将分词结果转换为 Token ID。

  3. 解码(Decoding):将 Token ID 转换回文本。

  4. 处理特殊标记:自动处理 [CLS][SEP][PAD] 等特殊标记。

  5. 生成模型输入:将文本转换为适合 BERT 模型的输入格式(包括 input_idsattention_mask)。

1. 初始化 BertTokenizer

BertTokenizer 可以通过以下两种方式初始化:

1.1 加载预训练模型的分词器

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")  # 使用预训练模型
  • from_pretrained 方法会自动下载并加载指定预训练模型的分词器配置和词汇表文件。

  • 常见的预训练模型包括 bert-base-uncasedbert-base-casedbert-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. 完整代码示例

以下是一个完整的示例,展示如何使用 BertTokenizerBertModel 进行文本处理和推理。

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")

相关文章:

  • shell脚本备份mysql数据库和库下表
  • 算法刷题--哈希表--字母异位词和两个数组的交集
  • linux运行kettle 遇到问题汇总
  • 【区块链】零知识证明基础概念详解
  • WebMvcConfigurer 介绍
  • 【硬核对比】C语言 vs MATLAB:从内存管理到矩阵运算的降维打击
  • Docker+Ollama+WebUI+AnythingLLM,构建企业本地AI大模型
  • 车规MCU处理器选择Cortex-M7还是Cortex-R52?
  • GDB QUICK REFERENCE (GDB 快速参考手册)
  • deepseek多列数据对比,联想到excel的高级筛选功能
  • 提升顾客转化率:融合2+1链动模式AI智能名片与S2B2C商城小程序的创新策略
  • OnlyOffice编辑器下载失败排查与解决方案
  • M4Pro基于homebrew安装Redis踩坑记录
  • 微信小程序之mobx-miniprogram状态管理
  • [leetcode] 动态规划 - 最大子数组和
  • Spring Boot 实战:轻松实现文件上传与下载功能
  • 深入理解 Vue3 中 ref 与 reactive 的区别及应用
  • matlab 柴油机冷却系统仿真计算
  • Cursor笔记
  • vue3.x 的 toRef详细解读
  • “五一”假期预计全社会跨区域人员流动量超14亿人次
  • 徐徕任上海浦东新区副区长,此前已任区委常委
  • 事关广大农民利益,农村集体经济组织法5月1日起施行
  • 首映|“凤凰传奇”曾毅:拍电影,我是认真的
  • 遭遇大规模停电,西班牙内政部宣布进入国家紧急状态
  • 赛力斯拟赴港上市:去年扭亏为盈净利59亿元,三年内实现百万销量目标