基于BERT的中文命名实体识别

Bert-ChineseNER

Introduction

BERT

简要地介绍一下BERT,网上对于BERT的介绍已经满天飞了。BERT是谷歌在2018年提出的一个预训练语言模型,不同于传统的语言模型使用自回归的方式对文本进行语言模型的学习,BERT提出了一种新颖的Mask Language Model,结合谷歌在2017年提出的Transformer网络结构,对文本进行“真正”的双向建模。

Fine-tune

BERT只是一个预训练的语言模型,在各大任务上都刷新了榜单。我们本次实验的任务也是一个序列标注问题,简而言之,就是是基于BERT预训练模型,在中文NER(Named Entity Recognition,命名实体识别)任务上进行fine-tune。

Fine-tune是什么意思,中文译为微调。在transfer learning中,对事先训练好的特征抽取网络,直接拿来用在下游任务上。固定其特征抽取层的网络参数,只在原有的网络上增加少量神经元,做最后的分类任务,而且只更新分类参数。

Results

模型结果

引入bert之后,可以看到在验证集上的F-1值在训练了16个epoch时就已经达到了94.87,并在测试集上达到了

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
以下是一个基于BERT命名实体识别Python代码示例: 首先,需要安装相应的库,包括torch、transformers和nltk: ``` !pip install torch !pip install transformers !pip install nltk ``` 然后,导入所需的库: ``` import torch from transformers import BertTokenizer, BertForTokenClassification import nltk nltk.download('punkt') from nltk.tokenize import word_tokenize ``` 接下来,加载预训练的BERT模型和tokenizer: ``` model = BertForTokenClassification.from_pretrained('bert-base-cased', num_labels=9) tokenizer = BertTokenizer.from_pretrained('bert-base-cased') ``` 在这里,我们使用了一个预训练的BERT模型(bert-base-cased),该模型具有104万个参数,并在大型文本语料库上进行了训练。模型的tokenizer也使用了相同的语料库。 然后,定义一个函数来执行命名实体识别: ``` def ner(text): # 标记化文本 tokenized_text = word_tokenize(text) # 应用BERT tokenizer input_ids = torch.tensor([tokenizer.encode(tokenized_text, add_special_tokens=True)]) # 对于BERT,我们需要将输入标记的标记位置(mask)设置为1 attention_mask = torch.ones(input_ids.shape) # 预测标记(实体类别) with torch.no_grad(): output = model(input_ids, attention_mask=attention_mask) # 获取预测标记的索引 predicted_tokens = torch.argmax(output[0], dim=2) # 将标记转换为实体类别 tags = [] for i in predicted_tokens[0]: tags.append(model.config.id2label[i.item()]) # 将标记和实体类别组合成元组 entities = [] for i in range(len(tokenized_text)): if tags[i] != 'O': entities.append((tokenized_text[i], tags[i])) return entities ``` 该函数接受一个字符串作为输入,并将其标记化为单词。然后,使用BERT tokenizer将单词转换为输入ID。对于BERT,我们还需要创建一个用于标记输入标记位置的注意力掩码。然后,我们使用预训练的BERT模型来预测每个标记的实体类别。最后,我们将标记和实体类别组合成元组,并将其作为输出返回。 现在,我们可以使用该函数来识别给定文本中的命名实体。例如: ``` text = "J.K. Rowling is the author of the Harry Potter series." entities = ner(text) print(entities) ``` 该代码将输出以下内容: ``` [('J.K.', 'B-PERSON'), ('Rowling', 'I-PERSON'), ('Harry', 'B-PRODUCT'), ('Potter', 'I-PRODUCT')] ``` 该输出表示在给定文本中找到了4个实体,其中2个是人名,2个是产品名称。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值