【NLP实战系列】Tensorflow命名实体识别实战
实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试。
本篇介绍自然语言处理中一种非常重要的任务:命名实体识别。因为最常见的是Bilstm+CRF模型进行实体识别,本文介绍介绍另外一种有效的模型,Dilated-CNN+CRF模型,但是两种模型的代码都会给出。
作者&编辑 | 小Dream哥
1 命名实体识别任务介绍
笔者在这篇文章中,曾经系统的介绍过命名实体识别任务的相关概念和语料标注方式,不了解的同学可以先阅读这篇文章:
关于Bilstm和Dilated-CNN两个模型理论方面的内容,笔者在这篇文章中做了详细的介绍,不了解的同学可以先阅读这篇文章:
话不多说,既然是实战篇,我们就赶紧开始吧。
2 数据预处理
1) 查看数据格式
先了解一下数据格式,方便后面进行处理。如下图所示,语料为标准的BIO标注方式,每个字和标记之间用空格隔开,语料之间用一个空行隔开。
2)读取训练数据
def load_sentences(path, lower, zeros): 加载训练,测试,验证数据的函数
上面这个函数是用来读取训练,测试,验证数据的,该函数返回一个列表,如下图所示:
3) 标记格式转化
因为原始语料用的是BIO标注方法,但是BIOES标注形式包含了实体内更多的位置和边界信息,最好将其转化为BIOES的形式,方法如下:
def update_tag_scheme(sentences, tag_scheme):将IOB格式转化为BIOES格式。 保证语料上BIO格式##产生异常转化为BIOES
看看效果如何:
4)构造字典
经过上述步骤,虽然我们将数据读到了一个列表里组织了起来,但是一个一个的汉字及其标签,后面的LSTM或者CNN网络是没有办法处理的,需要进行词嵌入。在此之前需要构造2个字典,汉字字典和标签字典,然后将上面的汉字和标签转化成字典里的序号。看看代码是怎么做的:
def char_mapping(sentences, lower):#生成字典和mapping
def create_dico(item_list): #根据传入的列表,生成一个字典
#生成连个字典,id->word word->id
上述过程并不难理解,大家好好看看,我们看看生成的字典:
5) 根据字典组织好训练数据
训练时,应该是输入汉字序列,然后预测出一个BIO序列,所以我们的输入数据还需要整理,将汉字和标记分开,得到汉字序列及其标记序列,并且要将汉字及其标记转换成他们在字典里的序号,转化结果如下:
至此,我们将训练数据结构化的组织了起来,放在一个大列表里,并且列表里的数据通过生成的字典转化成了id。
3 模型实现
1)word embedding
我们将语料中的中文换成了他们在字典里的ID,了解词向量的同学都知道我们还需要对词进行词嵌入,后面的深度学习模型才能进行处理。不了解的同学可以找词向量的文章看一下。
下面看看如何实现:
def embedding_layer(self, char_inputs, seg_inputs, config, name=None)::param char_inputs: one-hot encoding of sentence
# 生成一个表,用于后面查表
# 查表,将词向量化
embedding.append(tf.nn.embedding_lookup(self.char_lookup, char_inputs))
# 分词的维度,可先不关注
embedding.append(tf.nn.embedding_lookup(self.seg_lookup, seg_inputs))
也许有同学会问,这里的词向量表是随机初始化的。如果我之前训练好了一份词向量,该如何使用呢?可以在定义好模型之后,char_lookup.assign函数为该词向量表赋值,参考如下:
通过embedding_layer,就将形状为[bacth_size, seq_length]的输入数据转化为形状为[bacth_size, seq_length,embeding_dim]的矩阵了。词向量化几乎是所有自然语言处理任务所必须要经过的步骤,读者务必弄明白。
2)构建dilated CNN模型
首先,做一些数据的维度变化,并做一次CNN特征提取。
def IDCNN_layer(self, model_inputs,param idcnn_inputs: [batch_size, num_steps, emb_size]
model_inputs = tf.expand_dims(model_inputs, 1)输入的尺寸 = [batch, in_height, in_width, in_channels]
use_cudnn_on_gpu=True)
#重复4次增强特征提取能力
#每次有3次卷积操作,前两次卷积膨胀系数为
1,后一次膨胀系数为2
%d" % i, #卷积核
w = tf.get_variable(
self.num_filter,
initializer=tf.contrib.layers.
xavier_initializer())
重复做卷积操作进行特征提取,膨胀卷积可以扩大卷积核的感受野,提高卷积操作对长序列特征的提取能力。同时加深深度,也可以进一步提高特征提取能力。如下,repeat times为4,dilation数组为[1,1,2]。
3)project层
用一个中间层,将CNN的输出转化为shape为[batch_size, num_steps, num_tags]的输出,后面可以接softmax作为输出,也可以接crf计算loss
4)CRF层计算loss
采用CRF计算损失几乎是序列标注问题的标准做法,关于CRF的相关问题,笔者在机器学习模型介绍条件随机场CRF一文中做了详细介绍,不了解的读者可以出门看看。
4 开始训练
在main文件开头的参数配置中,选择train为True:
flags.DEFINE_boolean("train", True, "Whether train the model")
执行python main.py即可以开始进行训练,学习率,batch_size,dropout等超参数,读者可以自行调整。
训练开始后,会有如下的打印信息,读者可以观察loss下降的趋势。
训练结束后,会在ckpt文件夹生成模型文件。
5 模型测试
在main文件开头的参数配置中,选择train为False:
flags.DEFINE_boolean("train", False, "Whether train the model")
我们看看结果是怎么样的:
输入“明天我想去深圳市”模型将“明天”作为TIME提取出来了,将“深圳市”作为LOC提取出来了。
至此,介绍了如何利用构建DI-CNN模型进行命名实体识别,代码在我们有三AI的github可以下载:https://github.com/longpeng2008/yousan.ai/tree/master/natural_language_processing
找到ner文件夹,执行python3 main.py就可以训练或者测试了。
总结
NER是一个非常基础,但是非常重要的任务,在具体的操作中,相信大家能够更为细致的体会NER任务的真正作用和意涵。
我们也会在知识星球还介绍了基于BERT来做NER的方法,感兴趣扫描下面的二维码了解。
读者们可以留言,或者加入我们的NLP群进行讨论。感兴趣的同学可以微信搜索jen104,备注"加入有三AI NLP群"。
下期预告:命名实体识别实践
知识星球推荐
扫描上面的二维码,就可以加入我们的星球,助你成长为一名合格的自然语言处理算法工程师。
知识星球主要有以下内容:
(1) 聊天机器人。考虑到聊天机器人是一个非常复杂的NLP应用场景,几乎涵盖了所有的NLP任务及应用。所以小Dream哥计划以聊天机器人作为切入点,通过介绍聊天机器人的原理和实践,逐步系统的更新到大部分NLP的知识,会包括语义匹配,文本分类,意图识别,语义匹配命名实体识别、对话管理以及分词等。
(2) 知识图谱。知识图谱对于NLP各项任务效果好坏的重要性,就好比基础知识对于一个学生成绩好坏的重要性。他是NLP最重要的基础设施,目前各大公司都在着力打造知识图谱,作为一个NLP工程师,必须要熟悉和了解他。
(3) NLP预训练模型。基于海量数据,进行超大规模网络的无监督预训练。具体的任务再通过少量的样本进行Fine-Tune。这样模式是目前NLP领域最火热的模式,很有可能引领NLP进入一个全新发展高度。你怎么不深入的了解?
转载文章请后台联系
侵权必究
往期精选
【NLP实战系列】Tensorflow命名实体识别实战相关推荐
- 【项目实战课】基于BiLSTM+CRF的命名实体识别实战
欢迎大家来到我们的项目实战课,本期内容是<基于BiLSTM+CRF的命名实体识别实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...
- Bi-LSTM-CRF命名实体识别实战
一.数据集介绍 本项目的数据集来自于天池--基于糖尿病临床指南和研究论文的实体标注构建(瑞金医院MMC人工智能辅助构建知识图谱大赛第一赛季).即提供与糖尿病相关的学术论文以及糖尿病临床指南,要求在学术 ...
- 命名实体识别实战(BERT)
命名实体识别实例(BERT) 一.背景 二.数据预处理 三.训练模型 四.对预测结果进行转换 一.背景 本实例是当时参加第八届泰迪杯数据挖掘挑战赛C题的一部分,该赛题是智慧政务方面的,主要是根据群众的 ...
- NLP——序列标注之命名实体识别
1.概述 序列标注包括自然语言处理中的分词,词性标注,命名实体识别,关键词抽取,词义角色标注等.解决方案是NN模型(神经网络模型)+CRF 命名实体识别(Named Entity Recognitio ...
- 系统学习NLP(十一)--命名实体识别
转自:https://www.cnblogs.com/bep-feijin/articles/9650898.html 命名实体识别(Named EntitiesRecognition, NER)是自 ...
- 【nlp学习】中文命名实体识别(待补充)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.中文分词 二.命名实体识别 1.数据处理 2.训练 3.使用预训练的词向量 4.测试训练好的模型 5.准确度判断 ...
- NLP实战:面向中文电子病历的命名实体识别
一.前言 本篇文章是关于NLP中的中文命名实体识别(Named Entity Recognition,NER)的实战项目,该项目利用了大型预训练语言模型BERT和BiLSTM神经网络结构来进行NER任 ...
- 信息抽取实战:命名实体识别NER【ALBERT+Bi-LSTM模型 vs. ALBERT+Bi-LSTM+CRF模型】(附代码)
实战:命名实体识别NER 目录 实战:命名实体识别NER 一.命名实体识别(NER) 二.BERT的应用 NLP基本任务 查找相似词语 提取文本中的实体 问答中的实体对齐 三.ALBERT ALBER ...
- 自然语言处理(NLP)之命名实体识别
本文将会简单介绍自然语言处理(NLP)中的命名实体识别(NER). 命名实体识别(Named Entity Recognition,简称NER)是信息提取.问答系统.句法分析.机器翻译等应用领域的重要 ...
最新文章
- 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )
- php 配置域名与端口号,lnmp 配置不同端口号的域名
- PAT甲级1152 Google Recruitment :[C++题解]判质数
- 我的Go+语言初体验--Go+之环境安装与程序编码初体验
- adf435编程_动态ADF列车:以编程方式添加列车停靠点
- activiti7流程设计器_基于容器和微服务应用的架构:容器设计原则
- 工作流实战_03_flowable 流程模板部署
- 复制:王垠:数学和编程
- java x509certificate2_ASP.NET使用X509Certificate2出现一系列问题的解决方法
- EShop网上商城项目(二)
- Chrome 成为互联网看门人?!
- matlab 7.0安装教程
- Life:歌曲学习之教一个不会唱歌的人学会唱出《情非得已》、《海阔天空》、《红日》、《老男孩》等歌曲
- Java Web调用Matlab实现在线绘图
- esp分区创建 linux_怎样向esp分区添加引导文件?
- 全差分运算放大器浅析
- PostgreSQL 中 sequence 的用法
- Rita Hayworth and Shawshank Redemption
- java.lang.IllegalStateException: No value for key [DynamicDataSource@e5f43124] bound to thread
- 如何快速提取视频中的文案?