Fork me on GitHub

实战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

posted @ 2023-11-12 17:47  会自愈的哈士奇  阅读(93)  评论(0编辑  收藏  举报