【自己创建分词器tokenizer】(2)——BPE tokenizer

2023-10-29

【自己创建分词器】WordPiece tokenizer
【自己创建分词器】BPE tokenizer
【自己创建分词器】Unigram tokenizer

1 整体步骤

分词包括以下几个步骤:

  1. 标准化(Normalization,对文本进行必要的清理,例如去除空格、重音、Unicode标准化等)。
  2. 预分词(Pre-tokenization,将输入拆分为单词)。
  3. 将输入传递给模型(Model,使用预分词的单词生成令牌序列)。
  4. 后处理(Post-processing,添加分词器的特殊令牌,生成注意力掩码和令牌类型ID)。

2 数据准备

from datasets import load_dataset

dataset = load_dataset("wikitext", name="wikitext-2-raw-v1", split="train")


def get_training_corpus():
    for i in range(0, len(dataset), 1000):
        yield dataset[i : i + 1000]["text"]

函数get_training_corpus()是一个生成器,它会产生批次包含1000个文本,后面将使用这些文本来训练分词器。
分词器还可以直接在文本文件上进行训练。以下是如何生成一个包含所有来自WikiText-2的文本/输入的文本文件,我们可以在本地使用:

with open("wikitext-2.txt", "w", encoding="utf-8") as f:
    for i in range(len(dataset)):
        f.write(dataset[i]["text"] + "\n")

3 全过程

3.1 import and prepare

要使用Tokenizers库构建一个分词器,首先我们实例化一个Tokenizer对象,然后将其normalizer、pre_tokenizer、post_processor和decoder属性设置为所需的值。
在这个示例中,我们将创建一个带有WordPiece模型的分词器:

from tokenizers import (
    decoders,
    models,
    normalizers,
    pre_tokenizers,
    processors,
    trainers,
    Tokenizer,
)

现在让我们构建一个GPT-2分词器。与构建BERT分词器类似,我们首先使用BPE模型初始化一个分词器:

tokenizer = Tokenizer(models.BPE())

就像为BERT一样,如果我们有一个词汇表,也可以使用它来初始化这个模型(在这种情况下,我们需要传递词汇表和合并规则),但是由于我们将从头开始训练,所以不需要这样做。我们也不需要指定unk_token,因为GPT-2使用的是字节级别的BPE,不需要它。

3.2 pre-tokenization

GPT-2不使用规范化器,所以我们跳过这一步,直接进行预标记:

tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False)

我们在这里添加给ByteLevel的选项是不在句子开头添加空格(否则默认会添加)。我们可以看一下类似之前的示例文本的预标记:

tokenizer.pre_tokenizer.pre_tokenize_str("Let's test pre-tokenization!")

输出:

[('Let', (0, 3)), ("'s", (3, 5)), ('Ġtest', (5, 10)), ('Ġpre', (10, 14)), ('-', (14, 15)),
 ('tokenization', (15, 27)), ('!', (27, 28))]

3.3 Model

接下来是model,需要进行训练。对于GPT-2,唯一的特殊标记是结束文本标记:

trainer = trainers.BpeTrainer(vocab_size=25000, special_tokens=["<|endoftext|>"])
tokenizer.train_from_iterator(get_training_corpus(), trainer=trainer)

与WordPieceTrainer一样,除了vocab_size和special_tokens,我们还可以指定min_frequency(如果需要的话),或者如果我们有一个词尾标记(例如),可以使用end_of_word_suffix进行设置。
这个分词器也可以在文本文件上进行训练:

tokenizer.model = models.BPE()
tokenizer.train(["wikitext-2.txt"], trainer=trainer)

让我们看一下示例文本的标记化:

encoding = tokenizer.encode("Let's test this tokenizer.")
print(encoding.tokens)

输出:

['L', 'et', "'", 's', 'Ġtest', 'Ġthis', 'Ġto', 'ken', 'izer', '.']

3.4 post-processor

我们对 GPT-2标记发生器应用字节级后处理,如下所示:

tokenizer.post_processor = processors.ByteLevel(trim_offsets=False)

