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)
相关推荐
2601_954971132 小时前
软件工程转数据分析:现实路径与适合人群深度解析
深度学习
清酒难寻8 小时前
深度学习进阶(二十四)Swin 的二维 RPE
人工智能·深度学习
步步为营DotNet8 小时前
借助 Microsoft.Extensions.AI 与 ASP.NET Core 10 实现智能 Web 应用故障预测
人工智能·microsoft·asp.net
AI创界者8 小时前
零基础上手!ComfyUI + LTX-2.3 图生视频完整工作流搭建与调优指南(附避坑细节)
大数据·人工智能
充钱大佬8 小时前
Python测试基础教程
python·log4j·apache
怕浪猫8 小时前
AI图片工具到底有哪些?一份按能力维度整理的清单
人工智能
hongmai6668889 小时前
FH8856V310芯片详解:6M高清+0.5TOPS算力,赋能智能安防新方案
人工智能·单片机·嵌入式硬件·物联网·智能家居
一颗小树x9 小时前
NVIDIA Jetson Thor 运行 LLM / VLM:模型全整理与 vLLM 实践
人工智能·llm·jetson·vllm
每日综合9 小时前
蓝白风暴席卷BW2026!雷克沙展台首日燃情纪实
人工智能
To_OC9 小时前
手搓 LangChain 工具调用:原来 Agent 的核心逻辑,就是个 while 循环
人工智能·langchain·llm