tokenizer、tokenizer.encode、tokenizer.encode_plus比较

一、概念

在我们使用Transformers库进行自然语言处理任务建模的过程中,基本离不开Tokenizer类。我们需要这些Tokenizer类来帮助我们加载预训练模型的分词模块,并将文本转化为预训练模型可接受的输入格式。

而在实际建模的实践中,我们参考优秀的开源代码,时常会见到对Tokenizer类的不同应用方式和场景,例如实例化某个Tokenizer类并调用.tokenize()方法,又或者调用.encode()方法、.encode_plus()方法。这里,我们对这些方法的具体应用场景进行说明。

二、比较

Transformers中几乎所有的Tokenizer类都继承了同一个超类,即PreTrainedTokenizer。下面我们以BertTokenizer为例,对以下四个通用的类方法的作用分别进行讲解。

1、tokenizer(input_texts)/tokenizer.encode_plus(input_texts)

对于输入文本,我们可以直接使用tokenizer(input_texts, padding=True, truncation=True, return_tensors="pt")或者tokenizer.encode_plus(input_texts, padding=True, truncation=True, return_tensors="pt")对文本进行编码,二者几乎等价。该方法返回一个字典,分别包含"input_ids"、"token_type_ids"和"attention_mask"三个键以及对应的取值。我们可以设置return_tensors='pt'来让这些值都是tensor类型,便于输入AutoModel中。

参数方面,我们需要关注的主要参数如下:

  • padding:设置为True或者longest则填充到批次中的最长序列(如果只提供单个序列,则不进行填充);设置为max_length则填充到用参数max_length指定的最大长度,或者如果未提供该参数,则填充到模型可接受的最大输入长度;设置为False或者do_not_pad则不进行填充(即可以输出一个包含不同长度序列的批次),默认为此设置。
  • truncation:设置为True或longest_first则截断到用参数max_length指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度;设置为False或do_not_truncate(默认值)则不截断。
  • max_length:如果未设置或设置为None,在截断/填充参数需要最大长度时,将使用预定义的模型最大长度。
  • return_tensors:默认None,如果设置了该值,将返回张量而不是Python整数列表。可接受的值有"tf"(返回 TensorFlow 的 tf.constant 对象)、"pt"(返回 PyTorch 的 torch.Tensor 对象)、"np"(返回 Numpy 的 np.ndarray 对象)。
python 复制代码
from transformers import BertTokenizer


text = 'we are learning python, which is one of the most popular programming languages in the world.'
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
outputs = tokenizer(text, padding=True, truncation=True, return_tensors="pt")
# outputs = tokenizer.encode_plus(text, padding=True, truncation=True, return_tensors="pt")
for key in outputs.keys():
    print(key, outputs[key])

2、tokenizer.tokenize(input_texts)

tokenizer.tokenize(input_texts)仅对输入的文本进行分词 ,返回的是列表类型,包含的对每个输入句子的Word Piece级分词结果。

python 复制代码
from transformers import BertTokenizer


text = 'we are learning python, which is one of the most popular programming languages in the world.'
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
outputs = tokenizer.tokenize(text)
print(outputs)

这里再重温一下Word Piece分词。预训练模型的词典固然庞大,但是我们无法无限扩大词典的规模,这样很低效。而且,很多单词的词根是相同的,这意味着我们通过使用几个词根的组合,就可以表示多个单词从而提高存储效率,这就有了Word Piece分词。

举一个简单的例子,假设有单词"try"、"trying"、"learn"、"learning",如果全部存储原词则需要存储4个词,而如果我们把"ing"拆出来,我们会发现只需要存储3个Token(即"learn"、"try"和"#ing"),且通过这三个Token的组合可以完美表示上面的所有单词,这就节省了25%的存储空间!当然,不同的预训练模型Word Piece词典的结构各有不同,例如这里bert-base-cased模型对于"learning"就是原词存储的。

3、tokenizer.encode(input_texts)

tokenizer.encode(input_texts, padding=True, truncation=True, return_tensors="pt")方法综合了分词+索引编码两个方法(tokenize()+convert_tokens_to_ids()),先对文本进行分词,然后匹配对应的词索引,返回Token索引列表。对于该索引列表,返回结果中默认包含开头的[CLS]索引和结尾的[SEP]索引。

python 复制代码
from transformers import BertTokenizer


text = 'we are learning python, which is one of the most popular programming languages in the world.'
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
outputs = tokenizer.encode(text, padding=True, truncation=True, return_tensors="pt")
print(outputs)

有encode自然有decode,tokenizer.decode可以将编码后的索引列表转换回分词列表 ,使用tokenizer.decode(input_ids, skip_special_tokens=False)即可,需要注意的是decode的输入类型为list而不是tensor,所以在encode的时候不设置return_tensors参数。此外,如果我们将skip_special_tokens参数设置为False默认会返回[CLS]和[SEP]两个特殊Token标记,这是Bert类模型的输入格式要求,设置为True则返回不带特殊Token的原始文本(不是Word Piece)

python 复制代码
from transformers import BertTokenizer


text = 'we are learning python, which is one of the most popular programming languages in the world.'
tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
outputs = tokenizer.encode(text, padding=True, truncation=True)
print('Encode:', outputs)
outputs = tokenizer.decode(outputs, skip_special_tokens=False)
print('Decode:', outputs)
相关推荐
weixin_437497771 天前
读书笔记:Context Engineering 2.0 (上)
人工智能·nlp
cnxy1881 天前
围棋对弈Python程序开发完整指南:步骤1 - 棋盘基础框架搭建
开发语言·python
喝拿铁写前端1 天前
前端开发者使用 AI 的能力层级——从表面使用到工程化能力的真正分水岭
前端·人工智能·程序员
goodfat1 天前
Win11如何关闭自动更新 Win11暂停系统更新的设置方法【教程】
人工智能·禁止windows更新·win11优化工具
北京领雁科技1 天前
领雁科技反洗钱案例白皮书暨人工智能在反洗钱系统中的深度应用
人工智能·科技·安全
落叶,听雪1 天前
河南建站系统哪个好
大数据·人工智能·python
清月电子1 天前
杰理AC109N系列AC1082 AC1074 AC1090 芯片停产替代及资料说明
人工智能·单片机·嵌入式硬件·物联网
Dev7z1 天前
非线性MPC在自动驾驶路径跟踪与避障控制中的应用及Matlab实现
人工智能·matlab·自动驾驶
七月shi人1 天前
AI浪潮下,前端路在何方
前端·人工智能·ai编程
橙汁味的风1 天前
1隐马尔科夫模型HMM与条件随机场CRF
人工智能·深度学习·机器学习