trim_offsets = False选项告诉后处理器,我们应该保留以’Ġ’开头的标记的偏移量,这样偏移量的起始点将指向单词之前的空格,而不是单词的第一个字符(因为空格在技术上是标记的一部分)。让我们看一下刚刚编码的文本的结果,其中’Ġtest’是索引为4的标记:

sentence = "Let's test this tokenizer."
encoding = tokenizer.encode(sentence)
start, end = encoding.offsets[4]
sentence[start:end]

输出:

' test'

最后,我们添加一个字节级解码器:

tokenizer.decoder = decoders.ByteLevel()

测试是否正常工作:

tokenizer.decode(encoding.ids)

输出:

"Let's test this tokenizer."

4 最后

现在我们完成了,我们可以像之前一样保存标记器,并将其包装在PreTrainedTokenizerFast或GPT2TokenizerFast中,如果我们想在Transformers中使用它:

from transformers import PreTrainedTokenizerFast

wrapped_tokenizer = PreTrainedTokenizerFast(
    tokenizer_object=tokenizer,
    bos_token="<|endoftext|>",
    eos_token="<|endoftext|>",
)
from transformers import GPT2TokenizerFast

wrapped_tokenizer = GPT2TokenizerFast(tokenizer_object=tokenizer)

其他部分,比如保存与加载等,和之前WordPiece tokenizer是一样的,本文没有赘述。

参考:
https://huggingface.co/learn/nlp-course/chapter6/8?fw=pt#building-a-bpe-tokenizer-from-scratch

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【自己创建分词器tokenizer】(2)——BPE tokenizer 的相关文章

  • 【卡尔曼滤波】粗略模型和过滤技术在模型不确定情况下的应用研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献
  • 喜报|华测导航荣获“张江之星”领军型企业称号

    近日 2023年度 张江之星 企业培育名单发布 上海华测导航荣获2023年度 张江之星 领军型企业称号 据悉 张江之星 企业培育是上海科创办为落实 关于推进张江高新区改革创新发展建设世界领先科技园区的若干意见 张江高新区加快世界领先科技园区
  • Soul App:年轻人的社交状态,还有多少种可能?

    查尔斯 狄更斯在 双城记 的开篇写下 这是最好的时代 这是最坏的时代 这是智慧的时代 这是愚蠢的时代 这是信仰的时期 这是怀疑的时期 人们面前有着各样事物 人们面前一无所有 既然万事万物都和狄更斯所说般 好坏参半 那又何必执着于过去 苦恼于
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 什么是充放电振子理论?

    CHAT回复 充放电振子模型 Charging Reversal Oscillator Model 是一种解释ENSO现象的理论模型 这个模型把ENSO现象比喻成一个 热力学振荡系统 在这个模型中 ENSO现象由三个组成部分 充电 Char
  • 利用CHAT上传文件的操作

    问CHAT autox js ui 上传框 CHAT回复 上传文件的操作如果是在应用界面中的话 由于Android对于文件权限的限制 你可能不能直接模拟点击选择文件 一般来说有两种常见的解决方案 一种是使用intent来模拟发送一个文件路径
  • 活动日程&直播预约|智谱AI技术开放日 Zhipu DevDay

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 直播预约通道 关于AI TIME AI TIME源起于2019年 旨在发扬科学思辨精神 邀请各界人士对人工智能理论 算法和场景应用的本质问题进行探索 加强思想碰撞 链接全球AI学
  • 基于opencv的大米计数统计(详细处理流程+代码)

    在我每周的标准作业清单中 有一项是编写计算机视觉算法来计算该图像中米粒的数量 因此 当我的一个好朋友M给我发了一张纸上的扁豆照片 显然是受到上述转发的启发 请我帮他数一下谷物的数量时 它勾起了我怀旧的回忆 因此 我在我的旧硬盘上寻找很久以前
  • 毕业设计:基于深度学习的微博谣言检测系统 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有
  • 如何快速申请GPT账号?

    详情点击链接 如何快速申请GPT账号 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Gemini以及大模型
  • 机器学习算法实战案例:BiLSTM实现多变量多步光伏预测

    文章目录 1 数据处理 1 1 导入库文件 1 2 导入数据集 1 3 缺失值分析 2 构造训练数据
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • 主流进销存系统有哪些?企业该如何选择进销存系统?

    主流进销存系统有哪些 企业该如何选择进销存系统 永久免费 的软件 这个可能还真不太可能有 而且就算有 也只能说是相对免费 因为要么就是数据存量有限 要么就是功能有限 数据 信息都不保障 并且功能不完全 免费 免费软件 免费进销存 诸如此类
  • 【固定翼飞机】基于最优控制的固定翼飞机着陆控制器设计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • CorelDRAW2024官方中文版重磅发布更新

    35年专注于矢量设计始于1988年并不断推陈出新 致力为全球设计工作者提供更高效的设计工具 CorelDRAW 滋养并见证了一代设计师的成长 在最短的时间内交付作品 CorelDRAW的智能高效会让你一见钟情 CorelDRAW 全称 Co
  • 3D点云检测神技 | UFO来了!让PointPillars、PV-RCNN统统涨点!

    作者 AI驾驶员 编辑 智驾实验室 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 3D目标检测 技术交流群 本文只做学术分享 如有侵权 联系删文 在这篇论文中提出了一个关于在3D点云中检测未
  • 15天学会Python深度学习,我是如何办到的?

    陆陆续续有同学向我们咨询 Python编程如何上手 深度学习怎么学习 如果有人能手把手 一对一帮帮我就好了 我们非常理解初学者的茫然和困惑 大量视频 书籍 广告干扰了大家的判断 学习Python和人工智能 成为内行人不难 为此 我们推出了
  • 国产化率100%,北斗导航单日定位4500亿次,外媒:GPS将被淘汰

    追赶30年的技术差距 国产卫星导航系统 北斗 开始扬眉吐气 数据显示 北斗导航目前单日定位量达4500亿次 已经获得100多个国家的合作意向 甚至国际民航也摒弃以往 独宠 GPS的惯例 将北斗纳入参考标准 对此 有媒体直言 GPS多年来的技
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩
  • 自动驾驶离不开的仿真!Carla-Autoware联合仿真全栈教程

    随着自动驾驶技术的不断发展 研发技术人员开始面对一系列复杂挑战 特别是在确保系统安全性 处理复杂交通场景以及优化算法性能等方面 这些挑战中 尤其突出的是所谓的 长尾问题 即那些在实际道路测试中难以遇到的罕见或异常驾驶情况 这些问题暴露了实车

