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默认会返回CLSSEP两个特殊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)
相关推荐
智信中科张炜10 小时前
全球及中国二板注塑机市场前景形势分析报告
人工智能
升鲜宝供应链及收银系统源代码服务10 小时前
升鲜宝 AI 供应链分析方案业务分析、智能预警与实施落地方案(一)---升鲜宝生鲜配送供应链管理系统源代码服务
人工智能·生鲜供应链源代码·供应链源代码出售·生鲜配送源代码服务·猪肉生产加工系统源代码·生鲜供应链系统·生鲜配送系统ai应用
2401_8734794010 小时前
如何用IP离线库批量清洗订单IP,自动标注省市区?
开发语言·网络·python
py小王子10 小时前
期刊复现 | Python实现扇形小提琴图
python·期刊图片复现
编程牛马姐10 小时前
爬虫开发工具测评:Playwright vs Puppeteer
人工智能
andafaAPS10 小时前
安达发|aps高级排产:电动工具行业智能制造的核心引擎
大数据·人工智能·制造·安达发aps·aps高级排产·aps自动排产
大模型最新论文速读10 小时前
05-29 · LLM 最新论文速览
论文阅读·人工智能·深度学习·机器学习·自然语言处理
杀生丸学AI10 小时前
【三维重建】RT-Splatting:基于3DGS的联合反射-透射建模(CVPR 2026)
人工智能·深度学习·3d·三维重建·高斯泼溅·动态重建·镜面反射
STRUGGLE_xlf10 小时前
Codex × PPT Skill:一句话生成演示文稿
人工智能·powerpoint·智能体
人工智能AI技术10 小时前
深度拆解Opus 4.8:Dynamic Workflows重构AI开发模式
人工智能