实战Transformers-【基础知识与环境安装】Day 3
基础组件之Tokenizer
Tokenizer简介
数据预处理
Step1 分词:使用分词器对文本数据进行分词(字、字词);
Step2 构建词典:根据数据集分词的结果,构建词典映射(这一步并不绝对,如果采用预训练词向量,词典映射要根据词向量文件进行处理);
Step3 数据转换:根据构建好的词典,将分词处理后的数据做映射,将文本序列转换为数字序列;
Step4 数据填充与截断:在以batch输入到模型的方式中,需要对过短的数据进行填充,过长的数据进行截断保证数据长度符合模型能接受的范围,同时batch内的数据维度大小一致。
现在:Tokenizer is all you need!
Tokenizer基本使用方法
- 加载保存(from pretrained /save pretrained)
- 句子分词 (tokenize)
- 查看词典 (vocab)
- 索引转换 (convert tokens to ids/convert ids to tokens)
- 填充截断 (padding /truncation)
- 其他输入(attention mask /token type ids)
进入代码部分,这里我们照常导入包,这个AutoTokenizer可以根据后续的参数来自动设定Tokenizer,我们加载的模型被保存在了C盘的用户里.cache文件夹里边的huggingface可以看到,在snapshots里是所有下载的文件了,我们也可以手动下载保存
# tokenizer 保存到本地
tokenizer.save_pretrained("./roberta_tokenizer")
就保存在了当前目录文件夹里,后面的from_pretrained就可以直接加载本地的,效果是一样的
# 从本地加载tokenizer
tokenizer = AutoTokenizer.from_pretrained("./roberta_tokenizer/")
tokenizer
分词
tokens = tokenizer.tokenize(sen)
tokens
···['弱', '小', '的', '我', '也', '有', '大', '梦', '想', '!']
查看词典
tokenizer.vocab
索引转换
# 将词序列转换为id序列
ids = tokenizer.convert_tokens_to_ids(tokens)
ids
# 将id序列转换为token序列
tokens = tokenizer.convert_ids_to_tokens(ids)
tokens
# 将token序列转换为string
str_sen = tokenizer.convert_tokens_to_string(tokens)
str_sen
更简洁的方式——encode
# 将字符串转换为id序列,又称之为编码
ids = tokenizer.encode(sen, add_special_tokens=True)
ids
# 将id序列转换为字符串,又称之为解码
str_sen = tokenizer.decode(ids, skip_special_tokens=False)
str_sen
这里使用bert分词器所以输出有两个标记[CLS]和[SEP]
填充与截断
# 填充
ids = tokenizer.encode(sen, padding="max_length", max_length=15)
ids
# 截断
ids = tokenizer.encode(sen, max_length=5, truncation=True)
ids
进入像transformers模型的时候有一些特殊的注意事项,比如告诉模型哪些是填充,哪些是真实的输入,这个时候我们需要一个attention mask,另外对于bert模型还需要一个token type id,即区别句子顺序,这里可以进行快速调用
inputs = tokenizer.encode_plus(sen, padding="max_length", max_length=15)
inputs
inputs = tokenizer(sen, padding="max_length", max_length=15)
inputs
处理batch数据
sens = ["弱小的我也有大梦想",
"有梦想谁都了不起",
"追逐梦想的心,比梦想本身,更可贵"]
res = tokenizer(sens)
res
注意一点是如果只需要tokenizer的话使用batch速度会非常快
总的来说就是我们只需要把数据准备好然后去调用这个tokenizer,就可以正常的来做这些所有的数据与处理了
Fast/Slow Tokenizer
- FastTokenizer
基于Rust实现,速度快
offsets mapping、word ids - SlowTokenizer
基于Python实现,速度慢
处理数据的时候如果发现它非常慢就需要考虑它是否支持fast了
学习视频地址:【手把手带你实战HuggingFace Transformers-入门篇】基础组件之Tokenizer
项目地址:github