huggingface使用(一):AutoTokenizer(通用)、BertTokenizer(基于Bert)

2023-05-16

一、AutoTokenizer、BertTokenizer的区别

AutoTokenizer是通用封装,根据载入预训练模型来自适应。

auto_tokenizer = transformers.AutoTokenizer.from_pretrained(config.pretrained_model_path)

参数:

  • text (str, List[str], List[List[str]]`):就是输入的待编码的序列(或1个batch的),可以是字符串或字符串列表。
  • text_pair (str, List[str], List[List[str]]`):输入待编码的序列对。
  • add_special_tokens(bool, optional, defaults to True) :True就是给序列加上特殊符号,如[CLS],[SEP]
  • padding (Union[bool, str], optional, defaults to False) :给序列补全到一定长度,True or ‘longest’: 是补全到batch中的最长长度,max_length’:补到给定max-length或没给定时,补到模型能接受的最长长度。
  • truncation (Union[bool, str], optional, defaults to False) :截断操作,true or ‘longest_first’:给定max_length时,按照max_length截断,没给定max_lehgth时,到,模型接受的最长长度后截断,适用于所有序列(单或双)。only_first’:这个只针对第一个序列。only_second’:只针对第二个序列。
  • max_length (Union[int, None], optional, defaults to None) :控制padding和truncation的长度。
  • stride (int, optional, defaults to 0) :和max_length一起使用时,用于标记截断和溢出的重叠数量(不知道怎么用)。
  • is_pretokenized (bool, defaults to False):表示这个输入是否已经被token化。
  • pad_to_multiple_of :将序列以倍数形式padding
  • return_tensors (str, optional, defaults to None):返回数据的类型,可选tf’, ‘pt’ or ‘np’ ,分别表示tf.constant, torch.Tensor或np.ndarray
  • return_token_type_ids (bool, optional, defaults to None):默认返回token_type_id(属于哪个句子)。
  • return_attention_mask (bool, optional, defaults to none):默认返回attention_mask(是否参与attention计算)。
  • return_overflowing_tokens (bool, optional, defaults to False):默认不返回溢出的token
  • return_special_tokens_mask (bool, optional, defaults to False) :默认不返回特殊符号的mask信息.

最终返回一个字典:

{
    input_ids: list[int],
    token_type_ids: list[int] if return_token_type_ids is True (default)
    attention_mask: list[int] if return_attention_mask is True (default)
    overflowing_tokens: list[int] if the tokenizer is a slow tokenize, else a List[List[int]] if a ``max_length`` is specified and ``return_overflowing_tokens=True``
    special_tokens_mask: list[int] if ``add_special_tokens`` if set to ``True``and return_special_tokens_mask is True
}

使用:

from transformers import AutoTokenizer  #还有其他与模型相关的tokenizer,如BertTokenizer

tokenizer=AutoTokenizer.from_pretrained('bert-base-cased') #这里使用的是bert的基础版(12层),区分大小写,实例化一个tokenizer

batch_sentences=["Hello I'm a single sentence","And another sentence","And the very very last one"]

batch=tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="pt")

返回的三个句子都按照batch中最长序列padding到了9个token,由于是单个句子输入,所以token_type_ids是0,padding部分的attention_mask为0,不参与attention计算。

{'input_ids':tensor([[101,8667,146,112,182,170,1423,5650,102],[101,1262,1330,5650,102,0,0,0,0],[101,1262,1103,1304,1304,1314,1141,102,0]]),'token_type_ids':tensor([[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]]),'attention_mask':tensor([[1,1,1,1,1,1,1,1,1],[1,1,1,1,1,0,0,0,0],[1,1,1,1,1,1,1,1,0]])}

二、序列对的预处理

上面是对单句输入的处理,对于序列对的处理其实是一样的道理。

batch=tokenizer(batch_sentences,batch_of_second_sentences,padding=True,truncation=True,return_tensors=“pt”)

第一个参数是第一个序列,第二个参数第二个序列,剩下也是根据需要设置是否padding,是否截断,返回什么类型的数据。

三、案例

import transformers
import config

# --------------------------------------- 使用 BertTokenizer ---------------------------------------
origin_tokenizer = transformers.BertTokenizer.from_pretrained(config.pretrained_model_path)

origin_result01 = origin_tokenizer('对比原始的分词和最新的分词器', padding=True, truncation=True, max_length=13, return_tensors='pt')
print("origin_result01 = ", origin_result01)
print("-" * 100)
origin_result02 = origin_tokenizer('展示不同的分词效果', padding=True, truncation=True, max_length=13, return_tensors='pt')
print("origin_result02 = ", origin_result02)
print("-" * 100)
origin_result03 = origin_tokenizer(*[['对比原始的分词和最新的分词器', '展示不同的分词效果']], padding=True, truncation=True, max_length=13, return_tensors='pt')
print("origin_result03 = ", origin_result03)
print("-" * 200)

origin_result04 = origin_tokenizer.convert_tokens_to_ids(origin_tokenizer.tokenize('对比原始的分词和最新的分词器'))
origin_result05 = origin_tokenizer.convert_tokens_to_ids(origin_tokenizer.tokenize('展示不同的分词效果'))

