最近刚刚做了一个相关任务的学习、比较、调研及代码实践,特此分享。
本篇文章主要包括以下几个部分:任务目标、国内外相关工作、核心思想和算法描述、实验结果及分析、总结等。
1 任务目标
命名实体识别(Named Entities Recognition, NER)是自然语言处理(Natural Language Processing, NLP)的一个基础任务,其目的是识别语料中人名、地名、组织机构名、专有名词等命名实体,在所有涉及NLP的人工智能研究——信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术中——都是一个必须首先攻克的任务。由于这些命名实体数量不断增加,通常不可能在词典中穷尽列出,且其构成方法具有各自的一些规律性,因而,通常把对这些词的识别从词汇形态处理(如汉语切分)任务中独立处理,称为命名实体识别。
命名实体识别的研究主体一般包括3大类(实体类、时间类和数字类)和7小类(人名、地名、机构名、时间、日期、货币和百分比)命名实体。实际研究中,命名实体的确切含义需要根据具体应用来确定,比如,可能需要把产品名称、旅游景点名称等作为命名实体。在面向生物命名实体信息提取时,还包括蛋白质、基因、核糖核酸、脱氧核糖核酸、细胞等特殊生物实体。NER系统就是从非结构化的输入文本中抽取出上述实体,并且可以按照业务需求识别出跟多类别的实体,比如产品名称、型号、价格等等。因此实体这个概念可以很广,只要是业务需求的特殊文本片段都可以称为实体。
由于数量、时间、日期、货币等实体识别通常可以采用模式匹配的方式获得较好的识别效果,相比之下人名、地名、机构名较复杂,因此近年来的研究主要以这几种实体为主。同时生物领域的实体识别也比较活跃。这些实体中以机构名和生物实体识别难度最大,普遍存在嵌套和缩写的识别问题。从研究的发展趋势上看,由原来的单独针对人名、地名等进行识别发展到开始采用统一的方法同时进行各类中文命名实体的识别,而且识别效果也得到了提高。
本项目将通过pytorch作为主要工具实现解决中文命名实体识别问题的不同模型(包括HMM,CRF,Bi-LSTM,Bi-LSTM+CRF),学习对比经典模型的思想和方法,并对其结果性能进行比较分析。
2 国内外相关工作
目前命名实体识别的主要方法可以归纳为3类: 基于规则的方法、基于统计的方法和基于深度学习的方法。基于规则和字典的方法存在人力成本高、移植性差等缺点。因此,人们开始研究统计机器学习处理NER问题。在机器学习命名实体识别中,NER被看成是一个序列标注问题。
在统计机器学习中,常常采用HMM和CRF等模型处理NER标注问题。随着深度学习的引入,当前主流的深度学习解决方案中倾向于embedding层+bilstm层,直接让机器学习到特征,然后将学习到的特征直接输入CRF,这就避免了人工制定特征函数的繁琐。
基于规则的方法已经积累了大量的研究成果。例如,周昆[1-2]等构建了命名实体识别的规则库,采用规则匹配的方法来识别命名实体。此类方法中规则编写需要领域专家来参与,这样对语言知识的要求很高,可移植性不好。
基于统计的方法主要使用统计学的方法来完成命名实体识别任务[3-5]。在近几年的研究中,通常将命名实体识别任务当作一个序列标注任务[6]来处理。适用于做序列标注任务的主要算法有: 隐马尔可夫模型( hidden markov models,HMM) 、最大熵马尔科夫模型( maximum entropy markov models,MEMM) 、条件随机场模型( conditional random field,CRF) 等。
基于深度学习的方法,由于不需要人为设定特征,能够从原始数据中自主的学习,因此可以减少人为对数据的干扰,找到更深层次和更加抽象的特征,近年来成为研究热点。文献[7]利用神经网络模型在大量没有标记的数据集上学习文本的内部表示,不需要人为的设定特征。文献[8]采用了长短时记忆( long short-term memory,LSTM) [9]神经网络模型,很好地提高了分词的性能,但是该方法无法获取句子后面的语义信息。文献[10]提出在双向LSTM 的基础上,同时使用CRF 来作为输出处理层的处理方式,有效提高了模型的性能。
3 核心思想和算法描述
3.1隐马尔可夫模型(Hidden Markov Model,HMM)
隐马尔可夫模型描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐马尔可夫模型由初始状态分布,状态转移概率矩阵以及观测概率矩阵所确定。
HMM中,有5个基本元素:{N,M,A,B,π},结合序列标注任务对这5个基本元素做一个介绍:N:状态的有限集合,指每一个词语背后的标注;M:观察值的有限集合,指每一个词语本身;A:状态转移概率矩阵,指某一个标注转移到下一个标注的概率;B:观测概率矩阵,指在某个标注下,生成某个词的概率;π:初始概率矩阵,指每一个标注的初始化概率。
以上的这些元素,都是可以从训练语料集中统计出来的。最后,根据这些统计值,应用维特比(viterbi)算法,就可以算出词语序列背后的标注序列了。命名实体识别本质上就是序列标注,只需要自己定义好对应的标签以及模式串,就可以从标注序列中提取出实体块了。
简单的隐马尔科夫模型事例:
其中x = (x1, x2, …, xN) 为隐状态序列,y = (y1, y2, …, yN) 为观测序列,(注意这里的箭头指向,隐状态x即为我们这里的所要求的标注,而观测序列y是我们输入的句子,而这里的隐状态x是指向y的。把我们所要求的标注信息看成是一种隐状态,而输入的句子看作是一种观测值,而他们之间的关系是:由隐状态而推出观测状态)要求的预测问题为:
依据马尔科夫假设,上式等价于:
在隐马尔科夫链中,任意时刻t下状态的值有多个,以拼音转汉字为例,输入拼音为“yike”可能有的值为一棵,一刻或者是一颗等待,用符号xij表示状态xi的第j个可能值,将状态序列按值展开,就得到了一个篱笆网了,这也就是维特比算法求解最优路径的图结构:
隐马尔科夫的预测问题就是要求图中的一条路径,使得该路径对应的概率值最大。 对应上图来讲,假设每个时刻x可能取的值为3,如果直接求的话,有3^N的组合数,底数3为篱笆网络宽度,指数N为篱笆网络的长度,计算量非常大。维特比利用动态规划的思想来求解概率最大路径(可理解为求图最短路径),使得复杂度正比于序列长度,复杂度为O(N⋅D⋅D), N为长度,D为宽度,从而很好地解决了问题的求解。
参考:https://blog.csdn.net/gzmfxy/article/details/78712878
3.2 条件随机场(Conditional Random Field, CRF)
上面讲的HMM模型中存在两个假设,一是输出观察值之间严格独立,二是状态转移过程中当前状态只与前一状态有关。也就是说,在命名实体识别的场景下,HMM认为观测到的句子中的每个字都是相互独立的,而且当前时刻的标注只与前一时刻的标注相关。但实际上,命名实体识别往往需要更多的特征,比如词性,词的上下文等等,同时当前时刻的标注应该与前一时刻以及后一时刻的标注都相关联。由于这两个假设的存在,显然HMM模型在解决命名实体识别的问题上是存在缺陷的。
而条件随机场就没有这种问题,它通过引入自定义的特征函数,不仅可以表达观测之间的依赖,还可表示当前观测与前后多个状态之间的复杂依赖,可以有效克服HMM模型面临的问题。
CRF是一种基于统计的序列标记和分割数据的方法。CRF 是一种无向图模型,可以用于序列标注问题。条件随机场是在给定需要标记的观测序列的条件下,计算整个序列的联合概率,而不是计算在给定当前观测序列的条件下,计算下一个序列的概率。
为了建立一个条件随机场,我们首先要定义一个特征函数集,该函数集内的每个特征函数都以标注序列作为输入,提取的特征作为输出。假设该函数集为:
其中x表示观测序列,s 表示状态序列。然后,条件随机场使用对数线性模型来计算给定观测序列下状态序列的条件概率p(s|x;w).w是条件随机场模型的参数,可以把它看成是每个特征函数的权重。CRF模型的训练其实就是对参数 w 的估计。模型训练结束之后,对给定的观测序列 x ,可得到其最优状态序列、然后同样利用维特比算法解码即可。
3.3 Bi-LSTM
除了以上两种基于概率图模型的方法,LSTM也常常被用来解决序列标注问题。和HMM、CRF不同的是,LSTM是依靠神经网络超强的非线性拟合能力,在训练时将样本通过高维空间中的复杂非线性变换,学习到从样本到标注的函数,之后使用这个函数为指定的样本预测每个token的标注。
单向的LSTM 神经网络模型,只能获取句子的上文信息,对于句子后文的上下文信息无法获取。BI-LSTM 神经网络模型,可以从前向和后向2 个方向对句子进行建模,这样既能保存前面的上下文信息,也能同时考虑到句子未来的上下文信息,使其在中文命名实体识别任务中可以取得更好的效果。可以看出,BI-LSTM 模型分别从前向和后向对句子进行建模,然后将前向和后向的结果相加起来作为下一层的输入,以这样的方式实现了对句子的双向建模。下方就是使用双向LSTM(双向能够更好的捕捉序列之间的依赖关系)进行序列标注的示意图:
参考:https://www.jianshu.com/p/9b3b2696ed63
LSTM简介:
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。因此简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
它与一般的RNN 结构上并没有本质的区别,只是使用了不同结构的隐藏单元结构,在LSTM 中存在一个被称为Cell 的结构,它由3 个门结构和1 个细胞状态组成,LSTM 的记忆单元主要由输入门、输出门和忘记门组成。输入门主要用于控制哪部分内容可以输入到细胞状态中,忘记门主要用于控制细胞状态中内容的存储,是继续存储细胞中的历史内容或者是忘记细胞中的内容; 输出门主要是用来控制哪些细胞状态中的内容可以被输出。
3.4 Bi-LSTM+CRF
简单的LSTM的优点是能够通过双向的设置学习到观测序列(输入的字)之间的依赖,在训练过程中,LSTM能够根据目标(比如识别实体)自动提取观测序列的特征,但是缺点是无法学习到状态序列(输出的标注)之间的关系,要知道,在命名实体识别任务中,标注之间是有一定的关系的,比如B类标注(表示某实体的开头)后面不会再接一个B类标注,所以LSTM在解决NER这类序列标注任务时,虽然可以省去很繁杂的特征工程,但是也存在无法学习到标注上下文的缺点。
相反,CRF的优点就是能对隐含状态建模,学习状态序列的特点,但它的缺点是需要手动提取序列特征。所以一般的做法是,在LSTM后面再加一层CRF,以获得两者的优点。Bi-LSTM layer的输出维度是tag size,这就相当于是每个词Wi映射到tag的发射概率值,设Bi-LSTM的输出矩阵为P,其中Pi,j代表词Wi映射到tagj的非归一化概率。对于CRF来说,我们假定存在一个转移矩阵A,则Ai,j代表tagi转移到tagj的转移概率。
下方就是使用Bi-LSTM+CRF进行序列标注的示意图:
3 主要模块流程
1.HMM
首先是HMM三要素的定义:
1)初始状态概率 Pi[i]表示初始时刻为状态i的概率
2)状态转移概率矩阵 A[i][j]表示从i状态转移到j状态的概率
3)观测概率矩阵, B[i][j]表示i状态下生成j观测的概率
然后根据训练数据利用最大似然的方法估计模型的三个要素,模型训练完毕之后,要利用训练好的模型进行解码,就是对给定的模型未见过的句子,求句子中的每个字对应的标注,针对这个解码问题,我们使用的是维特比(viterbi)算法。并最终返回序列标注信息。
2.CRF
首先是序列的特征函数集的建立sent2features(sent),包括当前词、前后词及偏置等;
然后借助一个外部库函数进行模型训练from sklearn_crfsuite import CRF,并最终解码输出。
3.Bi-LSTM
神经网络作为端到端的任务代表,相对于之前的任务可以说是简单粗暴,直接建立网络模型加载数据进行训练、解码预测即可。
包括词嵌入层nn.Embedding()、BiLSTM层nn.LSTM、最后线性输出层nn.Linear()及最后的解码返回torch.max()。
4.Bi-LSTM+CRF
模型的第一层是词嵌入层,利用预训练或随机初始化的embedding矩阵将句子中的每个字 由one-hot向量映射为低维稠密的字向量;
模型的第二层是双向LSTM层,自动提取句子特征。将一个句子的各个字的char embedding序列 (x1,x2,…,xn)作为双向LSTM各个时间步的输入,再将正向LSTM输出的隐状态序列 (h1⟶,h2⟶,…,hn⟶)与反向LSTM的 (h1⟵,h2⟵,…,hn⟵)在各个位置输出的隐状态进行按位置拼接得到完整的隐状态序列;在设置dropout后,接入一个线性层,将隐状态向量从m维映射到k维,k是标注集的标签数,从而得到自动提取的句子特征,记作矩阵P。可以把 pi的每一维pij都视作将字xi分类到第j个标签的打分值,如果再对 P进行Softmax的话,就相当于对各个位置独立进行k类分类。但是这样对各个位置进行标注时无法利用已经标注过的信息,所以接下来将接入一个CRF层来进行标注。
模型的第三层是CRF层,进行句子级的序列标注。CRF层的参数是一个 (k+2)×(k+2)的矩阵A,Aij表示的是从第i个标签到第j个标签的转移得分,进而在为一个位置进行标注的时候可以利用此前已经标注过的标签,之所以要加2是因为要为句子首部添加一个起始状态以及为句子尾部添加一个终止状态。
参考:https://www.jianshu.com/p/09af2dc2b65d
4 实验结果及分析
总体目录结构如下:ckpts存放训练好的模型,models存放网络配置文件,ResumeNER存放使用数据,main.py用于训练模型,test.py用于模型评估,test.ipynb进行一些个人定制化测试。
1.在给定测试句子及对应词标注的情况下,各种模型最终的预测性能如下所示:
直接运行python3 test.py即可:
1)hmm模型评估效果:
bilstm+crf模型评估效果:
2.直接随机输入测试句子,其识别标注效果如下:
运行程序文件为python3 test1.py:
在这里对于直接输入的句子,利用4种模型进行分别预测,其对比结果如下:
如箭头所指示:第一个箭头表示随机输入的句子;后四个箭头分别表示四个模型的预测结果:
根据如上预测结果,可以说是效果并不是很理想;原因在于,训练集是基于特定应用环境的,并且数据量较小,所以在这里的预测效果应该是可以接受的。
接下来的任务,可以主要集中于数据集的扩展,当然对于模型的优化以及新模型的研究探索还是非常有必要的。
5 总结
当我们真正的去面对一个实际问题时,并把他与我们所学到的知识相联系从而去一步步优化解决他,更能够达到一个融会贯通的程度。
不论是传统方法还是深度学习的方法,都是值得我们去学习探索的,经典的思想总是可以给人以启发,以帮助我们为了更好的未来科研。
其实重要的是发现问题、联系方法并解决问题的一个过程实践,不论我们现在、将来从事于任何一个方向,这些实验经历都是一通百通的。
参考文献
[1]周昆. 基于规则的命名实体识别研究[D]. 合肥: 合肥工业大学, 2010.
[2]郑家恒, 李鑫, 谭红叶. 基于语料库的中文姓名识别方法研究[J]. 中文信息学报, 2000, 14(1): 7-12.
[3]刘宝菊. 基于 HMM 的商标词识别研究与应用[D]. 西南交通大学, 2016.
[4]张玥杰, 徐智婷, 薛向阳. 融合多特征的最大熵汉语命名实体识别模型[J]. 计算机研究与发展, 2008, 45(6).
[5]郭家清, 蔡东风, 刘纪元. 基于条件随机场的命名实体识别研究[J]. 沈阳航空工业学院学报, 2007, 1.
[6]Chieu H L, Ng H T. Named entity recognition with a maximum entropy approach[C]//Proceedings of the seventh conference on Natural language learning at HLT-NAACL 2003-Volume 4. Association for Computational Linguistics, 2003: 160-163.
[7]Collobert R, Weston J, Bottou L, et al. Natural language processing (almost) from scratch[J]. Journal of machine learning research, 2011, 12(Aug): 2493-2537.
[8]Chen X, Qiu X, Zhu C, et al. Long short-term memory neural networks for chinese word segmentation[C]//Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. 2015: 1197-1206.
[9]Hochreiter S, Schmidhuber J. Long short-term memory[J]. Neural computation, 1997, 9(8): 1735-1780.
[10]Huang Z, Xu W, Yu K. Bidirectional LSTM-CRF models for sequence tagging[J]. arXiv preprint arXiv:1508.01991, 2015.