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

news2025/3/12 12:20:09
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")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL常见疑难杂症】常见文件及其所存储的信息

1、MySQL配置文件的读取顺序 (非Win)/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf 可以通过命令查看MySQL读取配置文件的顺序 [roothadoop01 ~]# mysql --help |grep /etc/my.cnf /etc/my.cnf /etc/mysql/my.c…

IDEA集成DeepSeek

引言 随着数据量的爆炸式增长,传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术,凭借其强大的语义理解与深度学习能力,正在改变搜索领域的游戏规则。 对于 Java 开发者而言,将 DeepSeek 集成…

leetcode:627. 变更性别(SQL解法)

难度:简单 SQL Schema > Pandas Schema > Salary 表: ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int …

SQLMesh系列教程-3:SQLMesh模型属性详解

SQLMesh 的 MODEL 提供了丰富的属性,用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性,可以构建高效、可维护的数据管道。在 SQLMesh 中,MODEL 是定义数据模型的核心结构,初学SQLMesh,定义模型看到属…

【Leetcode 952】按公因数计算最大组件大小

题干 给定一个由不同正整数的组成的非空数组 nums ,考虑下面的图: 有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之…

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】

引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…

简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标

作为国产数据库的领军选手,金仓数据库(KingbaseES)凭借其成熟的技术架构和广泛的市场覆盖,在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业,还是铁路、医疗等关键领域,金仓数据库都以其卓…

八、SPI读写XT25数据

8.1 SPI 简介 SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛用于嵌入式系统中连接微控制器与外围设备,如传感器、存储器、显示屏等。 主要特点 1. 全双工通信:支持同时发送…

Visionpro 齿轮测量

效果展示 一、题目要求 求出最大值,最小值,平均值 二、分析 1.首先要进行模板匹配 2.划清匹配范围 3.匹配小三角的模板匹配 4.卡尺 5.用找圆工具 工具 1.CogPMAlignTool 2.CogCaliperTool 3.CogFindCircleTool 4.CogFixtureTool 三、模板匹…

索引以及索引底层数据结构

一、什么是索引? 索引(index)是数据库高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B树),这些数据结构以某种方式指向真在…

开业盛典活动策划方案拆解

道叔来给大家详细剖析咱们方案库里刚收录的这份《蜀大侠火锅店武侠风开业盛典活动策划方案》了,保证让你看完直呼过瘾,收获满满! 一、主题创意:武侠风,直击人心 首先,咱们得夸一下这活动的主题——“XXX‘…

API 接口自动化

HTTP协议 - 白月黑羽 HTTP协议简介 如果客户端是浏览器,如何在chrome浏览器中查看 请求和响应的HTTP消息?按f12-》network 清除当前信息 响应的消息体在Response里看 点preview,可以看响应的消息体展开的格式 HTTP请求消息 请求头 reques…

安全测试|SSRF请求伪造

前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言: GitHub Copilot 的最新更新为开发者带来了显著变化,其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令,并具备多级任务推理能力,这使得开发者在开发复杂功能时,可大幅减少…

物联网行业通识:从入门到深度解析

物联网行业通识:从入门到深度解析 (图1:物联网生态示意图) 一、引言:万物互联时代的到来 根据IDC最新预测,到2025年全球物联网设备连接数将突破410亿,市场规模达1.1万亿美元。物联网&#xff…

ABP - 事件总线之分布式事件总线

ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦,使代码模块之间功能职责更清晰。而分布…

再谈SpringCloud Gateway源码

再谈SpringCloud Gateway源码 一、整体请求流程二、前置对象准备1、实例化HandlerMapping2、实例化Route3、实例化WebHandler 三、实践业务扩展点1、定义扩展Route对象2、Filter能做什么3、定义扩展Filter对象4、定义父类Filter简化请求参数处理 前言: 之前有阅读过…

把 CSV 文件摄入到 Elasticsearch 中 - CSVES

在我们之前的很多文章里,我有讲到这个话题。在今天的文章中,我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…

C进阶 数据的存储

目录 前言 一,VS的知识储备 二,有趣的scanf()读取 三,数据的存储 引言 四,整数存储 五,小数存储 总结 前言 这里将深入计算机,看计算机是如何进行数据的存储的,怎么在计算机里面筑巢 为…

【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?

【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗? 1.线程终止会导致进程终止吗? 在操作系统中,线程是进程的基本执行单元,一个进程可以包含一个或多个线程。 当一个子线程终止时,进程并不会因此自动终…