实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,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命名实体识别实战相关推荐

  1. 【项目实战课】基于BiLSTM+CRF的命名实体识别实战

    欢迎大家来到我们的项目实战课,本期内容是<基于BiLSTM+CRF的命名实体识别实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...

  2. Bi-LSTM-CRF命名实体识别实战

    一.数据集介绍 本项目的数据集来自于天池--基于糖尿病临床指南和研究论文的实体标注构建(瑞金医院MMC人工智能辅助构建知识图谱大赛第一赛季).即提供与糖尿病相关的学术论文以及糖尿病临床指南,要求在学术 ...

  3. 命名实体识别实战(BERT)

    命名实体识别实例(BERT) 一.背景 二.数据预处理 三.训练模型 四.对预测结果进行转换 一.背景 本实例是当时参加第八届泰迪杯数据挖掘挑战赛C题的一部分,该赛题是智慧政务方面的,主要是根据群众的 ...

  4. NLP——序列标注之命名实体识别

    1.概述 序列标注包括自然语言处理中的分词,词性标注,命名实体识别,关键词抽取,词义角色标注等.解决方案是NN模型(神经网络模型)+CRF 命名实体识别(Named Entity Recognitio ...

  5. 系统学习NLP(十一)--命名实体识别

    转自:https://www.cnblogs.com/bep-feijin/articles/9650898.html 命名实体识别(Named EntitiesRecognition, NER)是自 ...

  6. 【nlp学习】中文命名实体识别(待补充)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.中文分词 二.命名实体识别 1.数据处理 2.训练 3.使用预训练的词向量 4.测试训练好的模型 5.准确度判断 ...

  7. NLP实战:面向中文电子病历的命名实体识别

    一.前言 本篇文章是关于NLP中的中文命名实体识别(Named Entity Recognition,NER)的实战项目,该项目利用了大型预训练语言模型BERT和BiLSTM神经网络结构来进行NER任 ...

  8. 信息抽取实战:命名实体识别NER【ALBERT+Bi-LSTM模型 vs. ALBERT+Bi-LSTM+CRF模型】(附代码)

    实战:命名实体识别NER 目录 实战:命名实体识别NER 一.命名实体识别(NER) 二.BERT的应用 NLP基本任务 查找相似词语 提取文本中的实体 问答中的实体对齐 三.ALBERT ALBER ...

  9. 自然语言处理(NLP)之命名实体识别

    本文将会简单介绍自然语言处理(NLP)中的命名实体识别(NER). 命名实体识别(Named Entity Recognition,简称NER)是信息提取.问答系统.句法分析.机器翻译等应用领域的重要 ...

最新文章

  1. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )
  2. php 配置域名与端口号,lnmp 配置不同端口号的域名
  3. PAT甲级1152 Google Recruitment :[C++题解]判质数
  4. 我的Go+语言初体验--Go+之环境安装与程序编码初体验
  5. adf435编程_动态ADF列车:以编程方式添加列车停靠点
  6. activiti7流程设计器_基于容器和微服务应用的架构:容器设计原则
  7. 工作流实战_03_flowable 流程模板部署
  8. 复制:王垠:数学和编程
  9. java x509certificate2_ASP.NET使用X509Certificate2出现一系列问题的解决方法
  10. EShop网上商城项目(二)
  11. Chrome 成为互联网看门人?!
  12. matlab 7.0安装教程
  13. Life:歌曲学习之教一个不会唱歌的人学会唱出《情非得已》、《海阔天空》、《红日》、《老男孩》等歌曲
  14. Java Web调用Matlab实现在线绘图
  15. esp分区创建 linux_怎样向esp分区添加引导文件?
  16. 全差分运算放大器浅析
  17. PostgreSQL 中 sequence 的用法
  18. Rita Hayworth and Shawshank Redemption
  19. java.lang.IllegalStateException: No value for key [DynamicDataSource@e5f43124] bound to thread
  20. 如何快速提取视频中的文案?

热门文章

  1. shiro教程:记住我功能
  2. junit进行测试加载多个spring配置文件
  3. 《MyBatis技术原理与实战》之动态SQL
  4. 算法--三种方法求连续子数组的最大和
  5. 11--MySQL数据查询应用(实战)(二)
  6. (Spring)概述及IOC
  7. 最简单最详细的SpringBoot入门项目——HelloWorld
  8. 剑指offer(牛客)——从尾到头打印链表
  9. Gentoo 安装日记 17(修改/etc/fstab)
  10. linux 平均磁盘请求数量,Linux之 iostat 解读磁盘io