🚈huggingface中的Tokenizer详解
2023-2-1
| 2024-6-5
0  |  阅读时长 0 分钟
type
status
password
date
slug
summary
category
URL
tags
icon
篇文章以Transformers中使用的AutoTokenizer为例说明其用法。但如果实际场景中使用BERT、ALBERT等预训练模型,原理类似,但需要使用模型相对应的Tokenizer,例如transformers.BertModel对应的Tokenizertransformers.BertTokenizer

下载预训练tokenizer

要自动下载在特定模型在预训练或微调期间使用的vocab,可以使用from_pretrained()方法:

加载与保存

基本操作

查看分词

字典操作

token转索引

将文本转换为索引

参数说明

三个参数paddingtruncationmax_length将做进一步的介绍
三个参数paddingtruncationmax_length将做进一步的介绍
  1. padding用于填充。它的参数可以是布尔值或字符串,默认不填充:
    1. 参数
      含义
      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
不截断序列。如前所述,这是默认行为。
  1. max_length:与其他参数联用,表示句子的最大长度。
  1. 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:第一个所有文本序列的列表和第二个所有文本序列的列表:

反向编码

当然你仍然可以反向解码:
 
  • NLP
  • huggingface
  • 基于Transformers库的BERT模型分类任务huggingface的datasets库使用
    Loading...
    目录