前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【论文复现】命名实体识别

【论文复现】命名实体识别

作者头像
Eternity._
发布2024-11-28 08:48:33
发布2024-11-28 08:48:33
34800
代码可运行
举报
文章被收录于专栏:登神长阶登神长阶
运行总次数:0
代码可运行

概述

命名实体识别(NER)是自然语言处理领域的一个核心任务,它的目标是从文本数据中找出并分类出各种命名实体,这些实体往往指的是特定的名词,比如人名、地理位置名称以及机构或组织名称等。

下图展示了一个简单的实体抽取任务,在句子中抽取出来阿里巴巴(组织名)、马云(人名)和杭州(地名)三个实体。

主要目标

NER 的主要目标是找到文本中有意义的实体,并将其归类到预定义的类别中。以下是一些常见的类别:

  • 人名(Person):例如“乔布斯”、“马云”。
  • 地名(Location):例如“纽约”、“长城”。
  • 组织名(Organization):例如“微软”、“联合国”。
应用

命名实体识别是自然语言处理领域的一个重要的任务,它在很多具体任务上有着自己的应用:

  • 信息抽取:从大量文档中自动提取有价值的信息。
  • 问答系统:帮助系统更准确地理解问题并返回相关答案。
  • 文本摘要:在生成文本摘要时识别出关键实体以保留重要信息。
  • 推荐系统:通过识别用户偏好的实体来提供个性化推荐。

论文介绍

本文的工作启发于论文BERT-BiLSTM-CRF Chinese Resume Named Entity Recognition

Combining Attention Mechanisms

https://dl.acm.org/doi/abs/10.1145/3652628.3652719

技术方法

BERT编码

首先,利用预训练的BERT模型对输入的中文文本进行编码处理,以生成每个汉字对应的上下文表征。BERT模型凭借其双向Transformer结构,能够精准捕捉文本中每个汉字与其周围文字间的复杂关联性,进而产出高质量的字级表示,为后续的特征抽取及命名实体识别任务奠定坚实基础。

BiLSTM特征提取

随后,将BERT模型生成的特征向量传递给双向长短时记忆网络(BiLSTM),用以捕捉文本序列中的前后相依关系。BiLSTM通过正向与反向两个方向对序列数据进行处理,使模型能够全面利用上下文信息。这样的设计让模型能够更精确地定位每个字在序列中的位置及其扮演的角色,进而提取出更为详尽的特征表示。

注意力机制

在 BiLSTM 层之后,引入注意力机制,以便模型能够聚焦于更相关的特征。注意力机制通过计算序列中各个字之间的相关性权重,使模型能够动态地调整对不同位置的字的关注程度。

CRF标注

最终,将经过注意力机制增强后的特征向量传递给条件随机场(CRF)层,进行全局性的序列标注处理,以得出实体识别的最终结果。CRF作为一种专为序列标注设计的概率图模型,能够充分考虑到标注序列的整体依赖性,这意味着在预测每个字符的标签时,它不仅会基于当前字符的特征做出决策,还会同时考虑其周围字符的标注情况,从而确保标注结果的一致性和准确性。

论文提出的BERT-BiLSTM-Att-CRF模型在中文数据集上取得了较好的识别效果。

结合论文提出的框架,本文新增了一个LoRA层,用来优化模型

LoRA

神经网络内含众多执行矩阵乘法的密集层,这些层中的权重矩阵普遍具有满秩特性。针对特定下游任务的适配过程中,有研究显示,预训练的语言模型实则蕴含较低的内在维度,意味着只需对极低维度的参数进行微调,便可达到与全参数空间微调相近的效果。这一发现启示我们,在参数更新流程中,或许同样存在一个相对较低的“本质秩”。为了约束预训练权重矩阵的更新,我们可以采用低秩分解的方法。在涉及矩阵乘法的组件中,增设一条新的路径,通过连续的两个矩阵A和B相乘来实现。其中,矩阵A负责降低维度,而矩阵B则负责提升维度,中间的维度被设定为r,以此来模拟本质秩的效果。

