在文本分析和文本模型构建过程中,第一步都需要将文本转化为数字,这样计算机才能去处理,这一过程称之为tokenization。tokenization是将文本句子切分成一个个子单元,然后将子单元数值化(映射成向量),接着将这些向量输入到模型进行编码,最后输出到下游任务中进一步得到最终结果。它为数值化作准备,数值化的过程必然需要映射,而映射又需要一个目标集合或者说映射表,其难点在于如何获得理想的切分,使文本中所有的token都具有正确的语义,并且不会存在OOV问题。
tokenization方法分为三类:词粒度、字粒度、子词粒度(subword)。
词粒度问题:
1、超大规模词典,比如中文的常用词可以达到20W个
2、OOV问题
3、词典存在大量相似词,如如由"look"衍生出的"looks", "looking", "looked",意思相近但会被当作不同的词处理,训练冗余,大词汇量。
字粒度问题:
1、失去语义信息;
2、模型输入过长,收敛困难
子词力度方法:目前有三种主流的Subword算法,它们分别是:Byte Pair Encoding (BPE), WordPiece和Unigram Language Model。
BPE (GPT)
简单有效,是主流的方法。GPT-2和RoBERTa使用的Subword算法都是BPE。
BPE获得Subword的步骤如下:
- 准备足够大的训练语料,并确定期望的Subword词表大小;
- 将单词拆分为成最小单元。比如英文中26个字母加上各种符号,这些作为初始词表;
- 在语料上统计单词内相邻单元对的频数,选取频数最高的单元对合并成新的Subword单元;
- 重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1。
BPE是统计词对的频数,每次挑选频数最大的那个作为word unit。
详细例子及过程见:NLP-Tokenizer-BPE算法原理及代码实现 - 知乎 (zhihu.com)
WordPiece (Bert)
Google的Bert模型在分词的时候使用的是WordPiece算法。与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。
与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。
- 先构建一个基础的char级别的vocabulary
- 然后利用语言模型计算句子似然概率值
- 合并词后的得到一个词库中没有的新词,然后重新计算句子的似然概率值,
- 回到第2步,直到vocabulary size已经达到了之前设定的值或者似然概率值的增长小于设定的thresold
参考:
NLP-Tokenizer-BPE算法原理及代码实现 - 知乎 (zhihu.com)NLP三大Subword模型详解:BPE、WordPiece、ULM - 知乎 (zhihu.com)LLM大语言模型之Tokenization分词方法(WordPiece,Byte-Pair Encoding (BPE),Byte-level BPE(BBPE)原理及其代码实现) - 知乎 (zhihu.com)