欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 基于Python的自然语言处理系列(38):从现有数据训练新的 Tokenizer

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

2024/10/23 14:07:49 来源:https://blog.csdn.net/ljd939952281/article/details/142931453  浏览:    关键词:基于Python的自然语言处理系列(38):从现有数据训练新的 Tokenizer

        在自然语言处理任务中,虽然 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,而是完全自定义训练,以更好地满足特定语言和任务的需求。敬请期待!

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

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

谢谢大家的支持!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com