天天看点

中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

原文链接

本文发表于自然语言处理领域顶级会议ACL 2018

原文代码实现

摘要

本文提出了一种用于中文NER的LSTM的格子模型,与传统使用字向量的模型相比,本文提出的模型显式地利用了字序列之间的关系。与传统使用词向量的模型相比,本文提出的模型能够很好的避免分词错误带来的影响。

介绍:

作为信息抽取任务的基本步骤,NER一直受到NLP学界的广泛关注。传统方法一般把NER看作是一个序列标记问题,同时预测序列中的实体边界以及实体所属的类别。

中文NER问题很大程度上取决于分词的效果,比如实体边界和单词的边界在中文NER问题中经常是一样的。所以在中文NER问题中,学者们通常先对文本进行分词然后再预测序列中单词的类别。这样一来会导致一个问题,即在分词中造成的错误会影响到NER的结果。

那么基于字向量的模型是不是就完美解决上述问题了呢?显然不会,因为如果单纯采用字向量的话会导致我们拆开了很多并不应该拆开的词语,从而丢失了它们本身的内在信息(比如“上海”这个词如果拆成字向量就成了“上”和“海”,这两个字的单独含义明显与它们组合起来的词的含义大相庭径)。

为了解决这个问题,本文提出了一种新型的格子结构(lattice structure),它能够将单词本身的含义加入基于字向量的模型中(比如LSTM-CRF)。

中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

如上图所示,格子结构最终会包含一个我们自动学出来的词典里的词(比如图中的“南京”,“市长”,“长江”,“大桥”,“南京市”,“长江大桥”),这样一来,我们的模型就会避免一些使用字向量造成的歧义,比如上图如果按照一个个字来组合的话还能组成“南京”,“市长”,“江大桥”这样的组合,由于“江大桥”不在词格中,我们的模型就很好的避免了这种歧义。

如上图所示,如果图中每条路径都去考虑的话,那么路径的个数是指数级增长的,所以我们利用模型来控制从头到尾的信息流。

中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

如上图所示,模型中的LSTM门结构会控制每条路径到其它路径的信息流。

与其它模型相比,本文提出的模型老牛逼了。

模型

本文提出的模型是基于在英文NER领域取得了最佳效果的LSTM-CRF模型改进的。

首先,我们以字为基本单位定义一个输入句子s为:

s=c1,c2,...,cm s = c 1 , c 2 , . . . , c m

其中 cj c j 为s的第 j j 个字

s又可以用词为基本单位被表示为:

s=w1,w2,...,wns=w1,w2,...,wn

其中 wi w i 为s的第 i i 个词

我们设t(i,k)t(i,k)为句子的第 i i 个词的第kk个字在句子中的位置,比如“南京市,长江大桥”这句话中的“大”字,我们就有 t(2,3)=7 t ( 2 , 3 ) = 7 ,即“大”这个字是句子第2个词的第3个字,并且它在句子中的位置为第7个字。

接下来我们来比较三种模型的特点

  1. 基于字向量的模型
    中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

    如上图所示,是一个基于字序列 c1,c2,...,cm c 1 , c 2 , . . . , c m 的模型,其中每一个字 cj c j 被表示为: xcj=ec(cj) x j c = e c ( c j )

    其中 ec e c 是embedding层的权重矩阵,双向LSTM中每个方向每个时间点对应输入 x1,x2,...,xm x 1 , x 2 , . . . , x m 都会有一个隐含层状态,即 hc1→,hc2→,...,hcm−→ h 1 c → , h 2 c → , . . . , h m c → ,和 hc1←,hc2←,...,hcm←− h 1 c ← , h 2 c ← , . . . , h m c ←

    那么隐含层的总输出就可以表示为: hcj=[hcj→;hcj←] h j c = [ h j c → ; h j c ← ]

    上述公式的含义就是将 hcj→ h j c → 和 hcj← h j c ← 给concat(拼接)起来

  2. 基于词向量的模型
    中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》
    如上图所示,原理和字向量的大同小异,就是将输入由字序列改成了词序列而已,本文不做赘述。
  3. 词格模型(Lattice Model)
    中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

    如图所示,和基于字向量的模型有些不同, ccj c j c 的计算考虑到了词格中的词语序列 wdb,e w b , e d ,具体而言,每个 wdb,e w b , e d 都会被embedding表示为:

    xwb,e=ew(wdb,e) x b , e w = e w ( w b , e d )

    其中 ew e w 是embedding矩阵。此外,word cell cwb,e c b , e w 被用来表示从句首开始的每一个 xwb,e x b , e w 的递归状态。 cwb,e c b , e w 可以由如下公式计算: ⎡⎣⎢⎢⎢iwb,efwb,ec̃ wb,e⎤⎦⎥⎥⎥=⎡⎣⎢⎢σσtanh⎤⎦⎥⎥(WwT[xwb,ehcb]+bw) [ i b , e w f b , e w c ~ b , e w ] = [ σ σ t a n h ] ( W w T [ x b , e w h b c ] + b w )

    cwb,e=fwb,e⨀ccb+iwb,e⨀c̃ wb,e c b , e w = f b , e w ⨀ c b c + i b , e w ⨀ c ~ b , e w

    其中 iwb,e i b , e w 和 fwb,e f b , e w 是LSTM的输入和遗忘门的集合。在词语的粒度上没有设置输出门,因为本文的模型本质上是一个基于字向量的模型。

    有了词格 cwb,e c b , e w 之后,每个隐含层的 ccj c j c 的计算就会受很多路径上的信息流的影响,比如途中的 cc3 c 3 c 就受 xc3 x 3 c 和 cw1,3 c 1 , 3 w 以及上一个隐含层输出的同时影响。

    本文将所有的 cwb,e c b , e w 和cell cce c e c 连接起来,我们使用一个额外的门 icb,e i b , e c 来控制 cwb,e c b , e w 到 ccb,e c b , e c 的信息流:

    中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》
    于是 ccj c j c 的计算公式可以表示为: (有点看不懂了,混乱中) ( 有 点 看 不 懂 了 , 混 乱 中 )
    中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》
    上式中 icb,j i b , j c 和 icj i j c 被归一化成了 αcb,j α b , j c 和 αcj α j c ,故所有 αcb,j α b , j c 的和为1,所有 αcj α j c 的和也为1,归一化公式如下:
    中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》
    最后一个隐含层的输出 hcj h j c 的计算公式为: hcj=ocj⨀tanh(ccj) h j c = o j c ⨀ t a n h ( c j c )

在得到所有隐含层的输出 h1,h2,...,hτ h 1 , h 2 , . . . , h τ 之后(其中 τ τ 为一句话中字的个数),预测的label序列的概率 y=l1,l2,...,lτ y = l 1 , l 2 , . . . , l τ 可以表示为:

中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

其中 y′ y ′ 代表任意的label序列, Wl′iCRF W C R F l i ′ 是模型中针对每个 li l i 的参数, b(li−1,li)CRF b C R F ( l i − 1 , l i ) 是从 li−1 l i − 1 到 li l i 的bias

最后再使用first-order Viterbi算法找到概率最大的序列,就是最终的输出。

在给定人工标记的训练数据 {(si,yi)}∣∣Ni=1 { ( s i , y i ) } | i = 1 N ,我们在句子粒度上定义的损失函数(使用了L2正则)可以表示为:

中文实体抽取(NER)论文笔记《Chinese NER Using Lattice LSTM》

继续阅读