数据处理

数据来源

本文所用的训练数据是MSRA-NER数据集。

MSRA-NER是由微软亚洲研究院标注的新闻领域的实体识别数据集。该数据集包含5万多条中文实体识别标注数据,实体类别分为人物、地点、机构三类。

数据集包含训练集46364个句子,验证集4365个句子。

格式举例如下:

代码语言:javascript
代码运行次数:0
运行
复制
中 共 中 央 致 中 国 致 公 党 十 一 大 的 贺 词 各 位 代 表 、 各 位 同 志 : 在 中 国 致 公 党 第 十 一 次 全 国 代 表 大 会 隆 重 召 开 之 际 , 中 国 共 产 党 中 央 委 员 会 谨 向 大 会 表 示 热 烈 的 祝 贺 , 向 致 公 党 的 同 志 们 致 以 亲 切 的 问 候 !
B-ORG I-ORG I-ORG I-ORG O B-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG O O O O O O O O O O O O O O B-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG O O O O O O O B-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG I-ORG O O O O O O O O O O O O O B-ORG I-ORG I-ORG O O O O O O O O O O O O
数据标注

采用BIO标注方式对获得的文本句子进行标注

BIO数据标注方式是命名实体识别(NER)任务中常用的一种标注方法。BIO代表三种标签:B(Begin),I(Inside)和O(Outside),用于标记文本中每个词属于某个命名实体的开头、内部或外部。以下是对BIO标注方式的详细介绍:

BIO标签定义
  • B(Begin):表示命名实体的开始。一个实体的第一个词标注为B-<实体类型>。
  • I(Inside):表示命名实体的内部。属于同一个实体的后续词标注为I-<实体类型>。
  • O(Outside):表示不属于任何命名实体的词。

例如,B-ORG表示组织实体的开头,I-ORG表示组织实体的内部。下图展示了一个标注好的例子,其中未标注的字段都是无实体(O)。

核心逻辑

BaLC模型

自定义attention层,bert模型、LSTM模型、CRF模型调用pytorch库中的相关模型,使用BERT预训练的语言模型对输入文本进行字符级编码,获得动态词向量,然后使用双向长短期记忆(BiLSTM)网络提取全局语义特征,然后使用注意力机制分配权重,更好地捕捉关键特征,最后使用条件随机场(CRFs)输出全局最优标记序列。具体定义如下:

代码语言:javascript
代码运行次数:0
运行
复制
import torch.nn as nn
from transformers import BertPreTrainedModel, BertModel, BertConfig
from torchcrf import CRF
import math
import torch


class Self_Attention(nn.Module):
    def __init__(self, input_dim, dim_k, dim_v):
        super(Self_Attention, self).__init__()
        self.q = nn.Linear(input_dim, dim_k)
        self.k = nn.Linear(input_dim, dim_k)
        self.v = nn.Linear(input_dim, dim_v)
        self._norm_fact = 1 / math.sqrt(dim_k)

    def forward(self, x):
        Q = self.q(x)  
        K = self.k(x) 
        V = self.v(x) 
        atten = torch.bmm(Q, K.permute(0, 2, 1)) * self._norm_fact  # Q * K.T()
        atten = nn.Softmax(dim=-1)(atten)
        output = torch.bmm(atten, V)  
        return output