print("origin_result04 = ", origin_result04)
print("-" * 100)
print("origin_result05 = ", origin_result05)
print('\n', '*' * 400, '\n')

# --------------------------------------- 使用 AutoTokenizer ---------------------------------------
auto_tokenizer = transformers.AutoTokenizer.from_pretrained(config.pretrained_model_path)

auto_result01 = auto_tokenizer('对比原始的分词和最新的分词器', padding=True, truncation=True, max_length=13, return_tensors='pt')
print("auto_result01 = ", auto_result01)
print("-" * 100)
auto_result02 = auto_tokenizer('展示不同的分词效果', padding=True, truncation=True, max_length=13, return_tensors='pt')
print("auto_result02 = ", auto_result02)
print("-" * 100)
auto_result03 = auto_tokenizer(*[['对比原始的分词和最新的分词器', '展示不同的分词效果']], padding=True, truncation=True, max_length=13, return_tensors='pt')
print("auto_result03 = ", auto_result03)
print("-" * 200)
auto_result04 = auto_tokenizer.convert_tokens_to_ids(auto_tokenizer.tokenize('对比原始的分词和最新的分词器'))
auto_result05 = auto_tokenizer.convert_tokens_to_ids(auto_tokenizer.tokenize('展示不同的分词效果'))

print("auto_result04 = ", auto_result04)
print("-" * 100)
print("auto_result05 = ", auto_result05)
print("-" * 400)

打印结果:

