基于Python的自然语言处理系列(38):从现有数据训练新的 Tokenizer

embedded/2024/10/21 11:08:49/

        在自然语言处理任务中,虽然 Huggingface 提供了大量预训练的 Tokenizer,但有时我们可能需要针对特定语言(例如中文或编程语言)定制一个新的 Tokenizer。本文将展示如何使用 HuggingfaceAutoTokenizer.train_new_from_iterator() 方法,从现有数据集中训练新的 Tokenizer。为了便于理解,我们将使用 Python 代码作为示例。

1. 加载 CodeSearchNet 数据集

        我们首先使用 Huggingfaceload_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,而是完全自定义训练,以更好地满足特定语言和任务的需求。敬请期待!

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

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

谢谢大家的支持!


http://www.ppmy.cn/embedded/129249.html

相关文章

WPF -- 实现打印实时数据功能

一、实现打印过程 在WPF中,我读取了CSV文件中的内容(主要是表格),通过条件筛选内容之后将其赋值给FlowDocument,再将FlowDocument的内容赋值给RichTextBox 在前端显示,满足了我打印RichTextBox 的内容这个…

asp.net mvc return json()设置maxJsonLength

asp.net mvc异常信息 Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property. 在ASP.NET MVC中,当你遇到使用JavaScriptSerializer进行JSON序列化…

006_django基于Python的二手房源信息爬取与分析2024_l77153d4

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

域7:安全运营 第17章 事件的预防和响应

第七域包括 16、17、18、19 章。 事件的预防和响应是安全运营管理的核心环节,对于组织有效识别、评估、控制和减轻网络安全威胁至关重要。这一过程是循环往复的,要求组织不断总结经验,优化策略,提升整体防护能力。通过持续的监测、…

PHP仿爱站网站ICP备案查询源码修复版

源码简介 PHP仿爱站网站ICP备案查询源码,自己小改了一下,内置本地加载(非接口),短时间请求次数多会被限制,无后台。 安装环境 测试搭建环境:php7.0 搭建教程 上传源码压缩包到网站目录并解压即可 首页截图 源码下…

小米电机与STM32——CAN通信

背景介绍:为了利用小米电机,搭建机械臂的关节,需要学习小米电机的使用方法。计划采用STM32驱动小米电机,实现指定运动,为此需要了解他们之间的通信方式,指令写入方法等。花了很多时间学习,但网络…

防范数据泄露,守护安全存储新时代

在这个信息爆炸的时代,数据安全已经成为我们生活中不可或缺的一部分。无论是个人隐私、企业机密还是国家机密,数据的安全存储和传输都是我们最关注的问题。数据泄露、黑客攻击、隐私侵犯...这些词汇听起来就让人不寒而栗。想象一下,这时候一个…

Node.js 中的 WebSocket 底层实现

WebSockets 是一种网络通信协议,可实现双向客户端-服务器通信。 WebSockets 通常用于需要即时更新的应用程序,使用 HTTP 之上的持久双工通道来支持实时交互,而无需持续进行连接协商。服务器推送是 WebSockets 的众多常见用例之一。 本文首先…