子词切分算法

2023-11-03

     最近使用transformer训练机器翻译模型,期间也看了一些关于数据预处理分词的方法,了解了transformer[1]的subtokenizer以及bpe算法。

     其中subtokenizer分为形成词汇表与处理训练文本两个部分。

     形成词汇表部分,首先通过空格为间隔切分原始文本并统计词语与词频数,其次根据上个步骤的统计形成初始的每个单词或单字词汇表。通过迭代一定的次数不断更新词汇表。那么如何更新呢,主要采用如下几个步骤:

1、遍历当前的文本的每个词语,将每个词语切分,从最长长度即end开始,向前遍历这个词语的每个位置,找到最长的在词典中的词,不断切割,直至该词切割结束,如我是小白将会被切分成我、是、小白。然后进一步更新新的词语与词频,如以我开始,则有我1,我是1,我是小白1,以是开始,是1,是小白1,以小白开始,则是小白1。

2、基于新的词语与词频,从最长的词语开始,如果词频大于一定的阈值,则加入新的词汇表,否则不加。并将与之相关的词频减少,如‘translate’加入词汇表,则对应的’t’,‘tr’…对应词频减少。一直遍历到最短的词语。

     处理训练文本部分,将原文本按空格划分,对每一行的每个词语进一步切分,每次找出在词表中最长的子词。切分完后进行编码即可。

     BPE算法基于论文[2],以及开源代码[3],该算法具体执行过程如下:

1、learn bpe

     首先根据空格切分原训练语料,因此需要先分词,以统计词语与词频。将每个词语变成单个词如’word’变为{w,o,r,d</w>},根据词频进行排序,形成{(w,o,r,d):1}类似的词语词频字典。

     将排序字典中每个key进行前后组后,统计词频,如{(w,o,r,d):1}则变为{wo:1,or:1,rd:1}。生成词语词频统计结果。

     基于指定生成bpe的数目,每次选择频率出现最高的词语,将词语词频字典中对应的两个词合并成一个词,如‘a’’b’出现的合并为’ab’, 并将其写入bpe codes里。并将与之相关的统计结果进行更新,如‘a b c b’,如果ab合并,则对应的’b c’统计次数减少。最后将‘ab’的统计次数置为0。不断循环迭代,直至生成指定的bpe codes数。

2、apply bpe

     此次apply bpe的作用是为了生成词汇表,如果词汇表已经生成,则忽略此步。

     上一步生成的bpecodes默认以权重进行排序,权重大的在前面。

     将原始语料每一行读入,以空格切分,形成每个词组。对词组中的每个词得到对应的pair,如word则形成[wo,or,rd]。每次在这个word pairs选择在bpe codes权重最大的pair,组合并形成新的word,如果最终pair数为1即没有合并的可能或者最大的pair也不再bpe_codes中,则停止循环。如{我爱祖国}则变为{我爱 祖国}。由于我和爱原词后面仍接着词,因此最终变为{我@@ 爱@@ 祖国}。以区别{祖国@,爱@,我},最终我和我@是不同的词汇。

3、将apply bpe的结果按空格划分形成词汇表,包含词语与词频。

4、将原语料进一步使用apply bpe,此次可以结合词汇表,可以设置一个阈值,不使用低频词,以减少低词频影响。因为过滤掉低词频,可能会出现oov问题,如出现oov问题,则将原词切分为更小的词。我觉得它和第二步有点重复,不知理解是否错误。

     以上就是使用transformer过程中对子词切分一点总结。

[1] https://github.com/tensorflow/models

[2]Neural Machine Translation of Rare Words with Subword Units

[3]https://github.com/rsennrich/subword-nmt


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

子词切分算法 的相关文章

  • python轮胎缺陷检测_基于数字图像处理的轮胎缺陷检测

    摘要 随着汽车工业和道路交通运输业的迅猛发展 由于子午线轮胎具有胎面不容易变形 比较良好的稳定性 使用安全和耐用等特点 并且子午线轮胎的功能明显优越于普通斜交胎 其应用越来越普遍 已成为世界轮胎发展中的主要产品 但是子午线轮胎在制造过程中工
  • Navicat for mysql连接mysql时遇到的问题及其解决方法

    今天电脑重新装mysql 遇到了一个问题 authentication plugin caching 大概这样 懒得写了 找了好多教程 乱七八糟的就是解决不了 最后找到一篇博客https blog csdn net u011182575 a

