基于Python的自然语言处理系列(34):Huggingface 自定义分词器与数据集

在自然语言处理 (NLP) 中,分词是将原始文本转换为模型可处理的数字形式的关键步骤。无论是情感分析、文本生成,还是问答系统,分词都决定了模型如何理解输入数据。Huggingface 的 transformers 库提供了多种强大的分词工具,使我们可以灵活地加载、保存和使用预训练模型的分词器。本篇文章将深入探讨 Huggingface 的分词器工作机制,包括基于词、字符和子词的分词方法。同时,我们将介绍如何处理长序列、多序列、以及使用填充 (padding) 和注意力掩码 (attention mask) 进行批处理。

1. 使用 AutoModelAutoTokenizer

Huggingface 的 AutoModelAutoTokenizer 是两个非常实用的工具。AutoModel 可以自动检测检查点的架构,并加载相应的模型;而 AutoTokenizer 可以根据模型的需求自动加载和配置分词器。这使得我们在不同任务之间切换时更加灵活。

创建 Transformer 模型

我们可以使用预训练的 BERT 模型,并通过 Huggingface 提供的 from_pretrained() 方法轻松加载模型:

python 复制代码
from transformers import BertModel

model = BertModel.from_pretrained("bert-base-cased")
print(model)

通过上述代码,模型会自动从 Huggingface Hub 下载,并缓存在本地,避免重复下载。

2. 分词器的工作机制

模型只能处理数字形式的输入,分词器负责将原始文本转换为这种输入。我们可以根据不同任务选择不同的分词策略,例如基于词的分词、基于字符的分词,以及结合两者优点的子词分词。

基于词的分词

基于词的分词是最简单的方法,直接将句子拆分为单词:

python 复制代码
tokenized_text = "Chaky is a deep learning guy".split()
print(tokenized_text)

基于字符的分词

字符级分词适用于处理复杂语言,如中文,每个字符都包含丰富的语义信息:

python 复制代码
list("Chaky is a deep learning guy")

子词分词

子词分词在保证语义完整性的同时减少了词汇表的大小,例如将 "tokenization" 分为 "token" 和 "ization":

python 复制代码
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
tokens = tokenizer.tokenize("Using a Transformer network is simple")
print(tokens)

3. 分词器的加载与保存

分词器的加载与模型的加载类似,可以使用 from_pretrained() 方法进行加载,也可以使用 save_pretrained() 方法保存到本地:

python 复制代码
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
tokenizer.save_pretrained("tokenizer_weights")

4. 处理多序列和长序列

当我们需要处理多条输入序列时,分词器可以自动进行填充和截断操作,以确保输入的形状一致。

使用填充处理多序列

我们可以使用 padding 参数让所有序列对齐:

python 复制代码
sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]
tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt")
print(tokens)

使用注意力掩码

在填充后,注意力掩码用于告诉模型忽略填充的部分:

python 复制代码
batched_ids = [
    [200, 200, 200],
    [200, 200, tokenizer.pad_token_id],
]
attention_mask = [
    [1, 1, 1],
    [1, 1, 0],
]
outputs = model(torch.tensor(batched_ids), attention_mask=torch.tensor(attention_mask))
print(outputs.logits)

5. 特殊 Token 的使用

某些模型需要在输入开头和结尾添加特殊标记,如 [CLS][SEP]

python 复制代码
sequence = "I've been waiting for a HuggingFace course my whole life."
model_inputs = tokenizer(sequence)
print(model_inputs["input_ids"])
print(tokenizer.decode(model_inputs["input_ids"]))

6. 将所有步骤整合在一起

最后,我们将所有的分词步骤整合在一起,处理多条序列并进行推理:

python 复制代码
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)

sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]
tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt")
output = model(**tokens)
print(output)

结语

在本篇文章中,我们详细介绍了 Huggingface 的分词器工作机制,并展示了如何加载、保存和使用分词器来处理多序列和长序列数据。我们还探讨了注意力掩码在批处理中的重要性。理解这些概念和技术将帮助你在实际项目中更高效地处理文本数据。

在接下来的文章中,我们将深入探讨 Transformer 模型的微调 (Finetuning)。你将学习如何在特定任务上微调预训练模型,以进一步提升其性能。敬请期待《基于Python的自然语言处理系列(35):微调》!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关推荐
糯米导航1 小时前
AI 视觉回归实战:截图对比不是“找不同”,如何让智能差异分析真正服务 UI 质量
人工智能·ui·回归
科技圈观察2 小时前
2026年好伴AI医疗专用大模型应用梳理与梯队参考
人工智能
jkyy20142 小时前
深耕AI健康医疗数据智库,赋能企业构建主动健康管理新生态
大数据·人工智能·健康医疗
cd_949217212 小时前
3D角色自动绑骨怎么做?用V2Fun完成建模、绑定、动作和导出
人工智能·3d
瑞禧生物tech2 小时前
SH-PEG-Biotin巯基-聚乙二醇-生物素 HS-PEG-Bio 深度解析
人工智能
QYR-分析2 小时前
机器人安全控制器行业高速扩容 本土替代迎来全新发展窗口期
人工智能·安全·机器人
冬奇Lab3 小时前
MCP 系列(06):MCP vs Function Calling——用数据说话的选型指南
人工智能
冬奇Lab3 小时前
每日一个开源项目(第159篇):Vibe-Trading - 用自然语言做量化研究,AI 驱动的个人交易 Agent
人工智能·开源·资讯
AI大模型-小雄3 小时前
2026 年 7 月国内怎么开通 ChatGPT Pro?5x / 20x 区别、适合人群与避坑指南
人工智能·gpt·chatgpt·ai编程·开发工具·codex·chatgpt pro
快乐非自愿3 小时前
AI低代码破局:数字化降本增效的核心逻辑与商业落地
人工智能·低代码