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)
相关推荐
xiaojimao111 分钟前
Django在服务端的部署(无废话)
后端·python·django
电鱼智能的电小鱼11 分钟前
基于电鱼 ARM 工控机的井下设备运行状态监测方案——实时采集电机、电泵、皮带机等关键设备运行数据
arm开发·人工智能·嵌入式硬件·深度学习·机器学习·制造
慧星云13 分钟前
魔多 AI 支持 Seedance 系列在线生成 :赠送免费生成额度
人工智能
xiao5kou4chang6kai418 分钟前
如何通过机器学习(如K-means、SVM、决策树)与深度学习(如CNN、LSTM)模型,进行全球气候变化驱动因素的数据分析与趋势预测
深度学习·机器学习·kmeans·生态环境监测·全球气候变化
诸葛务农22 分钟前
光刻胶性能核心参数:迪尔参数(A、B、C)
人工智能·材料工程
大千AI助手25 分钟前
Householder变换:线性代数中的镜像反射器
人工智能·线性代数·算法·决策树·机器学习·qr分解·householder算法
world-wide-wait33 分钟前
机器学习03——matplotlib
python·机器学习·matplotlib
许泽宇的技术分享34 分钟前
当 AI Agent 遇上 MCP:微软 Agent Framework 的“瑞士军刀“式扩展之道
人工智能·microsoft
沉迷单车的追风少年36 分钟前
Diffusion Model与视频超分(2):解读字节开源视频增强模型SeedVR2
人工智能·深度学习·aigc·音视频·强化学习·视频生成·视频超分
Victory_orsh1 小时前
“自然搞懂”深度学习系列(基于Pytorch架构)——03渐入佳境
人工智能·pytorch·深度学习