首页 > 其他分享 >【自然语言处理(NLP)】基于LSTM的命名实体识别(进阶)

【自然语言处理(NLP)】基于LSTM的命名实体识别(进阶)

时间:2022-10-11 16:08:24浏览次数:89  
标签:NLP word 进阶 emb self label LSTM model RNN

【自然语言处理(NLP)】基于LSTM的命名实体识别(进阶)


作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC)志愿者,以及编程爱好者,期待和大家一起学习,一起进步~ . 博客主页ぃ灵彧が的学习日志 . 本文专栏机器学习 . 专栏寄语:若你决定灿烂,山无遮,海无拦 . 在这里插入图片描述

(文章目录)


前言

(一)、任务描述

命名实体识别任务主要识别文本中的实体,并且给识别出的实体进行分类,比如人名、地名、机构名或其它类型。本质上,对于给定的文本,只需要对其中的每个单词进行分类,只不过需要对分类的标签进行重新定义。


(二)、环境配置

本示例基于飞桨开源框架2.0版本。

import paddle
import numpy as np
import matplotlib.pyplot as plt
print(paddle.__version__)

输出结果如下图1所示: 在这里插入图片描述


一、优化进阶-使用预训练的词向量优化模型效果

在Baseline版本中,我们调用了paddle.nn.Embedding获取词的向量表示。这里,我们调用paddlenlp.embeddings中内置的向量表示TokenEmbedding


(一)、导入相关包

from paddlenlp.embeddings import TokenEmbedding # EMB

del model
del preds
del network

(二)、定义BiGRUWithCRF2

class BiGRUWithCRF2(nn.Layer):
    def __init__(self,
                 emb_size,
                 hidden_size,
                 word_num,
                 label_num,
                 use_w2v_emb=True):
        super(BiGRUWithCRF2, self).__init__()
        if use_w2v_emb:
            self.word_emb = TokenEmbedding(
                extended_vocab_path='./data/word.dic', unknown_token='OOV')
        else:
            self.word_emb = nn.Embedding(word_num, emb_size)
        self.gru = nn.GRU(emb_size,
                          hidden_size,
                          num_layers=2,
                          direction='bidirectional')
        self.fc = nn.Linear(hidden_size * 2, label_num + 2)  # BOS EOS
        self.crf = LinearChainCrf(label_num)
        self.decoder = ViterbiDecoder(self.crf.transitions)

    def forward(self, x, lens):
        embs = self.word_emb(x)
        output, _ = self.gru(embs)
        output = self.fc(output)
        _, pred = self.decoder(output, lens)
        return output, lens, pred

(三)、模型构建

network = BiGRUWithCRF2(300, 300, len(word_vocab), len(label_vocab))
model = paddle.Model(network)
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
crf_loss = LinearChainCrfLoss(network.crf)
chunk_eval(label_list=label_vocab.keys(), suffix=True)
model.prepare(optimizer, crf_loss, chunk_evaluator)

model.fit(train_data=train_loader,
            eval_data=dev_loader,
            epochs=10,
            save_dir='./results',
            log_freq=1)

model.eval(eval_data=test_loader)


(四)、模型验证

outputs, lens, decodes = model.predict(test_data=test_loader)
preds = parse_decodes(test_ds, decodes, lens, label_vocab)

print('\n'.join(preds[:5]))

二、概念解释

(一)、门控循环单元GRU

BIGRU是一种经典的循环神经网络(RNN,Recurrent Neural Network),前面一些步骤基本是把该模型当做是黑盒子来用,这里我们重点解释下其概念和相关原理。一个 RNN 的示意图如下所示:

image.png

左边是原始的 RNN,可以看到绿色的点代码输入 x,红色的点代表输出 y,中间的蓝色是 RNN 模型部分。橙色的箭头由自身指向自身,表示 RNN 的输入来自于上时刻的输出,这也是为什么名字中带有循环(Recurrent)这个词。

右边是按照时间序列展开的示意图,注意到蓝色的 RNN 模块是同一个,只不过在不同的时刻复用了。这时候能够清晰地表示序列标注模型的输入输出。

