摘要
本文提出了一种用于中文NER的LSTM的格子模型,与传统使用字向量的模型相比,本文提出的模型显式地利用了字序列之间的关系。与传统使用词向量的模型相比,本文提出的模型能够很好的避免分词错误带来的影响。
介绍:
作为信息抽取任务的基本步骤,NER一直受到NLP学界的广泛关注。传统方法一般把NER看作是一个序列标记问题,同时预测序列中的实体边界以及实体所属的类别。
中文NER问题很大程度上取决于分词的效果,比如实体边界和单词的边界在中文NER问题中经常是一样的。所以在中文NER问题中,学者们通常先对文本进行分词然后再预测序列中单词的类别。这样一来会导致一个问题,即在分词中造成的错误会影响到NER的结果。
那么基于字向量的模型是不是就完美解决上述问题了呢?显然不会,因为如果单纯采用字向量的话会导致我们拆开了很多并不应该拆开的词语,从而丢失了它们本身的内在信息(比如“上海”这个词如果拆成字向量就成了“上”和“海”,这两个字的单独含义明显与它们组合起来的词的含义大相庭径)。
为了解决这个问题,本文提出了一种新型的格子结构(lattice structure),它能够将单词本身的含义加入基于字向量的模型中(比如LSTM-CRF)。
如上图所示,格子结构最终会包含一个我们自动学出来的词典里的词(比如图中的“南京”,“市长”,“长江”,“大桥”,“南京市”,“长江大桥”),这样一来,我们的模型就会避免一些使用字向量造成的歧义,比如上图如果按照一个个字来组合的话还能组成“南京”,“市长”,“江大桥”这样的组合,由于“江大桥”不在词格中,我们的模型就很好的避免了这种歧义。
如上图所示,如果图中每条路径都去考虑的话,那么路径的个数是指数级增长的,所以我们利用模型来控制从头到尾的信息流。
如上图所示,模型中的LSTM门结构会控制每条路径到其它路径的信息流。
与其它模型相比,本文提出的模型老牛逼了。
模型
本文提出的模型是基于在英文NER领域取得了最佳效果的LSTM-CRF模型改进的。
首先,我们以字为基本单位定义一个输入句子s为:
其中为s的第个字
s又可以用词为基本单位被表示为:
其中为s的第个词
我们设为句子的第个词的第个字在句子中的位置,比如“南京市,长江大桥”这句话中的“大”字,我们就有,即“大”这个字是句子第2个词的第3个字,并且它在句子中的位置为第7个字。
接下来我们来比较三种模型的特点
- 基于字向量的模型
如上图所示,是一个基于字序列的模型,其中每一个字被表示为:
其中是embedding层的权重矩阵,双向LSTM中每个方向每个时间点对应输入都会有一个隐含层状态,即,和
那么隐含层的总输出就可以表示为:
上述公式的含义就是将和给concat(拼接)起来 基于词向量的模型
如上图所示,原理和字向量的大同小异,就是将输入由字序列改成了词序列而已,本文不做赘述。-
词格模型(Lattice Model)
如图所示,和基于字向量的模型有些不同,的计算考虑到了词格中的词语序列,具体而言,每个都会被embedding表示为:
其中是embedding矩阵。此外,word cell 被用来表示从句首开始的每一个的递归状态。可以由如下公式计算:
其中和是LSTM的输入和遗忘门的集合。在词语的粒度上没有设置输出门,因为本文的模型本质上是一个基于字向量的模型。
有了词格之后,每个隐含层的的计算就会受很多路径上的信息流的影响,比如途中的就受和以及上一个隐含层输出的同时影响。
本文将所有的和cell 连接起来,我们使用一个额外的门来控制到的信息流:
于是的计算公式可以表示为:
上式中和被归一化成了和,故所有的和为1,所有的和也为1,归一化公式如下:
最后一个隐含层的输出的计算公式为:
在得到所有隐含层的输出之后(其中为一句话中字的个数),预测的label序列的概率可以表示为:
其中代表任意的label序列,是模型中针对每个的参数,是从到的bias
最后再使用first-order Viterbi算法找到概率最大的序列,就是最终的输出。
在给定人工标记的训练数据,我们在句子粒度上定义的损失函数(使用了L2正则)可以表示为: