研二,研究方向终于确定下来了——中文命名实体识别(命名实体识别:NER)
一、NER研究现状
NER 的研究现状。方法上大体分为两类:基于统计机器学习、基于深度学习。近年来,硬件的飞速发展使得计算机的计算能力大幅度提升,再加上互联网普及产生的海量数据的支持,深度学习得以走出低谷,迎来了新一轮热潮。深度学习以神经网络为基本结构,因其具有从大量无标注语料中获取潜在语义信息的能力,使得研究者不必花时间去了解特定领域和语言学知识,也无需人工提取大量特征,有效地避免了人工特征工程的费时费力。尽管深度学习在文字处理方面的提升效果不如在视频、图像和语音那样显著,但是越来越多的研究者在 NLP 领域提出了各种各样的模型结构,使用 Deep Learning 处理 NER 问题正逐渐成为趋势。
目前英文NER效果最佳的模型是 LSTM-CRF,对于中文 NER,也可以使用这种模型。不过,中文文本不同于英文文本,需要预先对其进行分词(基于字的方法),尽管分词工具有很多(中科院 ICTCLAS、哈工大语言云、Python的 jieba 和 SnowNLP 等),但是分词效果不太可能是完美的。通俗来说,NER就是通过序列标注对实体边界和实体类别进行预测,从而识别和提取出相应的命名实体。所以,一旦出现分词错误,就会直接影响实体边界的预测,导致识别错误,这在开放领域是很严重的问题。
为了避免上述问题,研究者们开始尝试基于字符的方法。该方法无需分词,以每个字符为单位进行训练。虽然训练集规模变大,训练时间变长,但是研究表明,对于中文NER,基于字符的方法优于基于字的方法。但是,可以想到,由于没有进行分词,所以**基于字符的方法无法利用句子中的单词信息,这也会使得识别效果有瑕疵。**举个例子,比如一句话“南京市长江大桥”,如果没有单词信息,识别结果很可能为:南京,市长,江大桥。
二、网格结构的LSTM模型(Lattice LSTM)
这篇文章针对中文NER提出了一种网格结构的LSTM模型(Lattice LSTM),如下图所示。相对基于字符的方法(character-based),能够充分利用单词和词序信息;相比基于字的方法(word-based),不会因为分词错误影响识别结果。
该模型的核心思想是:通过Lattice LSTM表示句子中的单词,将潜在的词汇信息融合到基于字符的LSTM-CFR中。实际上,该模型的主干部分依然是基于字符的LSTM-CRF,只不过这个LSTM每个Cell内部的信息处理方式与基本的LSTM不同。因此,只要理解了这一点,就能掌握该模型的工作原理,下面对此具体讲解。
从上图可以看出,模型中有一些红色的Cell,他们是句子中潜在词汇产生的信息,同主干LSTM相应的Cell连接起来就构成了类似于网格的结构,也就是题目中的Lattice,那么这些红色Cell如何融合到主干LSTM呢?
如下图所示,基本的LSTM结构中,每个Cell含有输入门、遗忘门和输出门,它们都是0~1的小数(默认激活函数为Sigmoid),根据当前输入和前一个Cell的输出计算得到的。还有一个核心元素就是Cell State,也就是上面那条从左到右的箭头,它从头走到尾,记录整个序列的信息。输入门决定当前输入有多少加入Cell State;遗忘门决定Cell State要保留多少信息;输出门决定更新后的Cell State有多少可以输出。
基本LSTM的Cell内部算法如下,其中的参数、函数以及符号均为基础知识。
回到本文的Lattice LSTM 模型(截取局部进行说明),比如“桥”字,句子中潜在的以它结尾的词汇有:“长江大桥”和“大桥”。因此,当前字符Cell除了“桥”字以外,还要考虑这两个词汇。从图上看就是两个红色Cell引出的两个绿色箭头,代表这两个词汇的信息。
文章中对于词汇信息的算法如下图公式所示,每个词汇的红色Cell类似LSTM Cell 且相互独立。因为序列标记是以字符为级别,所以这个Cell中没有输出门,Cell State即为词汇信息。
其中,矩阵中的X和h分别表示词向量和词首字符Cell的输出。
由LSTM的思想可知,这些词汇信息不会全部融入当前字符Cell,因此要进行取舍。文章提出额外的门控单元(Additional Gate),根据当前字符和词汇信息来计算词汇信息权重,如下图公式所示。
其中,矩阵中的X和c分别代表当前字符的字符向量和当前词汇的Cell State。
然后,文章提出一种归一化算法求出当前字符Cell各种输入的权重,类似Softmax函数,如下如公式所示。分母看起来有点复杂,其实就是句子中以当前词结尾的所有词汇的权重以及当前字符输入门的求和(取以e为底的指数使得结果为正)。
最后,当前字符的Cell State就可以算出来了。
我之前不懂的点:
char+bichar:表示结合了自己的向量和两个字符的向量作为用来判断的向量。
github上面问了作者,他的确是已经提前准备好了词向量(用其他文本获得),然后再拿NER的文本与词向量进行匹配。