GRU为了解决长期记忆和反向传播中梯度问题而提出来的,和LSTM一样能够有效对长序列建模,且GRU训练效率更高。


(二)、条件随机场CRF

长句子的问题解决了,序列标注任务的另外一个问题也亟待解决,即标签之间的依赖性。举个例子,我们预测的标签一般不会出现 P-B,T-I 并列的情况,因为这样的标签不合理,也无法解析。无论是 RNN 还是 LSTM 都只能尽量不出现,却无法从原理上避免这个问题。下面要提到的条件随机场(CRF,Conditional Random Field)却很好的解决了这个问题。 ​ 条件随机场这个模型属于概率图模型中的无向图模型,这里我们不做展开,只直观解释下该模型背后考量的思想。一个经典的链式 CRF 如下图所示, ​ image.png

CRF 本质是一个无向图,其中绿色点表示输入,红色点表示输出。点与点之间的边可以分成两类,一类是 $x$ 与 $y$ 之间的连线,表示其相关性;另一类是相邻时刻的 $y$ 之间的相关性。也就是说,在预测某时刻 $y$ 时,同时要考虑相邻的标签解决。当 CRF 模型收敛时,就会学到类似 P-B 和 T-I 作为相邻标签的概率非常低。


总结

本系列文章内容为根据清华社出版的《自然语言处理实践》所作的相关笔记和感悟,其中代码均为基于百度飞桨开发,若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

最后,引用本次活动的一句话,来作为文章的结语~( ̄▽ ̄~)~:

【**学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。**】

在这里插入图片描述

标签:NLP,word,进阶,emb,self,label,LSTM,model,RNN
From: https://blog.51cto.com/u_15745546/5746474

相关文章

  • 【自然语言处理(NLP)】基于BiLSTM+CRF的事件抽取
    【自然语言处理(NLP)】基于BiLSTM+CRF的事件抽取作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实......
  • 线段树( 进阶 )
    线段树蓝某杯省赛比赛结束后,倒数第二题是线段树,但是我没想到怎么建树。时隔几个月,蓝某杯国赛结束后,这题线段树可以做,但是我没写出来。(这是我一个朋友[doge])简介​ 线......
  • java 中级进阶高级 java 23种设计模式 视频教程 详细介绍+代码详解 +应用场景分析+
    ​​​​java中级进阶高级23种设计模式详细介绍+代码详解2019-04-06日最新更新蒋浩宇技术总监/CTO/高级工程师/技术专家主要讲解关于java、python、c++、前段、html5、jq......
  • LSTM算法实践系列(二)
    初步了解算法概念算法作为抽象概念,在实际生活中发挥了极大的具象作用:打工人如何保证最节省时间又花费最少来选择每天必须的通勤路径及方式,如何调度员工在有限时间内更高效的......
  • PaddleNLP基于ERNIR3.0文本分类:WOS数据集为例(层次分类)
    相关项目链接:​​Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】​​​​Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)​​​​应用实践......
  • PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(
    相关项目链接:​​​Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】​​​​Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)​​​​应用实......
  • Python:从入门到进阶
    导读本文将推荐一个Github开源项目:python-tutorial。本Python教程包含了一些范例,涵盖了大多数Python日常脚本任务,是入门Python的学习资料,也可以作为工作中编写Python脚本......
  • 【自然语言处理(NLP)】基于PaddleHub的文本审核
    【自然语言处理(NLP)】基于PaddleHub的文本审核作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践......
  • JAVA 进阶第一阶段 59-69
    10/10号笔记用private在类中定义的成员变量只有在这个类的内部才支持访问和编写public公共的用这个定义的在任何地方都可以访问 比如publiccalssclock 、定义......
  • 基于LSTM网络的视觉识别研究与实现——简化版
    1.问题描述:        以人脸图像的视觉识别为研究对象,研究了基于LSTM长短期记忆单元网络的视觉识别算法,通过使用卷积神经网络学习人脸图像的特征信息,然后使用LSTM网......