在自然语言处理任务中,虽然 Huggingface 提供了大量预训练的 Tokenizer,但有时我们可能需要针对特定语言(例如中文或编程语言)定制一个新的 Tokenizer。本文将展示如何使用 Huggingface 的 AutoTokenizer.train_new_from_iterator()
方法,从现有数据集中训练新的 Tokenizer。为了便于理解,我们将使用 Python 代码作为示例。
1. 加载 CodeSearchNet 数据集
我们首先使用 Huggingface 的 load_dataset()
函数加载 CodeSearchNet 数据集。该数据集包含多个编程语言的开源库函数,本文我们将使用其中的 Python 部分。
from datasets import load_dataset# 加载 CodeSearchNet 数据集的 Python 部分
raw_datasets = load_dataset("code_search_net", "python")
我们可以检查数据集的结构,并查看其中一个具体示例:
print(raw_datasets["train"][123456]["whole_func_string"])
2. 数据生成器准备
为了高效处理大型数据集,我们将数据集转换为批量文本的迭代器。使用 Python 生成器(generator),可以避免一次性加载全部数据,从而减少内存占用。
def get_training_corpus():dataset = raw_datasets["train"]for start_idx in range(0, len(dataset), 1000):samples = dataset[start_idx: start_idx + 1000]yield samples["whole_func_string"]
我们现在准备好用于训练的文本批量数据:
training_corpus = get_training_corpus()
3. 从现有模型训练新的 Tokenizer
我们使用 GPT-2 作为基础模型,并训练新的 Tokenizer。
from transformers import AutoTokenizer# 加载 GPT-2 的预训练 Tokenizer
old_tokenizer = AutoTokenizer.from_pretrained("gpt2")# 从训练语料中训练新 Tokenizer
tokenizer = old_tokenizer.train_new_from_iterator(training_corpus, 52000)
4. 新旧 Tokenizer 的对比
我们通过一个简单的 Python 函数例子对比新旧 Tokenizer 的表现:
example = '''def add_numbers(a, b):"""Add the two numbers `a` and `b`."""return a + b'''# 使用旧的 Tokenizer
print(len(old_tokenizer.tokenize(example)))# 使用新的 Tokenizer
print(len(tokenizer.tokenize(example)))
新 Tokenizer 具备更好的适应性,例如将缩进和 Python 特有的符号视为单一 Token。
5. 保存并加载 Tokenizer
训练完成后,我们需要将 Tokenizer 保存,以便日后使用:
tokenizer.save_pretrained("code-search-net-tokenizer")
保存后,可以通过 from_pretrained()
方法随时加载:
from transformers import AutoTokenizer# 从保存路径加载新的 Tokenizer
tokenizer = AutoTokenizer.from_pretrained("code-search-net-tokenizer")
结语
通过本文的讲解,我们展示了如何从现有的 Tokenizer 出发,在特定领域的数据上进行再训练,定制化一个适用性更强的 Tokenizer。我们探索了如何基于 Python 代码数据集 CodeSearchNet 生成一个新的 Tokenizer,并通过实际例子验证了其在领域专用语料上的表现。新 Tokenizer 不仅可以提高模型在特定领域中的理解能力,还能通过高效的字符与子词处理减少计算开销。
这一过程揭示了自定义 Tokenizer 在领域适应性和训练效率之间的权衡,并强调了“快” Tokenizer 在大规模数据处理中的优势。我们还讨论了如何将新训练的 Tokenizer 保存和上传到 Huggingface Hub 以便重用和共享。
在下一篇博文中,我们将深入探讨 如何从零开始训练一个新的 Tokenizer,不仅仅基于现有的 Tokenizer,而是完全自定义训练,以更好地满足特定语言和任务的需求。敬请期待!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!