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)
相关推荐
Data-Miner2 小时前
面对 AI 大模型智能涌现,如何从技术层面保护好隐私与数据安全?
大数据·人工智能
hpoenixf3 小时前
当 AI 开始谈“买什么”,研究助手离投顾和交易还有多远?
人工智能
大模型真好玩3 小时前
如何让视频模型对你言听计从?结构化提示词助你生成电影级画面
人工智能·agent·deepseek
zhang133830890753 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
特立独行的猫a3 小时前
会说确认叫车才下单-启元机器人官方滴滴打车技能源码详解
人工智能·机器人·技能·启元机器人
老金带你玩AI3 小时前
GPT-6.1 Terra上线:更便宜了,干活到底怎么样?
人工智能
会议咨询4 小时前
2027年电力电子、人工智能与大数据国际会议(PEABD 2027)
大数据·人工智能·电力电子
wangchunyu1144 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
Jsundoku4 小时前
第五章 深度学习 -- 卷积神经网络
人工智能·深度学习·cnn
水如烟4 小时前
孤能子视角:SEP《人工智能的认识论》EIS读法·理解——理解幻觉与解压缩幻觉:同一缺口,两份报告
人工智能