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

这篇具有很好参考价值的文章主要介绍了(教程)如何在BERT模型中添加自己的词汇(pytorch版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

参考文章:

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]

bert 扩充词表,人工智能干货,粉丝的投稿,深度学习干货,自然语言处理,人工智能,深度学习

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

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

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

bert 扩充词表,人工智能干货,粉丝的投稿,深度学习干货,自然语言处理,人工智能,深度学习

在未添加新词前,在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文件夹下,这时候文件夹下多了三个文件

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”领取

码字不易,欢迎大家点赞评论收藏!文章来源地址https://www.toymoban.com/news/detail-643369.html

到了这里,关于(教程)如何在BERT模型中添加自己的词汇(pytorch版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nlp系列(7)实体识别(Bert)pytorch

    本项目是使用Bert模型来进行文本的实体识别。 Bert模型介绍可以查看这篇文章: NLP系列(2)文本分类(Bert)pytorch_bert文本分类-CSDN博客 Bert模型的模型结构: 数据网址:​​​​​​https://github.com/buppt//raw/master/data/people-relation/train.txt 实体1  实体2  关系 文本 输入中文句子

    2024年02月10日
    浏览(35)
  • 深度解析BERT:从理论到Pytorch实战

    本文从BERT的基本概念和架构开始,详细讲解了其预训练和微调机制,并通过Python和PyTorch代码示例展示了如何在实际应用中使用这一模型。我们探讨了BERT的核心特点,包括其强大的注意力机制和与其他Transformer架构的差异。 关注TechLead,分享AI全维度知识。作者拥有10+年互联网

    2024年02月10日
    浏览(34)
  • 预训练Bert添加new token的问题

    最近遇到使用transformers的AutoTokenizer的时候,修改vocab.txt中的[unused1]依然无法识别相应的new token。 实例: 我将[unused1]修改为了[TRI],句子中的[TRI]并没有被整体识别,而是识别为了[,T,RI,]。这明显是有问题的。 若去掉[TRI]的方括号,问题就消失了。 所以可以认定,Bert对带有方

    2024年02月09日
    浏览(40)
  • nlp系列(7)三元组识别(Bert+CRF)pytorch

    在实体识别中:使用了Bert模型,CRF模型 在关系识别中:使用了Bert模型的输出与实体掩码,进行一系列变化,得到关系 Bert模型介绍可以查看这篇文章:NLP系列(2)文本分类(Bert)pytorch_bert文本分类-CSDN博客 CRF模型介绍可以查看这篇文章:NLP系列(6)文本实体识别(Bi-LSTM

    2024年02月11日
    浏览(35)
  • 【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统

         🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​  🖍forew

    2024年02月01日
    浏览(35)
  • 深入理解深度学习——BERT派生模型:ALBERT(A Lite BERT)

    分类目录:《深入理解深度学习》总目录 预训练语言模型的一个趋势是使用更大的模型配合更多的数据,以达到“大力出奇迹”的效果。随着模型规模的持续增大,单块GPU已经无法容纳整个预训练语言模型。为了解决这个问题,谷歌提出了ALBERT,该模型与BERT几乎没有区别,

    2024年02月10日
    浏览(52)
  • 【自然语言处理NLP】Bert预训练模型、Bert上搭建CNN、LSTM模型的输入、输出详解

    Bert模型的输入 context 张量需要满足以下要求: 张量形状: context 应为二维张量,形状为 [batch_size, sequence_length] ,其中 batch_size 是输入样本的批量大小, sequence_length 是输入序列的长度。 数据类型: context 的数据类型应为整数类型,如 torch.LongTensor 。 值范围: context 中的值应

    2024年02月11日
    浏览(43)
  • GPT与BERT模型

            NLP任务的核心逻辑是“猜概率”的游戏。BERT和GPT都是基于预训练语言模型的思想,通过大量语料训练得到语言模型。两种模型都是基于Transformer模型。         Bert 类似于Transformer的Encoder部分,GPT类似于Transformer的Decoder部分。两者最明显的在结构上的差异为M

    2024年02月09日
    浏览(36)
  • 语言模型BERT理解

    BERT是由Google在2018年提出的一种预训练语言模型。BERT的创新之处在于采用了 双向Transformer编码器来生成上下文相关的词向量表示 。 传统的单向语言模型只考虑了左侧或右侧的上下文信息,而BERT则同时考虑了左侧和右侧的上下文信息,使得生成的词向量具有更好的语义表达能

    2024年02月13日
    浏览(42)
  • 文本情感分类模型之BERT

    BERT是google开源的一种自然语言处理领域的经典模型,全称是 B idirectional  E ncoder  R epresentations from  T ransformers 。它使用多头注意力和位置嵌入,来替换不易并行的循环神经网络。它的出现一举打破自然语言处理领域11个不同问题的记录,直接将自然语言处理推动到了一个新的

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包