向BERT词汇表中添加token

  • 问题表述
  • 添加特殊占位符号 add_special_tokens
  • 其他占位符接口
  • 报错与解决方案

问题表述

在实际应用或者学术科研过程中,我们常常需要添加一些特殊的占位符,然而我们希望使用BERT来做embedding,有兴趣查看BERT本身词汇表的可以去以下相应连接查看:

PRETRAINED_VOCAB_FILES_MAP = {"vocab_file": {"bert-base-uncased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt","bert-large-uncased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt","bert-base-cased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt","bert-large-cased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt","bert-base-multilingual-uncased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt","bert-base-multilingual-cased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt","bert-base-chinese": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt","bert-base-german-cased": "https://int-deepset-models-bert.s3.eu-central-1.amazonaws.com/pytorch/bert-base-german-cased-vocab.txt","bert-large-uncased-whole-word-masking": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-whole-word-masking-vocab.txt","bert-large-cased-whole-word-masking": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-whole-word-masking-vocab.txt","bert-large-uncased-whole-word-masking-finetuned-squad": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-whole-word-masking-finetuned-squad-vocab.txt","bert-large-cased-whole-word-masking-finetuned-squad": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-whole-word-masking-finetuned-squad-vocab.txt","bert-base-cased-finetuned-mrpc": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-finetuned-mrpc-vocab.txt","bert-base-german-dbmdz-cased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-german-dbmdz-cased-vocab.txt","bert-base-german-dbmdz-uncased": "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-german-dbmdz-uncased-vocab.txt","TurkuNLP/bert-base-finnish-cased-v1": "https://s3.amazonaws.com/models.huggingface.co/bert/TurkuNLP/bert-base-finnish-cased-v1/vocab.txt","TurkuNLP/bert-base-finnish-uncased-v1": "https://s3.amazonaws.com/models.huggingface.co/bert/TurkuNLP/bert-base-finnish-uncased-v1/vocab.txt","wietsedv/bert-base-dutch-cased": "https://s3.amazonaws.com/models.huggingface.co/bert/wietsedv/bert-base-dutch-cased/vocab.txt",}
}

一开始我想通过简单的修改网站上的vocab.txt,向其中添加我们想增加的特殊占位符<e>,却还是被BERT的分词器分成了三部分。最终终于发现BERT其实贴心的给我们留好了添加特殊占位符号的接口

添加特殊占位符号 add_special_tokens

这个往分词器tokenizer中添加新的特殊占位符的方法就是add_special_tokens,代码实现如下:

tokenizer.add_special_tokens({'additional_special_tokens':["<e>"]})

在这里我们是往additional_special_tokens这一类tokens中添加特殊占位符<e>。我们可以做一个实验看看<e>在被添加进去前后分词的效果:

# 导入模型和分词器
from transformers import BertTokenizer,BertModel,RobertaTokenizer, RobertaModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-cased') # Bert的分词器
bertmodel = BertModel.from_pretrained('bert-base-cased',from_tf=True)# load the TF model for Pytorch
text = " I love <e> ! "
# 对于一个句子,首尾分别加[CLS]和[SEP]。
text = "[CLS] " + text + " [SEP]"
# 然后进行分词
tokenized_text1 = tokenizer.tokenize(text)
print(tokenized_text1)
indexed_tokens1 = tokenizer.convert_tokens_to_ids(tokenized_text1)
# 分词结束后获取BERT模型需要的tensor
segments_ids1 = [1] * len(tokenized_text1)
tokens_tensor1 = torch.tensor([indexed_tokens1]) # 将list转为tensor
segments_tensors1 = torch.tensor([segments_ids1])
# 获取所有词向量的embedding
word_vectors1 = bertmodel(tokens_tensor1, segments_tensors1)[0]
# 获取句子的embedding
sentenc_vector1 = bertmodel(tokens_tensor1, segments_tensors1)[1]
tokenizer.add_special_tokens({'additional_special_tokens':["<e>"]})
print(tokenizer.additional_special_tokens) # 查看此类特殊token有哪些
print(tokenizer.additional_special_tokens_ids) # 查看其id
tokenized_text1 = tokenizer.tokenize(text)
print(tokenized_text1)

最终的运行效果如图:

可以清楚地看到<e>在被加入到特殊占位符以后就没有再被分开了!

其他占位符接口

除了提到的additional_special_tokens这一类添加占位符号的接口,transformers还留有一下接口:

    SPECIAL_TOKENS_ATTRIBUTES = ["bos_token","eos_token","unk_token","sep_token","pad_token","cls_token","mask_token","additional_special_tokens",]

可以通过一下代码进行查看:

from transformers import BertTokenizer,BertModel,RobertaTokenizer, RobertaModel
tokenizer = BertTokenizer.from_pretrained('bert-base-cased') # Bert的分词器
print(tokenizer.SPECIAL_TOKENS_ATTRIBUTES)

报错与解决方案

在添加特殊字符后用Roberta或者Bert模型获取embedding报错:Cuda error during evaluation - CUBLAS_STATUS_NOT_INITIALIZED

这是因为在将模型放到eval模式后添加了新token,必须在添加新token完毕后运行以下代码:

robertamodel.resize_token_embeddings(len(tokenizer))

深度学习实战(4)如何向BERT词汇表中添加token,新增特殊占位符相关推荐

  1. 深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

    文章目录 一.前期工作 1. 设置GPU 2. 导入预处理词库类 二.导入预处理词库类 三.参数设定 四.创建模型 五.训练模型函数 六.测试模型函数 七.训练模型与预测 今天给大家带来一个简单的中文 ...

  2. 深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

    大家好,我是微学AI,今天给大家带来手写OCR识别的项目.手写的文稿在日常生活中较为常见,比如笔记.会议记录,合同签名.手写书信等,手写体的文字到处都有,所以针对手写体识别也是有较大的需求.目前手写体 ...

  3. 深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

    文章目录 一.前期工作 导入库包 导入数据 主成分分析(PCA) 聚类分析(K-means) 二.神经网络模型建立 三.检验模型 大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(pytorc ...

  4. 深度学习实战1-(keras框架)企业数据分析与预测

    大家好,我是微学AI,今天给大家带来深度学习框架keras的实战项目,用于基本的企业数据分析,预测企业净利润情况,并利用灰色预测函数GM11进行预测模型.我们拿到企业数据,这里参数抽象成x1-x9,y ...

  5. 深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

    大家好,我是微学AI,我们在日常生活中,经常会写一些文稿,比如:会议纪要,周报,日报,汇报材料,这些文稿里我们会发现有时候出现拼写.语法.标点等错误:其中拼写错误的错别字占大部分. 经过初步统计:在微 ...

  6. 深度学习实战2-(keras框架)企业信用评级与预测

    深度学习框架如果仔细研究,其实难度没有想象中的那么大,今天我给大家带来一个深度学习框架keras简单的实战项目:企业信用评级与预测. 企业信用评级目前是一个完整的体系,包括信用评级的要素和指标.信用评 ...

  7. 深度学习实战23(进阶版)-语义分割实战,实现人物图像抠图的效果(计算机视觉)

    大家好,我是微学AI,今天给大家带来深度学习实战23(进阶版)-语义分割实战,实现人物图像抠图的效果.语义分割是计算机视觉中的一项重要任务,其目标是将图像中的每个像素都分配一个语义类别标签.与传统的目 ...

  8. 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1

    日萌社 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1 人工智能AI:TensorFlow Keras PyTorch ...

  9. 深度学习实战——模型推理优化(模型压缩与加速)

    忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 目录 系列文章目录 一.实验思路综 ...

最新文章

  1. 不丹的启示:用国民幸福总值替代GDP
  2. DSP平台实现图像识别算法总体来说不如嵌入式?
  3. 腾讯,字节等大厂面试真题汇总,深夜思考
  4. idea加载lombok插件
  5. 统计个人已完成的工作量_2020个人年终工作总结怎么写已完成工作?
  6. 张季跃 201771010139《面向对象程序设计(java)》第八周学习总结
  7. win8的cmd运行命令大全
  8. java翁凯_翁凯-JAVA
  9. SREng 使用指南(四)智能扫描的详细解说
  10. python怎么算二元一次方程_Python简单实现二元一次方程求根
  11. 1.WebService
  12. Python爬虫:最牛逼的 selenium爬取方式!
  13. 因果6-估计因果效应
  14. 钢琴节奏时值测试软件,这些钢琴曲可以测试出你的钢琴水平达到哪个阶段?
  15. 解决“javac不是内部或外部命令,也不是可运行的程序”问题
  16. ssti练习之[CSCCTF 2019 Qual]FlaskLight 1
  17. win10设置虚拟内存_小技巧| 电脑经内存不够用,教你如何设置虚拟内存
  18. pyechart中15种中国地图,世界地图可视化代码模板, 最适合放在ppt中
  19. EXCEL函数vlookup视频教程
  20. STM32 FLASH 简单读写操作【有代码】

热门文章

  1. [转]stm32 sdio写入速度 SD卡【好文章】[F1开发板通用] 战舰STM32F103开发板 SDIO写入速度测试(使用FATFS)
  2. 微信更新值得注意的几点
  3. 腾讯地图个性化图层创建及发布
  4. 安川机器人怎样与变位器编程_基于CAM Function的安川机器人弧焊焊接离线编程与离线仿真...
  5. 微信小程序-wxml笔记(更新中)
  6. 免费HTTP代理商如何
  7. excel文件损坏修复绝招_Excel被删除并清空,会计别哭,一招拯救!
  8. mysql创建、修改、删除索引和主键
  9. Google Colab V100 +TensorFlow1.15.2 性能测试
  10. python:操作文档——TXT篇