目 录CONTENT

文章目录

为BERT模型训练分词器

Administrator
2025-11-30 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/training-a-tokenizer-for-bert-models/

原文作者:Jason Brownlee


本教程将介绍如何为BERT模型训练一个分词器

如何为BERT模型训练分词器

BERT模型需要一个分词器来将文本转换为模型可以理解的数字ID。通常,BERT模型会附带一个预训练的分词器,它使用WordPiece算法进行训练。

您可能希望训练自己的分词器,以:

  • 处理特定领域的文本(例如法律、医学或科学文本)。
  • 处理新语言的文本。
  • 在保持较小词汇表的同时,更好地处理特定文本的语言结构。

本教程将向您展示如何使用Hugging Face tokenizers 库在您自己的文本语料库上训练一个BERT风格的分词器,使用WordPiece算法。

在本教程结束时,您将知道:

  • 如何使用 tokenizers 库训练一个WordPiece分词器
  • 如何使用训练好的分词器将文本编码为BERT输入ID。
  • 如何使用训练好的分词器将ID解码回文本。

我们将使用Hugging Face tokenizers 库,它是一个高性能的库,用于预处理BERT风格的模型。

首先,让我们安装所需的库。

pip install tokenizers transformers

我们还需要一个文本语料库来训练分词器。对于本示例,我们将使用一个小型的包含几段文本的列表。

# 语料库
corpus = [
    "This is the first sentence of the corpus.",
    "This is the second sentence of the corpus.",
    "This is the third sentence of the corpus.",
    "This is the fourth sentence of the corpus.",
    "This is the fifth sentence of the corpus.",
    "This is the sixth sentence of the corpus.",
]

接下来,我们将创建一个WordPiece分词器实例。

from tokenizers import Tokenizer
from tokenizers.models import WordPiece
from tokenizers.trainers import WordPieceTrainer
from tokenizers.pre_tokenizers import Whitespace

# 1. 创建一个WordPiece模型实例
# 使用一个特殊的[UNK]标记,它将被用于表示未知或未在词汇表中找到的token
tokenizer = Tokenizer(WordPiece(unk_token="[UNK]"))

# 2. 配置预分词器
# 对于BERT风格的模型,通常使用基于空格的分词器
tokenizer.pre_tokenizer = Whitespace()

WordPiece分词器的训练需要一个训练器。训练器负责词汇表的构建。

我们将配置一个WordPiece训练器,指定词汇表大小和特殊标记。

BERT模型需要特定的特殊标记,如[CLS](分类标记)、[SEP](分隔标记)、[UNK](未知标记)和[PAD](填充标记)。

我们将这些特殊标记添加到WordPiece训练器中。

# 3. 配置训练器
# 指定词汇表大小,例如 30,000 个 tokens
special_tokens = ["[UNK]", "[CLS]", "[SEP]", "[PAD]"]

# 训练器将基于语料库训练WordPiece模型
trainer = WordPieceTrainer(vocab_size=30000, special_tokens=special_tokens)

现在我们可以使用分词器训练器来训练模型。

# 4. 训练分词器
# 训练器将处理语料库并构建词汇表
tokenizer.train_from_iterator(corpus, trainer=trainer)

训练完成后,分词器现在已经准备好对新文本进行编码了。

让我们尝试使用训练好的分词器对一个新句子进行编码。

# 5. 编码一个新句子
text = "This is a completely new sentence for testing."
encoding = tokenizer.encode(text)

print(f"Encoded IDs: {encoding.ids}")
print(f"Tokens: {encoding.tokens}")

输出应显示句子如何被分解成子词,并且未知词(如completelytesting)可能被标记为[UNK],具体取决于词汇表大小和训练数据的质量。

让我们看看解码过程。

# 6. 解码ID序列
decoded_text = tokenizer.decode(encoding.ids)

print(f"Decoded Text: {decoded_text}")

解码后的文本应该与原始输入文本非常接近,可能只有轻微的差异,因为WordPiece子词化是可逆的。

保存和加载分词器

为了将来使用,您可以将训练好的分词器保存到磁盘。

# 保存分词器
tokenizer.save("custom_bert_tokenizer.json")

# 加载分词器
loaded_tokenizer = Tokenizer.from_file("custom_bert_tokenizer.json")

保存的文件是一个JSON文件,其中包含WordPiece模型的配置和训练出的词汇表。

使用Hugging Face Transformers库集成

要将此自定义分词器与Hugging Face transformers 库中的BERT模型集成,您需要将其包装在一个兼容的类中。

tokenizers 库提供了一个包装器,允许您直接使用 BertTokenizerFast 类。

from transformers import BertTokenizerFast

# 将我们训练的tokenizer包装到BertTokenizerFast中
# 注意:我们需要指定BERT模型名称,即使我们没有下载预训练模型,它也需要知道特殊token的正确映射
# 或者更简单地,我们可以直接加载我们保存的JSON文件并使用BertTokenizerFast的from_file方法

# 步骤1: 训练并保存 (如上所示)
# tokenizer.save("custom_bert_tokenizer.json")

# 步骤2: 使用BertTokenizerFast从文件加载
# BertTokenizerFast 可以直接从我们保存的JSON文件加载
transformer_tokenizer = BertTokenizerFast(tokenizer_file="custom_bert_tokenizer.json")

# 测试包装后的分词器
text = "This is a completely new sentence for testing."
encoding = transformer_tokenizer(text)

print(f"Transformer Encoded IDs: {encoding['input_ids']}")
print(f"Transformer Decoded Text: {transformer_tokenizer.decode(encoding['input_ids'])}")

使用BertTokenizerFast,您可以轻松地将input_idsattention_mask等BERT所需的输入准备好。

例如,您可以通过指定paddingtruncation参数来处理批次输入。

batch_text = [
    "First sentence in batch.",
    "Second, slightly longer sentence in the batch."
]

# 自动填充和截断
encoded_batch = transformer_tokenizer(
    batch_text,
    padding=True, 
    truncation=True, 
    max_length=128,
    return_tensors="pt"  # 返回PyTorch张量
)

print("\nBatch Input IDs:")
print(encoded_batch['input_ids'])
print("\nBatch Attention Mask:")
print(encoded_batch['attention_mask'])

这个例子展示了如何从头开始训练一个WordPiece分词器,并将其集成到Hugging Face生态系统中,以便与BERT模型配合使用。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区