一文详解BERT模型实现NER命名实体抽取-王文广

在自然语言处理和知识图谱中,实体抽取、NER是一个基本任务,也是产业化应用NLP 和知识图谱的关键技术之一。BERT是一个大规模预训练模型,它通过精心设计的掩码语言模型(Masked Language Model,MLM)来模拟人类对语言的认知,并对数十亿个词所组成的语料进行预训练而形成强大的基础语义,形成了效果卓绝的模型。通过 BERT来进行实体抽取、NER的方法是当前在NLP和知识图谱的产业化应用中最常用的方法,是效果与成本权衡下的最佳选择。本文详细讲解使用BERT来进行实体抽取,看完本文就会用当前工业界最佳的模型了。

什么是实体抽取?

实体是一个常见的名词,《知识图谱:认知智能理论与实战》一书将其定义为:
实体(Entity):是指一种独立的、拥有清晰特征的、能够区别于其他事物的事物。在信息抽取、自然语言处理和知识图谱等领域,用来描述这些事物的信息即实体。实体可以是抽象的或者具体的。
在实体抽取中,实体也成为命名实体(Named Entity),是指在实体之上会将其分门别类,用实体类型来框定不同的实体。图1是一些常见的“实体”的例子,比如“城市”类型的实体“上海”,“ 公司”类型的实体“达观数据”等。

图1 实体示例

实体抽取(Entity Extraction,EE)的目标就是识别一段文本中所包含的实体,在其他语境中,也被称之为“实体识别(Entity Recognition,ER)”、“命名实体识别(Named Entity Recognition,NER)”,这些不同的名词在大多数情况下所指代的意思是一样的。

举例来说,有一段文本:

达观数据同济大学联合共建的“知识图谱与语义计算联合实验室”正式揭牌成立
 

识别出其中的蓝色部分,并标记为“机构”类型的实体,就是实体抽取。实体抽取的过程通常可以分为是两个阶段:

  1. 识别出所有表示实体的词汇

  2. 将这些词汇分类到不同实体类型中


 

在传统的命名实体识别任务中,通常有人物、机构、地点等。而在知识图谱中,实体类型可以有数十种,甚至数百种。对于知识图谱来说,将各种文本中的实体抽取出来是最基本的任务,有许多方法都致力于解决这个问题。

图2 实体抽取案例

众所周知,实体抽取的复杂程度十分之高,这不仅仅有上图中的这样复杂的文档的原因,语言本身的理解也存在重重困难,有些场景下即使是人类也会出现不解之处。比如语言中隐含着专业的背景知识,隐形或显性的上下文语境,同样的文本表达着完全不同的概念,而相同的概念又有多变的语言表达方法等等。这些综合的原因使得理解语言成为了人工智能皇冠上的明珠,而从文本中抽取实体则不可避免地要理解语言,实体抽取的效果则依赖于对语言理解的程度。

图3 语言理解困难重重<

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是bert-bilstm-crf-ner模型的代码实现(Python): ```python import torch import torch.nn as nn from transformers import BertModel class BertBilstmCrfNer(nn.Module): def __init__(self, num_tags, hidden_dim=768, bert_model_name='bert-base-chinese'): super(BertBilstmCrfNer, self).__init__() self.bert = BertModel.from_pretrained(bert_model_name) self.dropout = nn.Dropout(0.5) self.bilstm = nn.LSTM(hidden_dim, hidden_dim // 2, num_layers=2, bidirectional=True, batch_first=True) self.fc = nn.Linear(hidden_dim, num_tags) self.crf = nn.CRF(num_tags, batch_first=True) def forward(self, input_ids, attention_mask, labels=None): bert_output = self.bert(input_ids=input_ids, attention_mask=attention_mask)[0] bert_output = self.dropout(bert_output) lstm_output, _ = self.bilstm(bert_output) logits = self.fc(lstm_output) if labels is not None: loss = -self.crf(logits, labels, mask=attention_mask.byte(), reduction='mean') return loss else: pred_labels = self.crf.decode(logits, mask=attention_mask.byte()) return pred_labels ``` 该模型使用了BERT作为预训练模型,使用了BiLSTM作为特征提取器,并使用CRF作为序列标注器。在模型中,我们首先使用BERT模型对输入进行编码,然后通过BiLSTM提取特征,最后通过全连接层将提取的特征映射到标签空间。在训练时,我们使用CRF计算损失,并通过反向传播更新模型参数。在推理时,我们使用CRF进行解码,得到最终的标签序列。 模型的输入是一个batch的本序列,每个本序列已经使用BERT进行编码,因此输入是一个二维张量,形状为(batch_size, sequence_length, hidden_dim)。另外,我们还需要提供一个attention_mask张量,用于指示输入中的实际本序列部分。标签序列是一个二维张量,形状为(batch_size, sequence_length),每个元素代表一个标签。在训练时,我们需要提供标签序列,用于计算损失;在推理时,我们不需要提供标签序列,而是通过CRF进行解码,得到最终的标签序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值