bytes-pair-encoding干啥用的

解决未登录词问题的一种方法。
在做nlp的时候,很多时候我们会对语料做一个预处理,生成语料的一个字典。为了不让字典太大,我们通常只会把出现频次大于某个阈值的词丢到字典里边,剩下所有的词都统一编码成#UNK 。这是很经典 很朴素的做法,这种方法不能解决未登录词的问题。未登录词是指 在验证集或测试集出现了训练集从来没见到过的单词。这种未登录词对分词,机器翻译性能影响很大。

于是有学者就提出,ε=(´ο`*)))唉,我们不能这么简单粗暴,我们还是应该看看怎么去解决这种未登录词或者说频率很低的词的问题。在机器翻译领域,常见的方法有:给低频次再设置一个back-off 表呀,当出现低频次的时候就去查表;或者就不做word-level的东西,转而做char-level的东西,也就是说 既然以词为对象进行建模会有未登录词的问题,那么我们以单个字母或单个汉字为对象建模不就可以解决了嘛?因为不管是什么词它肯定是由若干个字母组成的。

这两种方法都有其优势和劣势。第一种方法,简单直接,若干back-off做的很好的话,对低频词的翻译会有很大的提升;但是这种方法依赖于back-off表的质量,而且也没法处理非登录词问题。第二种方法,的确可以从源头解决未登录词的问题,但是这种模型粒度太细,一般出来的效果不是特别好。
于是2016年 rich 这几个人就提出了基于subword来生成词典的方法。
论文:https://arxiv.org/abs/1508.07909 Neural Machine Translation of Rare Words with Subword Units

他的核心思想是综合word-level和char-level的优势,从语料中学习到所有词里边 频次高的 字符串子串。然后把这些频次高的字符串子串收集起来形成一个字典。这个字典里边,既存在char-level级别的子串,也存在word-level级别的子串。然后把这个字典用于模型的训练。论文在寻找频次高的子串时,使用到了bytes-pair-encoding 算法,只不过是把子串进行encoding而已。这个算法也很简单:每次合并在语料中 同一个词里面、相邻的、出现频率最高的两个子串。decoding的时候,根据生成的voc 做相应的替换。

subword-nmt 如何使用

作者已经把论文的subword-nmt开源了,地址:https://github.com/rsennrich/subword-nmt ,但是比较不好的是github上的readme是老版本的,尚未更新。

安装subword-nmt

使用pip3安装

pip3 install subword-nmt

使用subword-nmt

先准备一个语料库。例如:
链接:https://pan.baidu.com/s/1BAWDeAw5QYXS7xCrLIBIAw
提取码:kfy9

生成一个字典:

subword-nmt learn-joint-bpe-and-vocab -i .\en.txt -o .\code.file --write-vocabulary voc.txt

说明:

  • -i后面的参数是输入文件名
  • -o 后面是输出的code文件文件名
  • --write-vocabulary 后面是输出字典的文件名

其他参数说明:

usage: subword-nmt learn-joint-bpe-and-vocab [-h] --input PATH [PATH ...]--output PATH [--symbols SYMBOLS][--separator STR]--write-vocabulary PATH[PATH ...] [--min-frequency FREQ][--total-symbols] [--verbose]learn BPE-based word segmentationoptional arguments:-h, --help            show this help message and exit--input PATH [PATH ...], -i PATH [PATH ...]Input texts (multiple allowed).--output PATH, -o PATHOutput file for BPE codes.--symbols SYMBOLS, -s SYMBOLSCreate this many new symbols (each representing acharacter n-gram) (default: 10000))--separator STR       Separator between non-final subword units (default:'@@'))--write-vocabulary PATH [PATH ...]Write to these vocabulary files after applying BPE.One per input text. Used for filtering in apply_bpe.py--min-frequency FREQ  Stop if no symbol pair has frequency >= FREQ (default:2))--total-symbols, -t   subtract number of characters from the symbols to begenerated (so that '--symbols' becomes an estimate forthe total number of symbols needed to encode text).--verbose, -v         verbose mode.

我们可以看一下生成的code.file和voc.txt
code.file:

#version: 0.2
t h
i n
th e</w>
a n
r e
t i
e n
o n
an d</w>
e r
···

就是做merge操作时的输出,先是单个单个字母的合并,例如第一行:t h 表示可以把字母t和字母h合并起来变成 th,然后把th添加到字典voc.txt里面去。

voc.txt部分内容:

···
ary 14
apart 14
conscientiously 14
flight 14
association 14
represent 14
th 14
activity 14
standard 14
call 14
jia 14
solid 14
seven 14
···

可以看到有th出现。

使用bpe解码

在使用learn-bpe功能得到code以及字典后,可以使用apple-bpe来对语料进行解码。

subword-nmt apply-bpe -i .\en.test.txt -c .\code.file -o result.txt

说明:

  • -i 后面是输入的待解码文件名
  • -c 后面跟着learn-bpe步骤得到的code文件
  • -o 结果输出文件

我们可以查看结果:

beijing , 1 mar ( xinhua ) -- tian feng@@ shan , former heilongjiang governor who is 5@@ 9 years old , was appointed minister of land and resources today .
tian feng@@ shan , who was born in zhao@@ yuan county , heilongjiang province , took part in work since july 196@@ 1 and joined the cpc in march 1970 .
this should be a natural process set off by economic development ; the " third tier construction " of the 1960s involving fac@@ tory relocation was something entirely different .
we must also realize however that from the angle of changing the pattern of resource allocation , we have not yet made the big breakthrough in reform .
with regard to joining the world trade organization , one recent reaction has been blind optim@@ ism and the belief that china will profit whatever it does .
since these areas where objective conditions are not particularly good can achieve this , other areas where conditions are better can naturally do the same .
the objective trend of globalization is calling for international cooperation on a global scale , and a global cooperation has far exceeded the scope of the economy .

就会自动根据bpe生成的code文件对语料进行分割,依照voc.txt进行分割。

嵌入到机器翻译中

如果需要把bpe使用到神经网络中,很简单 使用subword-nmt apply-bpe 对输入语料进行解码得到decode.txt,然后在程序载入subword-nmt生成的字典voc.txt。然后按照机器翻译正常处理语料的套路来做即可:读入decode.txt的每个单词,查找它在voc.txt的字典中的编号。

机器翻译 bpe——bytes-pair-encoding以及开源项目subword-nmt快速入门相关推荐

  1. matlab 写入 MYSQL_阿里开源MySQL中间件Canal快速入门

    前言 距离上一篇文章发布又过去了两周,这次先填掉上一篇秒杀系统文章结尾处开的坑,介绍一下数据库中间件Canal的使用. 「Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能 ...

  2. 20个开源项目助你快速掌握区块链应用开发,JS Go PHP Python Ruby

    Mixin Network不仅仅提供了Node.js教程 创建机器人收消息 收款和转账 给力的开发者社区也贡献了20个开源项目 Go soooooooon/rock caosbad/ever-post ...

  3. GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!

    公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 转自机器之心 大家好,我是小 G. 如果你想用程序来快速生成一款属于自己的手 ...

  4. 强烈推荐这11个Python开源项目,非常值得入门学习(从入门到Python高级开发)

    Python的日益普及及其在业界的使用使它成为当今最流行的编程语言之一.即使有很多学习Python的资源,例如参考书,视频教程,网站,您也可以将GitHub视为满足学习Python愿望的可靠资源之一. ...

  5. 8个小程序开源项目助你快速搭建小程序

    今天和大家分享几个小程序开源项目, 帮助我们轻松搭建自己的小程序应用. 我会从大家最熟悉的小程序UI组件, 到可视化库, 再到完整项目, 一一和大家介绍. 小程序UI组件库 小程序多端开发框架 小程序 ...

  6. springcloud项目打包_SpringCloud 快速入门

    前言 最近入职了新公司,主要负责Java后端开发工作.目前正在开展一个全新的业务,技术选型为SpringCloud全家桶,项目的骨架由我负责搭建.由于前几家公司的微服务框架都是使用Dubbo + Sp ...

  7. 开源分布式中间件 DBLE 快速入门指南

    2019独角兽企业重金招聘Python工程师标准>>> 环境准备 DBLE项目资料 DBLE官方网站:https://opensource.actionsky.com 可以详细了解D ...

  8. 【开源项目】SpringCloud 快速构建项目脚手架工程(持续更新)

    一.项目地址 https://gitee.com/smile-coding/springcloud-quick-start 二.项目说明 本项目旨在提供一个快速构建微服务的脚手架工程,不掺杂任何的复杂 ...

  9. 【开源项目】Sa-Token快速登录(使用+源码解析)

    什么是Sa-Token 官网:https://sa-token.dev33.cn Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.Session会话.单点登录.O ...

  10. RTKLIB 开源代码之科普快速入门网络资料产品/数据下载

    对于新手而言,RTKLIB本身的功能完全能够满足你们的需求:而且最好的参考资料就是RTKLIB MANUAL,介绍的很全,很细,包括怎么使用,每个模块的功能甚至对于代码所用的模型都有介绍:但是对于英文 ...

最新文章

  1. sap和OA之间数值传递2(工程创建)
  2. bat批处理(二):%0 %1——给批处理脚本传递参数
  3. socket如何定义端口号才能避免和其他程序冲突?
  4. 经典论文复现 | PyraNet:基于特征金字塔网络的人体姿态估计
  5. Mysql 主从复制常用管理任务介绍
  6. 自动化机器学习(AutoML)之自动贝叶斯调参
  7. 【Verilog HDL学习之路】第二章 Verilog HDL的设计方法学——层次建模
  8. 能用来写安卓吗_iPad能代替笔记本吗,除了看剧还能用来做什么?
  9. Oracle数据库版本维护支持结束时间表以及数据库版本发行时间表
  10. eclipse import的项目报autowired cannot be resolved to a type的错误
  11. IOS 线程的总结(及cell的图片下载)
  12. Java不适合于作为主要编程教学语言 -- 孟岩
  13. 基于卷积神经网络和迁移学习实现场景图片分类任务
  14. 利用Jenkins+Phantomas进行前端性能自动化测试
  15. html实体注册商标,html 注册商标,html 注册商标代码
  16. JSP课程设计——民航售票管理系统
  17. apple帐号登录服务器端接入
  18. 认识蜂鸣器和声音奥秘
  19. 游戏音乐制作中需要使用那些软件?
  20. 微信和支付宝又更新了,这几个功能很赞

热门文章

  1. 绘制离散系统的直接模拟框图
  2. Matlab机器人工具箱(3-3):五自由度机械臂(动力学)
  3. 华为为何取名鸿蒙系统,华为自主操作系统为何取名鸿蒙,看完西游记才知道霸气在哪里?...
  4. 串口波特率等概念(转https://blog.csdn.net/dagefeijiqumeiguo/article/details/68921820)
  5. 公司职位简称表 C?O
  6. 开源资料:firework 脚本方面的资料
  7. sql查询今年的12个月的统计数据
  8. 【Python】用OpenCC将繁体字转为简体字
  9. 图文解说 linux 安装 nginx
  10. Smartbi电子表格_零编码做报表