随机推荐

  • 7. python爬虫——基于xpath爬取58同城房源信息

    python爬虫 基于xpath爬取58同城房源信息 1 需求 2 分析 3 代码 4 实现效果 1 需求 获取58同城上所有房源的标题信息 https bj 58 com ershoufang 2 分析 使用抓包工具进行分析 发现所有的房
  • vue2-element,vue3-element-plus 的列表翻页的序号

    前言 这里整理下 vue2 vue3中用饿了么框架的列表 序号随页增加的功能 vue2 page 当前页 pageSize 一页显示多少条 type index index indexMethod 序号翻页连续排序 indexMethod
  • 【踩坑笔记】从零开始在Linux和Windows部署安装kIash

    klash是一个基于规则的路由 可以为多地服务器之间配置特定的连接规则 加快后端业务响应速度 从零开始在Linux和Windows部署安装klash 一 材料准备 二 安装步骤 windows端 linux端 三 问题and踩坑 一 材料准
  • 敏捷开发流程

    一 敏捷起源 2001年2月 Martin Fowler Jim Highsmith等17位著名的软件开发专家齐聚在美国犹他州雪鸟滑雪圣地 举行了一次敏捷方法发起者和实践者的聚会 在这次会议上面 他们正式提出了Agile 敏捷开发 这个概念
  • 如何在php中获取curl请求的请求头信息及相应头信息

    1 获取请求头信息 可以在curl exec函数执行前 添加代码curl setopt ch CURLINFO HEADER OUT true 在curl exec函数执行后 通过 curl getinfo ch CURLINFO HEAD
  • dom模板列表-2

    模板列表
  • TensorRT 初探(1)—— conv2d:IConvolutionLayer

    tensorrt之conv2d计算详解 环境搭建 简介 代码 设置prepadding和postpadding prepadding postpadding与paddingNd冲突时 设置padding mode 总结 附录 环境搭建 环境
  • 浅谈JVM基本结构

    目录 1 JVM概念 2 JVM基本结构 3 JVM存储数据案例 1 JVM概念 JVM是Java Virtual Machine Java虚拟机 的缩写 JVM是一种用于计算设备的规范 它是一个虚构出来的计算机 是通过在实际的计算机上仿真
  • app提交上架最新流程 ios

    一 上架基本需求资料1 苹果开发者账号 公司已有可以不用申请 需要开通开发者功能 每年 99 美元 2 开发好的APP 二 证书上架版本需要使用正式的证书 1 创建证书 Apple Developer 2 上传证书 Sign In Appl
  • css3 隐藏滚动条但是有滚动效果的方法

    前沿 相信好多小伙伴都遇到过这个需求 那就来说一下 原理 就是在滚动区域的外部在套一个盒子 设置外部这个盒子宽比内部的少20px 其实也就是滚动条的宽度 然后在overflow hidden就可以了 接下来看个小例子
  • Unity把png图片转换为sprite格式

    最近自己在做游戏项目 经常碰到导入的图片是png格式 但是要转换为sprite格式才能应用 以下是转换的简单方式 不需要代码的 1选中要转换的png图片 在Inspector窗口查看属性 2在窗口中找到Texture Type选择Sprit
  • Java程序员项目面试

    如何做自我介绍 自我介绍该怎么做 要介绍什么 自我介绍尽可能控制在3分钟以内 关于技术介绍以外例如 性格 爱好等尽可能忽略 自我介绍时应该主要包含下面几个内容 个人信息 15秒 学习经历 30秒 工作经历 2分钟 其中社招工作经历最为重要
  • Python 根据Excel修改文件名称 封装成.exe程序

    目录 前言 一 实验环境 二 实现步骤 1 设计思路 2 引入库 3 具体代码 4 封装成exe程序 5 功能展示 总结 前言 公司想要一个可以在任何一个Windows电脑上能使用的工具 可以根据Excel表格内容来修改图片的名称 我本来打
  • MySQL 为什么在实际开发中一般不使用外键约束

    阿里开发手册 强制 不得使用外键与级联 一切外键概念必须在应用层解决 1 外键优点 保证数据的完整性和一致性 级联操作方便 将数据完整性判断托付给了数据库完成 减少了程序的代码量 2 外键缺点 业务数据生成顺序 未必一定可以先生成外键的值
  • 树莓派街机乱码--batocera 中文乱码 --RetroArch 中文乱码

    1 下载中文字体1 重命名为NanumMyeongjo ttf 2 打开WinSCP 连接树莓派 用户名密码为 root linux 3 替换 usr share fonts truetype nanum目录下的NanumMyeongjo
  • OIer JCY

    OIer JCY 一 初一的寒假 大雪纷飞 JCY来到了他的初中 那是坐落在长春市边缘的一栋L形的建筑 冗长的走廊两边设着教室 教室和走廊之间只有门上和靠天花板的地方开着小玻璃窗 透进来些许微弱的光线 灯又不常开着 因而整个走廊总是十分昏暗
  • k8s里面Deploy控制器的使用

    为了更好的解决服务编排的问题 kubernetes在V1 2版本开始 引入了Deployment控制器 值得一提的是 这种控制器并不直接管理pod 而是通过管理ReplicaSet来简介管理Pod 即 Deployment管理Replica
  • 剑指Offer第六十一题:序列化二叉树

    题目描述 请实现两个函数 分别用来序列化和反序列化二叉树 思路 这里序列化就是直接先序遍历即可 但是反序列化指输入序列 返回tree 这里由于左右子树位置不知道 所以在序列化的时候加入 字符 以此判断子树为空 注 这里需要使用char 转s
  • 通用Mapper插件和MyBatis拦截器的使用

    通用Mapper和MyBatis拦截器的使用 MyBatis拦截器 拦截器的使用 MyBatis 拦截器的简单实现 实例结果验证 orderBy createTime默认排序 拦截器在项目中的使用 通用Mapper 简介 使用教程 通用Ma
  • 子词切分算法

    最近使用transformer训练机器翻译模型 期间也看了一些关于数据预处理分词的方法 了解了transformer 1 的subtokenizer以及bpe算法 其中subtokenizer分为形成词汇表与处理训练文本两个部分 形成词汇表