首页 > > > 6.2 基于循环神经网络的NER
前言
在上一节中,我们已经详细讲解了关于循环神经网络的知识内容,那么在这一节我们将要使用这个网络去训练一个NER。首先要说的是,和其它的基于深度学习的解决方案一样,解决这类问题也不是仅仅限于一种模型结构。由于深度学习是一种渴望End-to-End的训练方式的解决方案,所以其结构仍然会关注于“输入”、“输出”、“网络结构”、“损失函数”这4个要素,而特征与逻辑都是网络中靠丰富的感知器来获得的。
为了让大家有比较直观的感觉,我们以中文的NER模型为例说明一下这4个要素通常怎么来确定。
输入
首先,确定“输入”是什么。“输入”就应该是一个文本的段落,或者说一句话,而且不定长,这个应该没什么问题。
比如这样一句话:“前年张小明去深圳参加了第1届赛事,后来就没去过。”这就是一个非常标准的输入。不过通常来说,训练一个NER模型都是要把每个字符(Character)做一个Embedding后再输入模型的。如果是英文的话,那就是每个单词(Word)Embedding后再输入模型。
输出
“输出”,其实也就是标签。对于一个NER模型来说,其实主要是为了输出某个位置上的这个字符是什么,是不是我们要识别出来的对象。以我们平时最喜欢识别的对象来举例子吧,比如我们想识别出来地名和人名,那么就可以标注成LOC(Location,地名)和PER(Person,人名)。那么标注的时候其实可以标注成这样:
““前(O)年(O)张(B-PER)小(I-PER)明(E-PER)去(O)深(B-LOC)圳(E-LOC)参(O)加(O)了(O)第(O)1(O)届(O)赛(O)事(O),后(O)来(O)就(O)没(O)去(O)过(O)。”
这里的“O”我们就认为是其它(Other)就可以了,PER和LOC前面的B、I、E分别代表Begin、Inner、End三种属性,分别代表这是要识别的这种命名实体的起始位置,中间位置和终止位置。如果这么一标记的话,等于我是需要让模型输出一个序列,这个序列的每个输出位置是一个分类信息,分类内容是由O、B-PER、I-PER、E-PER、B-LOC、I-LOC、E-LOC组成的输出序列。是的,基本就是这样一个思路。
模型结构
我上一节中我们提到过,循环神经网络是非常适合用来解决序列性数据的,比如语言数据。像语言这种东西,它是上下文有关的,知道上下文信息是比较容易对当前信息做正确判断的,上文我们已经介绍过了。
在这种命名实体识别中也是有着非常明显的这种特征。比如:
“前年张小明去深圳参加了第1届赛事”这个短句,即便我不认识张小明是谁,即便我不知道深圳是个城市,或者我把这部分干脆抹掉变成“前年XXX去YY参加了第1届赛事”,我仍然可以判断出XXX的内容可能是一个人名,YY应该是一个地名。这就是上下文对命名实体判断的影响。我们现在需要设计一个模型,让模型在大量文段中把它们识别出来。

Bi-LSTM+CRF的NER模型结构
我们就以一个最简单的Bi-LSTM+CRF的NER模型为例吧。长度不见得就这么长,可以更长一些,我们就用这几个字符长度做个示意。
输入就是每个字的Embedding向量,可以直接用第三方训练好的Embedding模型来加工生成这个向量,也可以用自己训练的模型来生成。
中间的FW代表Forward,正向传播;BW代表Backward,反向传播。这两层就是Bi-LSTM的RNN层,也就是Encoder层。作用就是让这个输出的编码要“瞻前顾后”,采纳所有输入位置对当前位置定性的影响。
最后一层就是期望输出每个字符位置的性质,是其它,还是一个人名的起始位置,还是一个地名的终止位置……
模型就这个样子,最重要的是定义什么叫损失,我们这里介绍一个新的概念,叫做条件随机场。
损失函数(CRF)
条件随机场,英文叫做Conditional Random Fields,CRF是它的简写。
什么叫条件随机场呢?我们结合着这个NER例子来说就会感觉明确一些,至少比单纯读公式要友好一点。不要被它陌生的名字吓坏,条件随机场也是一种贝叶斯体系下的模型,简单说在这种评价观念下,“场”的数据要显得协调才算好。
比如,我们考虑一个非常简化的场景,来给一个句子标主谓宾语,这跟标注命名实体在本质上是一样的:
“苹果是伟大的公司”——在这个句子输入后,我们希望模型为我们输出的推理结果是:
“苹果”——主语,
“是”——谓语,
“伟大的”——定语,
“公司”——宾语。
这是一个标准的句子成分划分的结果。换句话说,这是一种协调的结果。之所以能够输出协调的结果是因为我们事先用大量高质量的语料训练了模型,让它学到了“协调”划分的能力。当然也就意味着,我们要先标注大量的高质量的“主谓宾定状补”成分齐全的正确语料才可以。只要语料够多,模型是一定能够学出划分的方法的。以前初中的时候学过一个口诀怎么说来的“主谓宾、定状补,主干枝叶分清楚,定语必在主宾前,谓前有状谓后补,定的状地得后补”。这是人总结出来的特征,到机器上它也能够通过大量的统计样本把它学到的。
因此,在一个模型对句子的“主谓宾定状补”划分的时候一定是要划分成与训练样本特征相对一致的才算合理——这是训出来的结果。如果划分错了,比如划成了:
“苹果是”——主语,
“伟大”——谓语,
“的公司”——宾语,
或者
“苹果”——主语,
“是”——谓语,
“伟大的”——谓语,
“公司”——补语。
这两种很显然都是看上去非常不协调的划分结果,第一种是断句都没断对地方,那么每个词的特征相当于没有学到位;第二种是句子成分不符合语法规范,并不是因为这些词不能充当对应的句子成分,而是因为根本不可能有“主语、谓语、谓语、补语”的结构。因此,就是需要让模型学到一种协调划分词汇和成分的方法,这就需要用到一种跟Softmax那种预测孤立的分类不一样的手段——这就是CRF的能力。
回过来看NER里面也是这样,你需要在一篇文章中,识别一个表示地点的名词,一个表示人名的名词,一个表示工作单位的名词,除了用正则表达式去做匹配的方法我们不讨论以外,只要你要用基于深度学习的NER技术,那就一定是刚才说的这种方式——让它在大量语料中学到这种协调的特性,“XXX去了YYYY当老师”,不用说“XXX”就是一个人“YYYY”就是一所教育组织。
本节主要讲解了使用循环神经网络进行NER工程的方法,NER工程在深度学习的加持下有了极大的进展。从工程角度看,它实现了端到端(End to End)的工作流,减少了中间环节出现的误差。从准确性上看,依靠深度学习强大的拟合能力,在准确率上面获得了很大的提升。在下一节,我们将使用NER实现一个小案例,如你对本节有疑问,欢迎在留言区和我讨论。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69954080/viewspace-3130847/ ,如需转载,请注明出处,否则将追究法律责任。