class BERT_BiLSTM_ATT_CRF(nn.Module):
    def __init__(self, bert_model, hidden_dropout_prob, num_labels, hidden_dim=128):
        super(BERT_BiLSTM_ATT_CRF, self).__init__()
        self.bert = BertModel.from_pretrained(bert_model)
        bert_config = BertConfig.from_pretrained(bert_model)
        self.dropout = nn.Dropout(hidden_dropout_prob)

        self.bilstm = nn.LSTM(input_size=bert_config.hidden_size, hidden_size=hidden_dim, num_layers=1, bidirectional=True, batch_first=True)
        out_dim = hidden_dim* 2

        self.hidden2tag = nn.Linear(in_features=out_dim, out_features=num_labels)
        self.attention = Self_Attention(128, 128, 128)
        self.crf = CRF(num_tags=num_labels, batch_first=True)

    def forward(self, input_ids, tags, token_type_ids=None, attention_mask=None):
        outputs = self.bert(input_ids, token_type_ids=token_type_ids, attention_mask=attention_mask)
        sequence_output = outputs[0]  
        sequence_output, _ = self.bilstm(sequence_output)  
        sequence_output = self.dropout(sequence_output)
        sequence_output = self.attention(sequence_output)
        sequence_output = self.hidden2tag(sequence_output) 
        outputs = self.crf(sequence_output , tags, mask=attention_mask.byte())
        
        return outputs
LoRA结构

其中,为了优化模型的算法,在Bert的encoder模块加入了LoRA方法,使得模型的训练速度得到提高,训练效果得到提高。 原则上,可以将LoRA应用到神经网络中,以减少可训练参数的数量。在Transformer结构中,自注意力模块有四个权重矩阵(Wq,Wk,Wv,Wo)(W q​ ,W k​ ,W v​ ,W o​ ),MLP模块有两个权重矩阵。通常来说,将LoRA添加到WqW q​ 和WkW k 两个模块中,效果是比较好的。因此,在Q(query)和K(key)模块,插入LoRA层。

代码语言:javascript
代码运行次数:0
运行
复制
    for layer in model.bert.encoder.bert_layer_groups:
        layer.bert_layers[0].attention.query = LinearLora(layer.bert_layers[0].attention.query,rank=8,alpha=16)
        layer.bert_layers[0].attention.key = LinearLora(layer.bert_layers[0].attention.key,rank=8,alpha=16)
       
    model.to(device)
实现方式

首先下载Bert预训练模型,然后收集自己要训练的数据集,放入文件中,修改源码中的路径名称。

运行train.py函数,开始训练,可以自行调整训练中的epoch等参数,其中训练的时候会调用测试函数进行输出。

演示效果

运行train.py函数,可以看到模型开始训练,在模型训练结束后,会根据测试集的结果生成测试的结果

代码语言:javascript
代码运行次数:0
运行
复制
           precision    recall  f1-score   support
    B-LOC     0.9257    0.8245    0.8721      2871
    I-LOC     0.8894    0.8796    0.8845      4370
    B-ORG     0.8625    0.7800    0.8192      1327
    B-PER     0.9513    0.9021    0.9261      1972
    I-PER     0.9254    0.9521    0.9386      3845
        O     0.9913    0.9917    0.9915    150935
    I-ORG     0.8631    0.9255    0.8932      5640
avg/total     0.9804    0.9803    0.9802    170960

运行demo.py可以根据输入的句子,进行实体识别,例如:

代码语言:javascript
代码运行次数:0
运行
复制
sentence = "在 唐 胜 利 康 复 回 乡 前 一 天 , 北 京 博 爱 医 院 院 长 吴 弦 光 代 表 医 院 向 唐 胜 利 及 其 父 亲 赠 送 编 织 机 。"
output =[['<START>', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-LOC', 'B-ORG', 'B-ORG', 'B-ORG', 'B-ORG', 'B-ORG', 'O', 'O', 'B-PER', 'I-ORG', 'I-ORG', 'O', 'O', 'B-LOC', 'B-ORG', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '<END>']]

可以看出,模型能识别句子中的实体,并按照BIO标注返回结果


编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • 主要目标
    • 应用
  • 论文介绍
  • 技术方法
    • BERT编码
    • BiLSTM特征提取
    • 注意力机制
    • CRF标注
    • LoRA
  • 数据处理
    • 数据来源
    • 数据标注
  • 核心逻辑
    • BaLC模型
    • LoRA结构
    • 实现方式
    • 演示效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档