tokenize的目标是输出的文本流,切分成一个个子串,每个子串相对有完整的语义,便于学习Embedding表达和后续模型的使用。
tokenize有三种粒度:word / subword / char
word:词。对于英文等语言来说,存在着天然的分隔符,例如空格等标点符。但对于东亚文字来说。就需要使用某种分词进行;
char:即最基本的字符。一般来讲,字符的数量是少量有限的。这样做的问题是,由于字符数量太少,我们在为每一个字符学习嵌入向量时,每个向量就容纳了太多的语义在内,学习起来就非常困难。
subword:它介于字符和单词之间。这个方案平衡了词汇量和语义独立性,是相对较优的方案。处理原则是,常用词应该保持原状,生僻词应该拆分成子词已共享token压缩空间。
常用的tokenize算法
常用的算法有:BPE,WordPiece,SentencePiece
BPE(Byte-Pair Encoding)
BPE,即字节对编码。其核心在于最长出现的子词对合并,直到词汇表达到预定的大小时停止。
BPE是一种基于数据压缩算法的分词方法。他通过不断地合并出现频率最高的字符或者字符组合,来构建一个词表。具体的BPT运算过程:
1、将所有单词按照字符分解为字母列表;
2、统计每个字母列出现的频率,将频率最高的序列合并为一个新的序列;
3、重复第二步,直到达到预定的词表大小或者无法再合并;
WordPiece
WordPiece,是一种子词粒度的tokenize算法,很多著名的算法如Transformer、BERT等都使用了它。
WordPiece算法可以看作是BPE的变种。不同的是,WordPiece基于概率生成新的Subword而不是下一个最高频字节对。WordPiece算法也是每次从词表中选出两个子词合并成为新的子词。BPE选择频数最高的相邻子词合并,而WordPiece选择使得语言模型概率最大的相邻子词加入词表。即它每次合并的两个字符串A和B,他应该具有最大的概率值。
合并AB之后,所有的原来切成A+B两个tokens就只保留AB一个token,整个训练集上最大似然变化量与概率值成正比。
WordPiece 和 BPE的区别:
BPE:apple当词表有appl 和e的时候,apple优先编码为appl 和e;
WordPiece:根据原始语料,app和le的概率更大;
Unigram
Unigram算法思想是从一个巨大的词汇表出发,在逐渐删除trim down其中的词汇,直到size满足预定义。
初始的词汇表可以采用多有的预分词器分出来的词,再加上所有高频的子串。
每次从词汇表中删除词汇的原则是使用预定义的损失最小。会挑出loss增长最小的10%~20%的词汇来删除。
一般的Unigram算法会和SentencePiece算法连用。
SentencePiece
SentencePiece,它是把一个句子看作是一个整体,再拆分成片段,而没有保留天然的词语的概念。一般地,它把空格space也当做是一种特殊的字符来处理,再用BPE或者Unigram算法来构造词汇表。
目前,Tokenizers库中,所有使用了SentencePiece的都是与Unigram算法联合使用的,比如ALBERT、XLNet、Marian和T5.