BPE

基于词构建词表过于庞大,基于字符构建过于小,本文采取两者的中间,基于子词构建词表

什么是 BPE ?

  • BPE 是一种从语料库中构建 subword 级别词汇表的方法,相比较 word 级别的词汇表构建算法,它也是一种压缩算法。BPE 每一步都将最常见的一对_相邻数据单位_替换为该数据中没有出现过的一个_新单位_,反复迭代直到满足停止条件
  • 1) 初始化符号词表:把所有的字符加入到符号词表中,对所有单词的末尾加入特殊标记,如‘’,翻译后恢复原始标记
    1. 统计相邻元素:迭代的对所有符号进行统计,找出次数最多的(A,B),用 AB 代替,示例是 (‘e’, ‘s’)
  • 3) 合并出现次数最多的元素:每次合并,都会产生一个新的符号,代表 n-gram 字符

BPE 的预料编码过程 ?

  • 1)首先将词表中所有的子词按照长度从大到小进行排序
  • 2)对于每一个给定的单词,我们遍历排序好的词表,寻找词表中的子词是否是该单词的子字符串。如果正好 **「匹配」**,则输出当前子词,并对单词剩下的字符串继续匹配
  • 3)如果遍历完词表,单词中仍然有子字符串没有被匹配,那我们将其替换为一个特殊的子词,比如 <unk>
  • 对于给定的单词 mountain</w>,在以下词表的分词结果为:[mountain</w>]
    1
    2
    3
    4
    5
    6
    7
    ( “errrr</w>”, 
    “tain</w>”,
    “moun”,
    “est</w>”,
    “high”,
    “the</w>”,
    “a</w>”)

BPE 的预料解码过程 ?

  • 将所有的输出子词拼在一起,直到碰到结尾为 <\w>,如模型输出 ["moun", "tain</w>", "high", "the</w>"],其解码结果为 ["mountain</w>", "highthe</w>"]

参考:

  1. NLP 中的 subword 算法及实现 - 知乎
  2. 一文搞懂 BPE 分词算法 - 知乎
  3. 理解 NLP 最重要的编码方式 — Byte Pair Encoding (BPE),这一篇就够了 - 知乎