翻译任务中的BPE词表实践总结

3 篇文章 0 订阅
3 篇文章 0 订阅

翻译任务中的BPE词表实践总结

BPE是一种数据压缩算法,使用句子中的常见子词(Subword)来编码数据,其粒度处于字符和单词粒度之间,例如给定单词"looked"和"looking",BPE词表往往会划分出"look","ed”,"ing"这些子词部分,在降低词表大小的同时也能有效编码词义信息。
BPE分词可以很好地平衡词表大小和编码运算复杂度的关系。BPE算法包括词表构建、编码和解码三个主要部分,由于网上已经有很多相关介绍,本文对一些细节问题做一些总结和说明。

词表构建

BPE词表的构建需要以下几个条件:

  1. 充足的无监督语料;
  2. 词表大小size值;
  3. 每个句子的句尾或句首需要添加标识(如’w’或’\w’)。

词表构建时的注意事项:

  1. 带有首尾标记符的子词不能与不带标记符的子词混合计算,因为首尾标记符的目的是统计子词在句首或句尾的分布情况;
  2. 如果某个子词是另一个大子词的一部分,即语料中没有出现该子词单独出现时的情况,则大子词合并后需要将该子词删除。算法迭代时可以对比子词和大子词的频率是否相等,相等说明需要删除,否则就有子词单独出现的情况;
  3. 阈值的选择非常重要,阈值过高可能忽略关键子词,阈值低可能将不相关子词也计入词表,容易造成类似“过拟合”的情况,也会使Word Embedding更加稀疏,不设定阈值时,默认当前切分状态下子词频率都为1时终止,即使词表大小不够。

子词编码

子词编码按如下原则进行:最长匹配,且同长度高频匹配。具体流程如下:

  1. 遍历句子的每一个字符,在词表中寻找以该字符起始的最长匹配子词(注意分首尾);
  2. 找到所有最长匹配字词后,如果这些切分没有歧义(即分段没有交集),则直接切分并将剩下部分继续解码,如果存在歧义则保留频率高的切分
  3. 如果当前字符在词表中没有找到对应值,则按未知词(unk)处理。
    使用上述字词编码方法,可以得到基于当前词表的子词切分序列,用于后续Tokenizer编码。切分后的序列在排除未知词后,也能与训练时训练集的切分状态保持一致。因而由上述算法也不难看出,BPE编码对分词歧义问题还是能有效避免的。

子词解码

按照编码id逐一在词表中查询,句首和句尾的id在匹配出位于句首或句尾的子词后,需要添加空格等分界符。
有关句首和句尾的规则,这里做进一步的说明:
一个词在句中的位置有四种情况:B(句子起始)、M(句中)、E(句子结尾)和S(单独出现)。
如果词表构建时加了句首标记(continuing_subword_prefix),则B、S为一个子词(在词表中一般加前缀‘##’),M、E为另一个子词。
如果词表构建时加了结尾标记(end_of_word_suffix),则E、S为一个子词,B、M为另一个子词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值