随机推荐

  • git clone 遇到问题:fatal: unable to access ‘https://github.comxxxxxxxxxxx‘: Failed to connect to xxxxxxx

    git clone 遇到问题 fatal unable to access https github comxxxxxxxxxxx Failed to connect to xxxxxxxxxxxxx
  • ContOS7镜像下载与安装

    contos7的安装 文章目录 contos7的安装 一 镜像下载 二 安装 一 镜像下载 官网下载链接 http isoredirect centos org centos 7 isos x86 64 阿里云镜像站点 http mirro
  • Vite跨域设置

    Vite跨域设置 步骤一 vite config ts配置 proxy 跨域代理 apis target http env VUE APP BASE API target http url port changeOrigin true re
  • 一起学nRF51xx 6 - uart

    前言 通用异步接收器 发送器提供快速 全双工 内置流量控制的异步串行通信 CTS RTS 在硬件方面支持高达1Mbps波特率 支持奇偶校验和第9位数据生成 用于每个UART接口线的GPIO可从芯片上的GPIO中任选 而且可独立配置 这使得芯
  • CentOS8基础篇3:使用vim编辑文档

    一 vim编辑器 vim 编辑器共有三种工作模式 分别是命令模式 输入模式和末行模式 例2 24 使用vim编辑器创建并编辑文件hello c 二 查看文件内容命令 1 more less 浏览文件全部内容 当文件内容过多时 可以用more
  • 2.2析取范式与合取范式

    2 2析取范式与合取范式 本节给出命题公式的两种规范表示方法 这种规范的表达式能表达真值表所能提供的一切信息 定义2 2命题变项及其否定统称作文宇 仅由有限个文字构成的析取式称作简单析取式仅由有限个文字构成的合取式称作简单合取式 P g p
  • [正能量系列]失业的程序员(三)

    注 本文原型为作者的好友们 全文不完全代表作者本人的意图 本系列前两章 失业的程序员 一 二 一 这段时间我去参加了一个管理培训班 说实话去之前真的很痛苦 我一向认为那些都是骗人的玩意儿 在qq上找我学姐吐槽 说现在的广告真烦 搞这么多培训
  • Qt注册自定义类型

    一 自定义类型注册必要性 如果要在Qt信号槽中使用自定义类型 需要注意使用qRegisterMetaType对自定义类型进行注册 当然在不跨线程时使用自定义类型signal slot来传递 可能不会出现什么问题 一旦涉及跨线程就很容易出错
  • SPSS(基础篇09)--拆分数据文件

    拆分数据文件 文章目录 拆分数据文件 前言 1 在原始文件中拆分 1 1 拆分文件 比较组 1 2 拆分文件 按组来组织输出 1 3 其它用法 2 直接存储为多层 拆分结果单独存为文件 前言 导语 拆分文件是一种很常见的操作 比如 一个数据
  • 关于loss.backward()函数反向传播时叶子节点被释放

    之前写代码的时候遇到的一个问题 一直没有解决 后来稀里糊涂的解决了 我也不知道原因 这里贴出来 希望大家遇到这个问题的时候能有些启发 图来自网上搜索 由于问题是很久以前的了 当时没有保存截图 抱歉了 这个问题的出现其实可以将 loss ba
  • spring-aop组件详解——TargetSource目标源

    TargetSource 目标源 是被代理的target 目标对象 实例的来源 TargetSource被用于获取当前MethodInvocation 方法调用 所需要的target 目标对象 这个target通过反射的方式被调用 如 me
  • [工业互联-19]:如何在QT中增加SOEM主站

    目录 第1章 基本步骤 第2章 详细步骤 2 1 QT安装 2 2 VS安装 2 3 Win10 Debuggers 2 4 QT配置 2 5 SOEM移植 lib库生成 2 文件移植 文件整理 第1章 基本步骤 要在QT中添加SOEM主站
  • jsp 实现在线人数统计

    首先写个类 import javax servlet import javax servlet http public class SessionCounter implements HttpSessionListener private
  • Xcode7.1环境下上架iOS App到AppStore 流程 (Part 三)

    前言部分 part三 部分主要讲解 Xcode关联绑定发布证书的配置 创建App信息 使用Application Loader上传 ipa文件到AppStore 一 Xcode配置发布证书信息 1 给应用绑定App ID并添加Team账号
  • 爬取某网站的内容、得不到html页面的内容

    Python爬取 1 爬取内容 对某网站内容与热度进行爬取 分析 我们所需的数据是热搜榜的1 10 第一个数据pass divs html xpath div class wbpro side card7 div position gt 1
  • npm init @vitejs/app 初始化项目报错

    我的解决办法在红色加粗的那里 仅供参考 npm init vitejs app vitejs create app is deprecated use npm init vite instead C Users AppData Local
  • List排序 Sort的用法

    目录 1 简要说明 2 官方文件 3 举例说明 3 1 默认排序Sort 3 2Sort IComparer comparer 3 3Sort Comparison comparison 3 4Sort int index int coun
  • C++11新特性之右值引用

    目录 前文 一 什么是右值引用 二 左值引用和右值引用比较 三 右值引用的应用场景以及作用 四 右值引用左值的场景分析 五 完美转发 总结 前文 在C 98标准后 C 11标准的更新为C 注入了新活力 C 11新加了140多个新特性 我们这
  • C#反射Activator

    一 反射的定义与使用场景 反射是指程序可以访问 检测和修改它本身状态或行为的一种能力 程序集包含模块 而模块包含类型 类型包含成员 反射提供了封装程序集 模块和类型的对象 Type类型 可以使用反射动态创建类型的实例 将类型绑定到现有对象
  • 【自己创建分词器tokenizer】(2)——BPE tokenizer

    自己创建分词器 WordPiece tokenizer 自己创建分词器 BPE tokenizer 自己创建分词器 Unigram tokenizer 1 整体步骤 分词包括以下几个步骤 标准化 Normalization 对文本进行必要的