BPE算法本质是基于合并的,而不是基于切分的,理解这一点很重要。
在BPE整个迭代的过程中,是基于“词表”的,但是最后要生成的是“子词表”,拿来用的也是“子词表”。
拿论文里的例子来说,最开始词表长这样:
l o w < 5
l o w e r < 2
w i d e s t < 6
n e w e s t < 3
如果你不迭代,直接基于这个词表去生成子词表,那生成的子词表就是二十六个字母:
l
o
w
e
s
t
r
n
i
d
<
然后进行五次合并操作之后,词表会变成这样:
low < 5
low e r < 5
w i d est< 6
n e w est< 3
基于这个词表生成的子词表长这样:
est<
low
w
e
r
n
i
d
<
如上,注意按照长度排列了一下,然后用这个子词表去切分输入文本。这里说是切分,实际上还是合并。比如来了一个单词:
biggest
我还是先把它切成字符:
b i g g e s t
然后从子词表里找,发现 est< 能合起来,那就把 est< 合起来。然后发现别的合不起来了,就按照这个结果切分了:
b@@ i@@ g@@ g@@ est
感觉查到的相关资料都没太讲明白。