(教程)如何在BERT模型中添加自己的词汇(pytorch版)

news2025/7/8 4:06:16

来源:投稿 作者:皮皮雷
编辑:学姐

参考文章:

NLP | How to add a domain-specific vocabulary (new tokens) to a subword tokenizer already trained like BERT WordPiece | by Pierre Guillou | Medium

https://medium.com/@pierre_guillou/nlp-how-to-add-a-domain-specific-vocabulary-new-tokens-to-a-subword-tokenizer-already-trained-33ab15613a41

中文bert-base

中文bert-base是以字为单位的,基本上已经涵盖了现代汉语所有的常用字。而且汉字是一个比较稳定的封闭集合,生活中不会随时造出新字来。新词倒是很常见,但是在中文BERT里直接就被tokenizer切成字了,因此一般没有多大的扩充词(字)表的需要。

笔者在古汉语语料上调用古汉语BERT确实遇到很多生僻字被分词器当成[UNK]的情况,还没有尝试增加新字,不过理论上是一样的。

但是英文不一样,英文预训练BERT(对,就是它,bert-base-uncased 和 bert-base-cased)以词为单位。社会生活中总是会有新词产生,而且在专业领域(如医疗、金融)有一些不常用的词语是英文预训练bert-base没有涵盖到的。这就需要扩充词表。

此外,在英文模型中,添加自定义词的作用不仅是增加新词或者专业领域的词汇,而且可以防止词语被自动拆成词根词缀。

如果不添加自定义词汇,“COVID”和“hospitalization”虽然不会被分词器直接当成[UNK],但是会被bert-base-cased的分词器拆分成:

['co', '##vid']
['hospital', '##ization']

方法1

直接在BERT词表vocab.txt中替换[unused]

  • 找到pytorch版本的bert-base-cased的文件夹中的vocab.txt文件。

  • 最前面的100行都是[unused]([PAD]除外),直接用需要添加的词替换进去。

比如我这里需要添加一个原来词表里没有的词“anewword”(现造的),这时候就把[unused1]改成我们的新词“anewword”

在未添加新词前,在python里面调用BERT模型的分词器:

from transformers import BertForMaskedLM, BertTokenizer
model = "Pretrained_LMs/bert-base-cased"  #自己的bert模型路径
tokenizer = BertTokenizer.from_pretrained(model, use_fast=True)
model = BertForMaskedLM.from_pretrained(model)
print(tokenizer.tokenize('anewword'))

打印结果:

['an', '##ew', '##word']

当在vocab中把[unused1]改成anewword后:

model = "Pretrained_LMs/bert-base-cased"  #还是自己的bert模型路径
tokenizer = BertTokenizer.from_pretrained(model, use_fast=True)
model = BertForMaskedLM.from_pretrained(model) #重新加载分词器
print(tokenizer.tokenize('anewword'))

打印结果:

['anewword']

方法2

通过重构词汇矩阵来增加新词

from transformers import BertForMaskedLM, BertTokenizer

model = "Pretrained_LMs/bert-base-cased"
tokenizer = BertTokenizer.from_pretrained(model, use_fast=True)
model = BertForMaskedLM.from_pretrained(model)

print(tokenizer.tokenize('COVID'))
print(tokenizer.tokenize('hospitalization'))

未加入新词时,打印'COVID'和'hospitalization'的分词结果为:

['co', '##vid']
 ['hospital', '##ization']

如果想让这些词保持完整的形式,可以通过重构BERT初始权重矩阵的方式将他们加入词表。

new_tokens = ['COVID', 'hospitalization']
num_added_toks = tokenizer.add_tokens(new_tokens)

num_added_toks返回一个数,表示加入的新词数量,在这里是2

#关键步骤,resize_token_embeddings输入的参数是tokenizer的新长度

model.resize_token_embeddings(len(tokenizer))

添加后的词汇,通过model.resize_token_embeddings方法,随机初始化了一个权重。

print(tokenizer.tokenize('COVID'))
print(tokenizer.tokenize('hospitalization'))
tokenizer.save_pretrained("Pretrained_LMs/bert-base-cased")

#还是保存到原来的bert文件夹下,这时候文件夹下多了三个文件

打印结果为:

['covid']
['hospitalization']

使用tokenizer.save_pretrained保存添加后的词汇。再次加载模型就会自动读取增加后的词汇。

新建一个python文件查看添加词汇后的结果:

from transformers import BertForMaskedLM, BertTokenizer
model = "Pretrained_LMs/bert-base-cased"
tokenizer = BertTokenizer.from_pretrained(model, use_fast=True)
model = BertForMaskedLM.from_pretrained(model)

print(tokenizer.tokenize('anewword'))
print(tokenizer.tokenize('COVID'))
print(tokenizer.tokenize('hospitalization'))

打印结果为:

['anewword']
['covid']
['hospitalization']

可见我们之前使用的两种不同的方法都起到了同样的效果。只是添加的是大写COVID,bert的tokenizer给我们都转成小写了。

小tip

在具体使用的时候,如果有大量领域内专业词汇,而且已经整理成词表,建议用方法1直接批量替换。但方法1的缺点是有个数限制,cased模型只有99个空位,uncased模型有999个空位。

ACL论文600+篇40+分类已打包🚀🚀🚀

关注下方《学姐带你玩AI》回复“ACL”领取

码字不易,欢迎大家点赞评论收藏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS2机器人编程简述humble-第三章-BUMP AND GO IN C++ .3

简述本章项目,参考如下:ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1流程图绘制,参考如下:ROS2机器人编程简述humble-第三章-COMPUTATION GRAPH .2然后,在3.3和3.4分别用C和Python编程实现&am…

Bus Hound 工具抓取串口数据(PC端抓取USB转串口数据)