C:\Program_Files_AI\Anaconda3531\python.exe C:/Users/Admin/OneDrive/WorkSpace_AI/0-基于知识库的智能问答系统-华控智加/01-意图识别/models/test.py
origin_result01 =  {'input_ids': tensor([[ 101, 2190, 3683, 1333, 1993, 4638, 1146, 6404, 1469, 3297, 3173, 4638,
          102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
----------------------------------------------------------------------------------------------------
origin_result02 =  {'input_ids': tensor([[ 101, 2245, 4850,  679, 1398, 4638, 1146, 6404, 3126, 3362,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
----------------------------------------------------------------------------------------------------
origin_result03 =  {'input_ids': tensor([[ 101, 2190, 3683, 1333, 1993, 4638, 1146, 6404, 1469, 3297, 3173, 4638,
          102],
        [ 101, 2245, 4850,  679, 1398, 4638, 1146, 6404, 3126, 3362,  102,    0,
            0]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
origin_result04 =  [2190, 3683, 1333, 1993, 4638, 1146, 6404, 1469, 3297, 3173, 4638, 1146, 6404, 1690]
----------------------------------------------------------------------------------------------------
origin_result05 =  [2245, 4850, 679, 1398, 4638, 1146, 6404, 3126, 3362]

 **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** 

Ignored unknown kwarg option direction
auto_result01 =  {'input_ids': tensor([[ 101, 2190, 3683, 1333, 1993, 4638, 1146, 6404, 1469, 3297, 3173, 4638,
          102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
----------------------------------------------------------------------------------------------------
Ignored unknown kwarg option direction
auto_result02 =  {'input_ids': tensor([[ 101, 2245, 4850,  679, 1398, 4638, 1146, 6404, 3126, 3362,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
----------------------------------------------------------------------------------------------------
Ignored unknown kwarg option direction
auto_result03 =  {'input_ids': tensor([[ 101, 2190, 3683, 1333, 1993, 4638, 1146, 6404, 1469, 3297, 3173, 4638,
          102],
        [ 101, 2245, 4850,  679, 1398, 4638, 1146, 6404, 3126, 3362,  102,    0,
            0]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]])}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
auto_result04 =  [2190, 3683, 1333, 1993, 4638, 1146, 6404, 1469, 3297, 3173, 4638, 1146, 6404, 1690]
----------------------------------------------------------------------------------------------------
auto_result05 =  [2245, 4850, 679, 1398, 4638, 1146, 6404, 3126, 3362]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Process finished with exit code 0



参考资料:
pytorch:Transformers入门(二)
transformers的AutoTokenizer和BertTokenizer
【Huggingface Transformers】保姆级使用教程—上
【Huggingface Transformers】保姆级使用教程—上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

huggingface使用(一):AutoTokenizer(通用)、BertTokenizer(基于Bert) 的相关文章

  • 阅读理解机器问答系统

    机器问答系统流程如下图所示 具体过程 1 准备知识库 可以从维基百科或者百度百科中获取 知识库主要是存储实体与实体介绍文本 也就是百科中的词条与词条介绍 2 流程中涉及到三个模型 实体提取模型用来确定问题包含的实体 在知识库中查找确认对应介
  • 使用Transformers离线模型(以bert模型为例)

    首先需要安装transformers pip install transformers 以bert base uncased为例 进入网站 https huggingface co bert base uncased tree main 可
  • bert下albert_chinese_small实现文本分类

    import torch from transformers import BertTokenizer BertModel BertConfig import numpy as np from torch utils import data
  • HuggingFace学习3:加载预训练模型完成机器翻译(中译英)任务

    加载模型页面为 https huggingface co liam168 trans opus mt zh en 文章目录 整理文件 跑通程序 测试预训练模型 拆解Pipeline 逐步进行翻译任务 整理文件 首先下载模型所需的全部文件 h
  • huggingface模型--手动下载并保存

    timeout 下载模型超时 一般是最大的那个模型下载超时 其他依赖文件下载都没问题 ConnectionError HTTPSConnectionPool host cdn lfs huggingface co port 443 Read
  • bert简单介绍和实践

    bert模型是Google在2018年10月发布的语言表示模型 在NLP领域横扫了11项任务的最优结果 可以说是现今最近NLP中最重要的突破 Bert模型的全称是Bidirectional Encoder Representations f
  • bert中为什么要这么msdk(80% mask, 10% 随机替换,10% 保持原词)

    bert在训练阶段不是将15 的词汇MASK掉 从而采用自监督的方式训练模型 那我直接将这15 mask掉不就好了吗 为什么又要进行80 mask 10 随机替换 10 保持原词呢 起初我看到的时候也比较迷惑 下面是我的理解 一 训练阶段与
  • 【动手学习pytorch笔记】37.4 BERT微调数据集

    BERT微调数据集 自然语言推断任务 主要研究 假设 hypothesis 是否可以从前提 premise 中推断出来 其中两者都是文本序列 换言之 自然语言推断决定了一对文本序列之间的逻辑关系 这类关系通常分为三种类型 蕴涵 entail
  • NLP(四十一)使用HuggingFace翻译模型的一次尝试

    本文将如何如何使用HuggingFace中的翻译模型 HuggingFace是NLP领域中响当当的团体 它在预训练模型方面作出了很多接触的工作 并开源了许多预训练模型和已经针对具体某个NLP人物训练好的直接可以使用的模型 本文将使用Hugg
  • 【NLP】1、BERT

    文章目录 一 背景 二 方法 论文 BERT Pre training of Deep Bidirectional Transformers for Language Understanding 出处 Google 一 背景 在 BERT
  • bert-as-service配置

    环境配置 conda create n bert service python 3 8 conda activate bert service pip install user nvidia pyindex pip install user
  • Bert: Pre-training of Deep Bidirectional Transformers for Language Understanding

    Abstract 我们介绍了一种语言表达模型称为BERT 也就是Transformer的双边编码表示 与当前语言表达模型不同 Peters et al 2018a Radford et al 2018 BERT设计通过考虑所有层左右上下文对
  • huggingface 自定义模型finetune训练测试--bert多任务

    背景 需要将bert改为多任务 但是官方仅支持多分类 二分类 并不支持多任务 改为多任务时我们需要修改输出层 loss 评测等 如果需要在bert结尾添加fc等也可以参考该添加方式 代码 修改model 这里把BertForSequence
  • 知识蒸馏基础及Bert蒸馏模型

    为了提高模型准确率 我们习惯用复杂的模型 网络层次深 参数量大 甚至会选用多个模型集成的模型 这就导致我们需要大量的计算资源以及庞大的数据集去支撑这个 大 模型 但是 在部署服务时 就会发现这种 大 模型推理速度慢 耗费内存 显存高 这时候
  • 读论文(二) - BERT

    Introduction 预训练的语言模型 在改进自然语言处理任务方面非常有效 包括句子级别的任务 自然语言推理和释义 也包括分词级别的任务 NER和问答 将预训练的语言表示应用于下游任务有两种现有策略 基于特征 feature based
  • ChatGPT 最好的替代品

    前两天我们邀请了微软工程师为我们揭秘 ChatGPT 直播期间有个读者问到 有了 ChatGPT BERT 未来还有发展前途吗 我想起来最近读过的一篇博客 最好的 ChatGPT 替代品 不过聊到这俩模型 就不得不提到 Transforme
  • BERT、BART、T5 等法学硕士的比较分析

    探索语言模型 介绍 在这篇博文中 我将讨论 BERT BART 和 T5 等大型语言模型 到 2020 年 法学硕士领域取得的重大进展包括这些模型的开发 BERT和T5是Google开发的 BART是Meta开发的 我将根据这些型号的发布日
  • 论文阅读Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

    论文信息 题目 Sentence Embeddings using Siamese BERT Networks 使用孪生BERT网络结构的句子嵌入 作者 Nils Reimers Iryna Gurevych 论文水平 EMNLP 2019
  • 使用NNI对BERT模型进行粗剪枝、蒸馏与微调

    前言 模型剪枝 Model Pruning 是一种用于减少神经网络模型尺寸和计算复杂度的技术 通过剪枝 可以去除模型中冗余的参数和连接 从而减小模型的存储需求和推理时间 同时保持模型的性能 模型剪枝的一般步骤 训练初始模型 训练一个初始的神
  • 基于tensorflow2.0+使用bert获取中文词、句向量并进行相似度分析

    本文基于transformers库 调用bert模型 对中文 英文的稠密向量进行探究 开始之前还是要说下废话 主要是想吐槽下 为啥写这个东西呢 因为我找了很多文章要么不是不清晰 要么就是基于pytorch 所以特地写了这篇基于tensorf

随机推荐