分词方法主要有词级word level, 字节级byte level和子词级 subword level三类?
首先把句子string里的每一个字符char转换成对应的unicode,常用的编码方式有utf-8,utf-16等,这里最通用的是utf-8, 因为其他编码方式有比较多的0。
词级可以保留完整语义,但是词表过大,对罕见词学习不好,难以解决oov问题
字符级能编码的范围广,但是词表小,语义破碎,输入token数量过多
subword属于折中方案。典型的方法是bpe (byte pair encoding)。是将word转换成字节级表示后,按相邻字节组共现频率排序,将出现频率最高的字符对加入进编码。注意该步骤可以递归进行,也就是字符对可以继续合并,组成频率更高的字符对。编码直到词表数量扩充到对应的量级为止。这里的字符对不会涉及到不在同一个word里的跨词编码。所以基本不会有歧义出现。但是,会出现语料的不同导致bpe编码方式不同的问题:例如hello, 可能会拆成hell+o,或者he+llo 如果hello/he出现的频率太高的话。一般这种可以增加多种语料来源,增加编码的健壮性。
bbpe则可能出现跨词汇的ngram组合,这里就可能产生歧义。bpe的字符边界?因为统计共现频率都是在word级别的unicode表示里统计,所以不会跨词;但是bbpe还加了一个ngrams,这里就跨词了。因为一些非英语语言的特殊性,subword可能也有含义,这就造成了歧义。(类似汉字的偏旁)