type
status
password
date
slug
summary
category
URL
tags
icon
本篇文章以
Transformers
中使用的AutoTokenizer
为例说明其用法。但如果实际场景中使用BERT、ALBERT等预训练模型,原理类似,但需要使用模型相对应的Tokenizer
,例如transformers.BertModel
对应的Tokenizer
是transformers.BertTokenizer
下载预训练tokenizer
要自动下载在特定模型在预训练或微调期间使用的vocab,可以使用from_pretrained()方法:
加载与保存
基本操作
查看分词
字典操作
token转索引
将文本转换为索引
参数说明
三个参数
padding
truncation
和max_length
将做进一步的介绍三个参数
padding
truncation
和max_length
将做进一步的介绍- padding用于填充。它的参数可以是布尔值或字符串,默认不填充:
参数 | 含义 |
True 或”longest” | 填充到最长序列(如果你仅提供单个序列,则不会填充) |
“max_length” | 用于指定你想要填充的最大长度,如果max_length=Flase,那么填充到模型能接受的最大长度(这样即使你只输入单个序列,那么也会被填充到指定长度) |
False 或“do_not_pad” | 不填充序列。如前所述,这是默认行为 |
2. truncation用于截断。它的参数可以是布尔值或字符串,默认不截断:
参数 | 含义 |
True 或
“only_first ”或
“only_second ” | 则将其截断为 max_length 参数指定的最大长度,如果未提供max_length = None ,则模型会截断为模型接受的最大长度。如果提供的是一对文本序列,则只会截断这一对中的第一个文本序列(因为参数“only_first ”),如果参数是“only_second ”,则只会截断这一对中的第二个文本序列; |
False 或“do_not_truncate ” | 不截断序列。如前所述,这是默认行为。 |
- max_length:与其他参数联用,表示句子的最大长度。
return_tensors="pt"
: 可取值tf,pt,np,默认为返回list
分词转索引
tokenizer还接受pre-tokenized(分词结果)的输入。在命名实体识别(NER)或词性标记(POS)中计算标签并提取预测时,此功能特别有用。如果要使用pre-tokenized的输入,则在将输入传递给tokenizer时只需设置is_split_into_words=True即可。例如:
请注意,除非传递add_special_tokens = False,否则tokenizer仍会添加特殊token的ID(如果适用)
注意:Pre-tokenized并不意味着输入已被tokenized(如果是这种情况,则无需将它们传递给tokenizer了),而只是拆分为多个单词(这通常是subword tokenization算法(如BPE)的第一步)。例如,在下面这个代码中,输入的token为5个,而实际上输入的token索引为9个,这说明了其内部仍需要进行tokenized。
索引转token
单句子索引转换
单样本
返回的是一个字典,里面的列表包含了int类别的数据。其中:
input_ids
是对应于文本序列中每个token的索引(在vocab中的索引);
attention_mask
是对应于注意力机制的计算,各元素的值为0或1。如果当前token参与注意力机制计算,其值为1;如果只是用来作为填充的元素,那么其不需要进行注意力机制的计算,其值为0;
token_type_ids
是对应于不同的文本序列,例如在NSP(BERT及某些语言模型中的“Next Sentence Prediction”)任务中需要输入两个文本序列。
special_tokens_mask
特殊符号的位置是1,其他位置是0
反向编码
上面解码的
[CLS]
字符就是大多数预训练语言模型会自动加入的特殊token。tokenizer会自动添加了模型期望的一些特殊token。但是并非所有模型都需要特殊token。例如,如果我们使用gpt2-medium来创建tokenizer,那么解码后的文本序列不会有特殊的token了。你可以通过传递add_special_tokens = False
来禁用加入特殊token(仅当你自己添加了这些特殊token时才建议这样做)。批量样本
如果要处理多个文本序列,则可以通过将它们作为列表输入到tokenizer:
padding填充与截断
当然了,在神经网络中,我们常常是通过一个batch的形式来作为一次输入,这个时候你可能想要:
- 如果必要,将每个文本序列填充到最大的长度;
padding=True
- 如果必要,将每个文本序列截断到模型可以接受的最大长度;
truncation=True
- 返回张量。
return_tensors="pt"
在输出中可以看到,如果是填充的元素,其attention_mask中对应的位置即为0。
文本序列对索引转换
单样本
有时你需要为模型提供一对文本。例如,如果你要分类成对的两个句子是否相似,或者是在阅读理解的问题中,需要同时输入上下文和问题。对于BERT模型,输入表示如下:
[CLS] 序列A [SEP] 序列B [SEP]
。可以看到这里面token_type_ids的值就是上面所解释的那样。
token_type_ids
是对应于不同的文本序列,例如在NSP(BERT及某些语言模型中的“Next Sentence Prediction”)任务中需要输入两个文本序列。
反向编码
同样地,如果我们对获得的token ID进行解码,则会看到已正确文本序列对:
批量样本
如果要处理的是文本序列对列表,则应将它们作为两个列表提供给tokenizer:第一个所有文本序列的列表和第二个所有文本序列的列表:
反向编码
当然你仍然可以反向解码: