bert第三篇:tokenizer

本文深入探讨BERT中的tokenizer,包括BasicTokenizer、WordpieceTokenizer和FullTokenizer的作用,强调WordPiece分词概念及其优点。文章还介绍了如何训练自定义的tokenizer,并讨论了BPE算法在解决词汇表外(OOV)问题上的作用。作者建议结合实践理解tokenizer的本质,以实现更高效的信息表示。
摘要由CSDN通过智能技术生成

tokenizer基本含义

tokenizer就是分词器; 只不过在bert里和我们理解的中文分词不太一样,主要不是分词方法的问题,bert里基本都是最大匹配方法。

最大的不同在于“词”的理解和定义。 比如:中文基本是字为单位。
英文则是subword的概念,例如将"unwanted"分解成[“un”, “##want”, “##ed”] 请仔细理解这个做法的优点。
这是tokenizer的一个要义。

bert里涉及的tokenizer

BasicTokenzer

主要的类是BasicTokenizer,做一些基础的大小写、unicode转换、标点符号分割、小写转换、中文字符分割、去除重音符号等操作,最后返回的是关于词的数组(中文是字的数组)

 def tokenize(self, text):
    """Tokenizes a piece of text."""
    text = convert_to_unicode(text)
    text = self._clean_text(text)

    # This was added on November 1st, 2018 for the multilingual and Chinese
    # models. This is also applied to the English models now, but it doesn't
    # matter since the English models were not trained on any Chinese data
    # and generally don't have any Chinese data in them (there are Chinese
    # characters in the vocabulary because Wikipedia does have some Chinese
    # words in the English Wikipedia.).
    text = self._tokenize_chinese_chars(text)

    orig_tokens = whitespace_tokenize(text)
    split_tokens = []
    for token in orig_tokens:
      if self.do_lower_case:
        token = token.lower()
        token = self._run_strip_accents(token)
      split_tokens.extend(self._run_split_on_punc(token))

    output_tokens = whitespace_tokenize(" ".join(split_tokens))
    return output_tokens

BasicTokenzer是预处理。

wordpiecetokenizer

另外一个则是关键wordpiecetokenizer,就是基于vocab切词。

  def tokenize(self, text):
    """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"]

    Args:
      text: A single token or whitespace separated tokens. This should have
        already been passed through `BasicTokenizer.

    Returns:
      A list of wordpiece tokens.
    """

    text = convert_to_unicode(text)

    output_tokens = []
    for token in whitespace_tokenize(text):
      chars = list(token)
      if len(chars) > self.max_input_chars_per_word:
        output_tokens.append(self.unk_token)
        continue

      is_bad = False
      start = 0
      sub_tokens = []
      while start < len(chars):
        end = len(chars)
        cur_substr = None

        #找个单词,找不到end向前滑动;还是看代码实在!!!
        while start < end:
          substr = "".join(chars[start:end])
          if start > 0:
            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

FullTokenzier

这个基本上就是利用basic和wordpiece来切分。用于bert训练的预处理。基本就一个tokenize方法。不会有encode_plus等方法。

PretrainTokenizer

这个则是bert的base类,定义了很多方法(convert_ids_to_tokens)等。 后续的BertTokenzier,GPT2Tokenizer都继承自pretrainTOkenizer,下面的关系图可以看到这个全貌。

关系图

在这里插入图片描述

实操

from transformers.tokenization_bert 
作为AI语言模型的代表之一,BERT(Bidirectional Encoder Representations from Transformers)已经被广泛应用于自然语言处理任务。在本文中,我们将介绍如何使用PyTorch实现BERT模型。 1. 安装依赖库 首先,我们需要安装PyTorch和Transformers库。可以使用以下命令进行安装: ``` pip install torch transformers ``` 2. 加载BERT模型 使用Transformers库可以方便地加载预训练的BERT模型。我们可以使用以下代码加载BERT模型和tokenizer: ```python from transformers import BertModel, BertTokenizer # 加载BERT模型和tokenizer model = BertModel.from_pretrained('bert-base-uncased') tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') ``` 3. 输入处理 在使用BERT模型之前,我们需要将输入转换为模型接受的格式。BERT模型接受的输入是一组token,也就是文本被分割后的单词或子词。在输入的每个token前面,我们需要加上一个特殊的[CLS]标记作为整个序列的开始,并在句子的结尾加上一个特殊的[SEP]标记。 以下是将输入文本转换为BERT模型可以接受的格式的代码: ```python text = "I love PyTorch!" encoded_input = tokenizer.encode_plus(text, add_special_tokens=True, return_tensors='pt') ``` 在上面的代码中,我们使用了tokenizer.encode_plus()方法将文本编码为BERT模型可以接受的格式。参数add_special_tokens=True指示tokenizer在文本的开头和结尾添加特殊的[CLS]和[SEP]标记。return_tensors='pt'参数指示tokenizer返回PyTorch张量。 4. 输入到模型中 现在,我们可以将编码后的输入张量传递给BERT模型进行预测。输出是最后一个隐藏层的状态,我们可以使用它来进行下游任务,例如文本分类或序列标注。 以下是将输入传递给BERT模型的代码: ```python output = model(**encoded_input) ``` 在上面的代码中,我们使用了model()方法将输入张量传递给BERT模型。我们使用**encoded_input参数来解包编码后的输入张量。模型返回的是一个元组,其中第一个元素是最后一个隐藏层的状态,第二个元素是整个序列的池化表示。 5. 结果解码 最后,我们可以使用输出来预测下游任务。如果我们只是想获取BERT模型的最后一个隐藏层的状态,我们可以使用以下代码: ```python last_hidden_state = output[0] ``` 如果我们想获取整个序列的池化表示,我们可以使用以下代码: ```python pooled_output = output[1] ``` 如果我们想获取每个token的表示,我们可以使用以下代码: ```python all_hidden_states = output[2] token_embeddings = all_hidden_states[-1] ``` 在上面的代码中,我们使用了output[2]来获取所有隐藏层的状态,然后选择最后一个隐藏层的状态作为每个token的表示。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值