WordPiece、BPE
BERT在数据预处理时使用了WordPiece。WordPiece字面理解是把word拆成piece一片一片,其实就是这个意思。
WordPiece的一种主要的实现方式叫做BPE(Byte-Pair Encoding)双字节编码。
BPE的过程可以理解为把一个单词再拆分,使得我们的词表变得精简,并且寓意更加清晰。
比如"loved","loving","loves"这三个单词。其实本身的语义都是“爱”的意思,但是如果我们以单词为单位,那它们就算不一样的词,在英语中不同后缀的词非常的多,就会使得词表变的很大,训练速度变慢,训练的效果也不是太好。
BPE算法通过训练,能够把上面的3个单词拆分成"lov","ed","ing","es"几部分,这样可以把词的本身的意思和时态分开,有效的减少了词表的数量。
通过BPE训练得到vocab词表后,使用最长前缀匹配算法,将token进行编码,BERT中WordpieceTokenizer的实现:
vocab = ['abc', '##de', '##fg', 'xx'] unk_token = '<unk>' def wordpiece(text): output_tokens = [] for token in text.split(): chars = list(token) is_bad = False start = 0 sub_tokens = [] while start < len(chars): end = len(chars) cur_substr = None while start < end: substr = "".join(chars[start:end]) if start > 0: substr = '##' + substr if substr in vocab: cur_substr = substr break end -= 1 if cur_substr is None: is_bad = True break sub_tokens.append(cur_substr) start = end if is_bad: output_tokens.append(unk_token) else: output_tokens.extend(sub_tokens) return output_tokens if __name__ == '__main__': text = 'abcdefg xx cde' print (wordpiece(text))
参考:
BPE训练 https://blog.csdn.net/you_jinpeng/article/details/107982697

浙公网安备 33010602011771号