Bert WordpieceTokenizer

Bert WordpieceTokenizer字符片段的分词。个人理解分出vocab中的更小片段,分词思想从字符后往前遍历字符段与vocab进行匹配,匹配到则保留,然后检索字符片段剩下的片段。
def tokenize(text):
    unk_token='<unk>'
    vocab=["un", "##aff", "##able"]
    output_tokens = []
    for token in [text]:
        chars = list(token)
        n_chars = len(chars)
        if n_chars > 300:
            output_tokens.append(unk_token)
            continue

        is_bad = False
        start = 0
        sub_tokens = []
        while start < n_chars:
            end =  n_chars
            cur_substr = None
            while start < end:
                substr = "".join(chars[start:end])
                if start > 0:
                    # Now it's a subword
                    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


print(tokenize('unaffable'))

#输出 ["un", "##aff", "##able"]

源码来自于guonnlp/data/fast_bert_tokenizer.pyx

cdef class WordpieceTokenizer:
    """Runs WordPiece tokenziation."""
    
    cdef public vocab
    cdef public str unk_token
    cdef public long max_input_chars_per_word
    
    def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=200):
        self.vocab = vocab
        self.unk_token = unk_token
        self.max_input_chars_per_word = max_input_chars_per_word
    
    def tokenize(self, text) -> List[str]:
        """Tokenizes a piece of text into its word pieces.
    
        This uses a greedy longest-match-first algorithm to perform tokenization
        using the given vocabulary.
    
        For example:
          input = "unaffable"
          output = ["un", "##aff", "##able"]
    
        :param text: A single token or whitespace separated tokens. This should have
            already been passed through `BasicTokenizer.
        :returns: A list of wordpiece tokens.
        """
        cdef long max_input_chars_per_word = self.max_input_chars_per_word
        cdef:
            bint is_bad
            long start
            long end
            Py_ssize_t n_chars
        
        output_tokens = []
        for token in whitespace_tokenize(text):
            chars = list(token)
            n_chars = len(chars)
            if n_chars > max_input_chars_per_word:
                output_tokens.append(self.unk_token)
                continue
            
            is_bad = False
            start = 0
            sub_tokens = []
            while start < n_chars:
                end =  n_chars
                cur_substr = None
                while start < end:
                    substr = "".join(chars[start:end])
                    if start > 0:
                        # Now it's a subword
                        substr = "##" + substr
                    if substr in self.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(self.unk_token)
            else:
                output_tokens.extend(sub_tokens)
        return output_tokens

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值