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

 

posted @ 2021-04-11 17:42  AliceYing  阅读(484)  评论(0)    收藏  举报