Tokenizer

Tokenizer即分词器,主要任务是将文本输入转化为模型可以接受的输入,即数值索引。

不同的Tokenizer策略可以不同的结果,常用的策略有:word base(按照词进行分词),character base(按照单词进行分词),subword tokenization(按照subword进行分词)

Word-based

word base进行分词的话,有两种方式,一种是根据whitespace进行分割,一种是根据标点符号进行分割,然后再做数字的映射。
word based
每个 word 都被赋予一个ID,这个 ID 的范围是从0到 vocabulary size,这种方式有一种问题,就是很容易出现例如,dog 和 dogs,虽然是相近的词,但是被分配了完全不同的无关的id。对于不在vocabulary 库里面的词,我们会分配 [UNK],代表未知词。

Character base

Char base的 tokenization 方式,就是用char,而不是word。 这种方式的好处在于:vocabulary size 很小;比较少机会出现 out of vocabulary 的问题。但这种方式会导致文本无意义

Subword tokenization

subword tokenization 依赖的原则是:常见词不应该分成subword,不常见的词应该分为更有意义的subword,例如:tokenization 代表不常见的词,可以被分为:token和ization,annoyingly 被分为 annoying 和 ly,这对于英文来说是很有意义的,因为英文本来就是由于词根和词缀组成的。

WordPiece

在BERT中采用的分词策略为WordPiece。WordPiece是贪心的最长匹配搜索算法。基本流程:

  1. 首先初始化词表,词表包含了训练数据中出现的所有字符。
  2. 然后两两拼接字符,统计字符对加入词表后对语言模型的似然值的提升程度。
  3. 选择提升语言模型似然值最大的一组字符对加入词表中。

反复2和3,直到词表大小达到指定大小。

Byte-level BPE

GPT-2中采用的分词策略为Byte-level BPE,即以字节为单位进行BPE。

load与save

载入方法采用from_pretrained;保存方法采用save_pretrained

Encoding

将文本转化为数字的过程为编码,主要包含两个步骤:tokenization和convert_tokens_to_ids。

  1. tokenization通过tokenize方法实现
    tokenize

  2. convert_tokens_to_ids
    convert_tokens_to_ids

encode接口可以实现两者结合
encode

Decoding

将输出的 ids 转化为文本,这可以使用 tokenizer 的 decode 方法:

decode

convert_ids_to_tokens

convert_ids_to_tokens

Attention masks

Attention masks 和输入的 input ids 具有完全一样的shape,其中1 代表了这个id需要attention,0代表这个id不需要attention。

call

call

返回值

return

tokenize、encode、encode_plus和__call__

  • tokenize返回词列表,默认首尾不加 [CLS] [SEP];
  • encode返回词id列表,默认首尾加 [CLS] [SEP]对应的词id;
  • encode_plus相较于encode,会多返回token_type_ids和attention_mask。

参考

Transformers Tokenizer API 的使用