1 概述
Tokenizer
Tokenizer在自然语言处理(NLP)中是一个关键组件,它负责将文本字符串转换成模型可以处理的结构化数据形式,通常是将文本切分成“tokens”或单词、短语、子词等单位。这些tokens是模型理解文本的基础。Tokenizer的类型和复杂性可以根据任务需求而变化,从简单的基于空格的分割到更复杂的基于规则或机器学习的分词方法。
在使用预训练模型处理文本之前,我们需要将文本转换为模型可以理解的格式。这就需要使用tokenizer对文本进行分词、编码等操作。transformers库为每种预训练模型提供了相应的tokenizer类,使用方法非常简单。
Tokenizer的工作流程通常包括两个关键步骤:
- 文本分解:将原始文本分割成更细的粒度单元,这些单元可以是单词级别、子词级别,甚至是字符级别。这一步的目标是将文本分解为可以被模型理解并处理的基本单元。
- 编码映射:将这些基本单元转换为模型可以理解的数值形式,最常见的形式是整数序列。这样,我们就可以将这些数值输入到模型中,让模型进行学习和预测。
Auto Tokenizer
Auto Tokenizer是Hugging Face transformers库中的一个非常实用的类,它属于自动工厂模式的一部分。这个设计允许开发者通过一个统一的接口来加载任何预训练模型对应的分词器(tokenizer),而无需直接指定分词器的精确类型。这意味着,当你知道模型的名称时,你可以使用Auto Tokenizer自动获取与该模型匹配的分词器,而不需要了解分词器的具体实现细节。
Auto Tokenize的特点
1、模型兼容性:通过模型名称自动匹配合适的分词器,支持BERT,RoBERTa、Albert、DistilBERT、T5等众多模型。
2、便捷性:简化了代码,无需根据模型类型手动选择分词器类。
3、灵活性:对于新发布的模型,只要其分词器在Hugging Face模型库中可用,AutoTokenizer.from_pretrained就能加载。
2 主要功能
1、分词:将句子拆分为单词或字词。例如,中文分词器会将“自然语言处理”拆分成“自然”、“语言”、“处理”,而英文Tokenizer可能使用Subword Tokenization如Byte-Pair Encoding (BPE)来处理罕见词。
2、添加特殊标记:在序列的开始和结束添加特殊标记,如BERT中的[CLS]和[SEP],用于特定任务的序列分类或区分输入片段。
3、编码:将tokens转换为数字ID,这些ID是模型的输入。每个token在词汇表中有一个唯一的ID。
什么是token呢?很多人不是很清楚token是什么,其实就是分词后的一个词,比如“自然语言处理”会拆分为“自然”、“语言”、“处理”,其中“自然”就是一个token。
4、处理填充和截断:为了确保输入序列的一致长度,Tokenizer可以对较短的序列进行填充,对较长的序列进行截断。
5、生成Attention Mask:在某些模型中,Tokenizer还会生成一个Attention Mask,指示哪些输入位置是实际的tokens(通常标记为1),哪些是填充的(标记为0)。
3、使用
1、句子分词
tokenizer.tokenize(text)
text = '三个和尚在打架'
tokenizer_text = tokenizer.tokenize(text)
print('tokenized_text:', tokenizer_text)
# tokenized_text: ['三', '个', '和', '尚', '在', '打', '架']
2、将词序列转换为ID序列
tokenizer.convert_tokens_to_ids()
text = '三个和尚在打架'
tokenizer_text = tokenizer.tokenize(text)
indexed_tokens1 = tokenizer.convert_tokens_to_ids(tokenizer_text)
print('tokenized_text:', tokenizer_text)
print('indexed_tokens1:', indexed_tokens1)
# tokenized_text: ['三', '个', '和', '尚', '在', '打', '架']
# indexed_tokens1: [676, 702, 1469, 2213, 1762, 2802, 3373]
3、将ID序列转换为词序列
convert_ids_to_tokens()
text = '三个和尚在打架'
tokenizer_text = tokenizer.tokenize(text)
indexed_tokens1 = tokenizer.convert_tokens_to_ids(tokenizer_text)
id_to_tokens = tokenizer.convert_ids_to_tokens(indexed_tokens1)
print('indexed_tokens1:', indexed_tokens1)
print("id_to_tokens:", id_to_tokens)
# indexed_tokens1: [676, 702, 1469, 2213, 1762, 2802, 3373]
# id_to_tokens: ['三', '个', '和', '尚', '在', '打', '架']
4、整合操作
编码:将句子或字符串转换为id序列, tokerizer.encode()、tokenizer.encode_plus()
如果你只需要获取文本的ID表示,并且你的模型不需要额外的信息(如注意力掩码或token类型ID),那么你可以使用encode()
方法。
如果你需要更全面的编码信息,包括注意力掩码和/或token类型ID,那么你应该使用encode_plus()
方法。这通常是大多数现代NLP模型所必需的。
解码:将id序列转换为句子或字符串, tokerizer.decode()
5、快速调用方式
tokerizer()
4、两者区别
tokenizer = AutoTokenizer.from_pretrained('./bert_base_chinese')
tokenizer1 = BertTokenizer.from_pretrained('./bert_base_chinese')
tokenizer = AutoTokenizer.from_pretrained('a') tokenizer1 = BertTokenizer.from_pretrained('a')
使用AutoTokenizer时,a代表的模型名称可以是任意的,AutoTokenizer可以根据模型名称自动匹配与之对于的分词器。这意味着,当知道模型的名称时,可以使用AutoTokenizer自动获取与该模型匹配的分词器。
使用BertTokenizer或其他指定的Tokenizer,a代表的模型名称只能是与分词器匹配的模型名称。
5、参数说明
- from_pretrained: 这不是一个方法,而是用来创建AutoTokenizer实例的类方法。它根据提供的模型名称或路径加载对应的分词器。
- tokenize: 将文本字符串转换为词元(tokens)的列表。
- encode: 将文本转换为模型输入的数字序列(token IDs)。
- encode_plus: 除了生成token IDs,还提供额外的数据结构,如attention_mask、token_type_ids等,适合复杂输入准备。以及提供句子编码拼接功能。
- batch_encode_plus: 对一批文本进行编码,可以自动处理填充和截断,以确保所有输入具有相同的长度。
- decode: 将token IDs转换回文本字符串。
- save_pretrained: 保存分词器到本地目录,以便之后使用。
- 特定于模型的方法: 不同的分词器可能有特定的方法,如处理特定的编码规则、特殊标记等,但这些不是所有分词器都通用的。
这些方法的具体行为和可用参数可能会根据加载的分词器类型(如BertTokenizer、RobertaTokenizer等)有所不同。