测试环境: PC端 USB转串口 链接终端板卡串口 目标:抓取通信过程中的通信数据 工具介绍:Bus Hound是是由美国perisoft公司研制的一款超级软件总线协议分析器,它是一种专用于PC机各种总线数据包监视和控制的开发工具软件&#xff0c…

通信原理简明教程 | 数字调制传输

文章目录1 二进制数字调制和解调1.1 二进制数字调制的基本原理1.2 二进制数字调制信号的特性1.3 解调方法2 二进制差分相移键控2.1 2PSK的倒π现象2.2 2DPSK调制和解调3 二进制调制系统的抗噪性能3.1 2ASK系统的抗噪声性能3.2 2FSK系统的抗噪声性能4 二进制数字调制系统性能比较…

服务器配置定时脚本 crontab + Python;centos6或centos 7或centos8 实现定时执行 python 脚本

一、crontab的安装 默认情况下,CentOS 7中已经安装有crontab,如果没有安装,可以通过yum进行安装。 yum install crontabs 二、crontab的定时语法说明 corntab中,一行代码就是一个定时任务,其语法结构可以通过这个图来理解。 字符含义如下: * 代表取值范围内的数字 /…

Linux内核驱动初探(三) 以太网卡

目录 0. 前言 1. menuconfig 2. 设备树 0. 前言 这次的网卡驱动就比较顺利,基本就是参考 4.19.x 内核以及 imx6qdl-sabrelite.dtsi、imx6qdl-sabreauto.dtsi 中的设备树,来设置以太网各项参数。 1. menuconfig 其实笔者接手的时候,网口这…

本质安全设备标准(IEC60079-11)的理解(三)

本质安全设备标准(IEC60079-11)的理解(三) 对于标准中“fault”的理解 第一,标准中对fault的定义是这样的: 3.7.2 fault any defect of any component, separation, insulation or connection between c…

C++空间命名

前言 提示:由于C是在C语言基础之上,增加了很多新的东西。 本文讲解命名空间的具体使用方法 文章目录 目录 前言 一、命名空间 二、命名空间定义 1.嵌套性 2.和并性 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一…

【华为上机真题】区间交集

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

CleanMyMac X真的有必要买吗?CleanMyMac2023最新版下载

CleanMyMac X是一款集所有功能于一身的先进程序卸载清理器,只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。CleanMyMac为您喜爱的东西腾出空间。它不仅有着赏心悦目的UI交互页面,更有着强大的“超能力…

HTB-BountyHunter

HTB-BountyHunter信息收集开机提权信息收集 80端口的网页如下。 注意有一个db.php,虽然现在打不开,估计后面会用上。 还有resources里面的readme文件。 完成了tracker提交编写和developer组权限。没有完成portal的test用户禁用、选择哈希加密的密码以…

Webshell(网页后门)

数据来源 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 一、Webshell简介 01 什么是 Webshell webshell是以 asp、php、jsp或者cgi等网页文…

【数据结构与算法】第十九篇:回溯,剪枝,N皇后问题

知识导航一、回溯思想概述二、八皇后问题引入八皇后问题的解决思路(1)思路一:暴力出奇迹(2)思路二:根据题意减小暴力程度(3)思路三:回溯法剪枝三、四皇后问题八皇后问题四、N皇后的实现1.实现方法一:利用数…

程序员的自我修养第七章——动态链接 (上)

继续更新《程序员的自我修养》这个系列,主要是夏天没把它看完,补上遗憾。本篇来自书中第七章。 再说动态链接前,我们先阐明为什么要动态链接: 动态链接的产生来自静态链接的局限性。随着静态链接的发展,其限制也越来越…

十二、创建和管理表

文章目录一、基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 数据类型及数据库操作二、创建表三、查看表结构3.1 使用 SHOW COLUMNS 语句查看3.2 使用 DESCRIBE 语句查看3.3 查看表详细结构语句 SHOW CREATE TABLE四、修改表结构4.1 添加新字段和修改字段定义4.2 修改字…

用户画像增量更新系列二

进行用户日志数据处理 原始日志数据 结果: 思路:按照user_id的行为一条条处理,根据用户的行为类型判别。 由于sqlDF每条数据可能会返回多条结果,我们可以使用rdd.flatMap函数或者yield 格式:["user_id", "action…

总结:计算机中字符串比较大小的规则

总结:计算机中字符串比较大小的规则一背景:二Unicode编码表:字符越靠后,对应的十进制值越大三单个字符之间比较规则:四案例演示:单个字符与单个字符之间比较大小1.前提:汉字“一”与汉字“万”&…

Elasticsearch:Elasticsearch percolate 查询

Elasticsearch 通常如何工作? 我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入,匹配查询的文档作为结果返回。 但这不是 percolate query 的情况..... 让我们看看这篇文章中的 p…

10.Java方法学习知识点大全

文章目录前言一、什么是方法1.什么是方法?2.实际开发中,什么时候用到方法?3.实际开发中,方法有什么好处?二、最简单的方法定义和调用1.方法的格式2.方法的调用3.看代码说结果4.为什么要有带参数的方法呢?三、带参数的方法定义和调用1.带参数的方法定义和调用2.形参和实参3.…

NuSphere PhpED Pro 19.5 Crack

PhpED是PHP(PHP IDE),HTML,CSS,XML,SMARTY,XHTML等的I ntegated Development Environment。 高级代码编辑器、可靠的 dbg 调试器、高效的数据库连接客户端以及快速安全的部署能力的平衡组合使 P…

90. 注意力分数及代码实现

1. 注意力分数 2. 拓展到高维度 3. Additive Attention ps: 这种的好处是,key,value,query的长度可以不一样 4. Scaled Dot-Product Attention n个query,m个key-value 对最后的结果是n x m的矩阵,第i行就表…