对于中文命名实体识别,我们研究了一种lattice结构的lstm模型(lattice-structured LSTM),这个模型能够对输入的字符序列以及序列中能够与字典相匹配的隐藏的词信息一同编码。
相比于基于字粒度的方法,lattice的能够更好的利用字以及字序列的信息。相比于词粒度的方法,lattice避免了分词带来的错误。门控循环单元能够使得模型选择最相关的字和词,得到更好的NER结果。在多种数据的实验中表明,lattice的性能优于基于字粒度和词粒度的lstm,能够得到best结果。
近几年,作为信息抽取领域中的基本任务,命名实体识别(NER)得到了持续的研究关注。NER一直被看作是一项序列标注问题,他的实体边缘和类别标记一起被预测出来。英文NER中最好的结果是通过lstm-crf模型将字信息融入到词表示中得到的。
中文NER与分词有关,特别是实体的边界就是词的边界。中文NER的一种方式是先分词,然后对词序列进行NER标注。这种分词->NER的pipeline很容易受到传播错误,因为在分词中命名实体是OOV(out-of-vocabulary)的重要来源,而且错误的分割实体边缘也会导致NER的错误。这种问题在开放领域更为严重,因为交叉领域中的词分割还存在很多待解决问题。所以词粒度的性能要比字粒度的性能要好。
基于字粒度的NER的缺点是忽略了字以及字序列的信息。解决方法是利用lattice结构的lstm将句子中潜在的词信息融入到字粒度的lstm-crf中。
如上图,通过将句子与自动得到的较大的词典匹配构建一个字-词的lattice结构。例子中是得到了“长江大桥”“大桥”“长江”可以消除文中潜在命名实体的歧义,例如与文中的“江大桥”。
因为一个lattice中的字-词会有指数级的路径,所以构建了一个lattice lstm结构自动控制信息流从句子开始流到句子结尾。
如上图,通过门单元动态的将不同路径得到的词输送到相应的字符。在NER数据上训练,lattice lstm能够自动的在文中找到更多的词信息来达到更好的NER性能。与只依赖于字信息和只只依赖于词信息的NER相比,lsttice lstm 能够不受分词错误的影响,并将明确的词信息作用于字序列标注上的优点。
代码及数据git地址
神经网络运用与NER的方法:
基于字序列的标注成为中文NER的主流方法。在统计上来看,对于字粒度和词粒度的NER
方法的讨论表明字粒度的性能更优,对于神经网络中的NER方法也是如此。
另外,lattice lstm要优于word LSTM和character LSTM.
本模型不需要分词也不需要考虑多任务的设置。
NER任务中会经常使用外部信息源,尤其是词典特征被广泛使用。在本论文中是在大量自动分词的文本中使用预训练的word embedding 词典。同时类似与语言模型的半监督方法也可以到lattice lstm中。
lattice 结构的RNN可以看作是树结构的RNN向DAGs(Directed acyclic graph,有向无环图)的延伸。本文中的lattice lstm是以字符为中心的lattice-lstm-crf序列标注模型,对于词,有循环单元但是没有隐藏单元。
是第一个将字符与词混合起来构建lattice的,也是都一个将word-character lattice 应用于不用分词的中文NER任务中的。
使用lstm-crf作为主要的网络结构。
一般将输入序列表示为 s = c 1 , c 2 . . . c m s = c_{1},c_{2}...c_{m} s=c1,c2...cm
其中, c j c_{j} cj代表第j个字符。也可以把输入表示为 s = w 1 , w 2 . . . w m s = w_{1},w_{2}...w_{m} s=w1,w2...wm,其中 w j w_{j} wj表示句子分词后的第j个词。本文中应用t(i,k)表示索引j,代表第i个单词的第k个字符。比如“南京市 长江大桥”,索引从1开始,那么t(1,2) = 2(京),t(2,3) = 6(大)。
运用BIOES(begin intermediate other end single)标注策略进行字粒度和词粒度的NER标注。
字粒度的ner模型如上图所示。
运用lstm-crf模型计算字序列 c 1 , c 2 . . . . c m c_{1},c_{2} ....c_{m} c1,c2....cm,每个字符 c j c_{j} cj通过字向量查找表(character embedding lookup table)得到。
X j c = e c ( c j ) ( 1 ) X_{j}^{c} = e^{c}(c_{j}) \qquad(1) Xjc=ec(cj)(1)
双向lstm计算字向量 x 1 , x 2 . . . x m x_{1},x_{2} ...x_{m} x1,x2...xm得到隐藏层结果 ( → h 1 c ) , ( → h 2 c ) . . . ( → h m c ) \overrightarrow(h_{1}^{c}),\overrightarrow(h_{2}^{c}) ...\overrightarrow(h_{m}^{c}) (h1c),(h2c)...(hmc)以及反向的 ( ← h 1 c ) , ( ← h 2 c ) . . . ( ← h m c ) \overleftarrow(h_{1}^{c}),\overleftarrow(h_{2}^{c}) ...\overleftarrow(h_{m}^{c}) (h1c),(h2c)...(hmc),最后得到隐藏层结果为
h c j = [ ( → h j c ) ; ( ← h j c ] ( 2 ) h_{c}^{j} = [\overrightarrow(h^{c}_{j});\overleftarrow(h^{c}_{j}] \qquad (2) hcj=[(hjc);(hjc](2)
最后应用CRF(公式(17))计算隐藏层结果 h c j h_{c}^{j} hcj.
实验表明Character bigrams对于词分割有很大用处。通过拼接双字的embedding和单字的embedding,将字符 bigrams添加到字粒度的模型中。
$$
X_{j}^{c} = [e{c}(c_{j});e{b}(c_{j},c_{j+1})] \qquad (3)
$$
X j c = [ e c ( c j ) ; e s ( s e g ( c j ) ) ] ( 4 ) X_{j}^{c} = [e^{c}(c_{j});e^{s}( seg(c_{j}) )] \qquad (4) Xjc=[ec(cj);es(seg(cj))](4)
得到的隐藏层状态如下:
h i w = [ ( → h i w ) ; ( ← h i w ] ( 5 ) h_{i}^{w} = [\overrightarrow(h^{w}_{i});\overleftarrow(h^{w}_{i}] \qquad (5) hiw=[(hiw);(hiw](5)
基于词粒度的NER如上。利用word embedding得到词的向量表示。
X i w = e w ( w i ) ( 6 ) X_{i}^{w} = e^{w}(w_{i}) \qquad(6) Xiw=ew(wi)(6)
同样运用双向lstm得到双向隐藏层状态序列,并拼接得到最终的隐藏层状态。
h i w = [ ( → h i w ) ; ( ← h i w ] h_{i}^{w} = [\overrightarrow(h^{w}_{i});\overleftarrow(h^{w}_{i}] \qquad hiw=[(hiw);(hiw]
Integrating character representations:
字符CNN和LSTM中都运用词来表示字符。对于本文的中文NER,两者都用上。也就是说词的表示为word embedding查找的词向量和字符序列拼接起来。
X i w = [ e i w ( w i ) ; X i c ] ( 7 ) X^{w}_{i} = [e^{w}_{i}(w_{i}); X^{c}_{i}] \qquad (7) Xiw=[eiw(wi);Xic](7)
每个输入字符的embedding表示为 e c ( c j ) e^{c}(c_{j}) ec(cj) ,对于 w i w_{i} wi的字符 c c_{} c
bi-lstm计算字向量得到 ( → h t ( i , 1 ) c ) , ( → h t ( i , 2 ) c ) . . . ( → h t ( i , l e n ( i ) ) c ) \overrightarrow(h_{t(i,1)}^{c}),\overrightarrow(h_{t(i,2)}^{c}) ...\overrightarrow(h_{t(i,len(i))}^{c}) (ht(i,1)c),(ht(i,2)c)...(ht(i,len(i))c),以及反向的 ( → h t ( i , 1 ) c ) , ( → h t ( i , 2 ) c ) . . . ( → h t ( i , l e n ( i ) ) c ) \overrightarrow(h_{t(i,1)}^{c}),\overrightarrow(h_{t(i,2)}^{c}) ...\overrightarrow(h_{t(i,len(i))}^{c}) (ht(i,1)c),(ht(i,2)c)...(ht(i,len(i))c),最终对于&w_{i}&
的字符级的表示为
X i c = [ ( → h t ( i , l e n ( i ) ) c ) ; ( → h t ( i , l e n ( i ) ) c ) ] X^{c}_{i} = [\overrightarrow(h_{t(i,len(i))}^{c});\overrightarrow(h_{t(i,len(i))}^{c})] Xic=[(ht(i,len(i))c);(ht(i,len(i))c)]
Word + char LSTM′
Word + char CNN
对于每个单词的字符序列应用标准的CNN,得到字符表示 X i c X^{c}_{i} Xic
$$
X^{c}{i} = max{t(i,1) <= j <= t(i,len(i))}
(W_{CNN}^{T}
\begin{bmatrix}e^{c}(c_{j - \frac {ke-1} {2})} \
… \
e^{c}(c_{j + \frac {ke-1} {2})}
\end{bmatrix}
W C N N b C N N W_{CNN} \quad b_{CNN} WCNNbCNN是参数,ke代表kenal个数,max表示最大pooling。
lattice lstm 的整体结构如上图figure2 所示,可以看作是char-based,加上了word-based cells和门控单元控制信息流向。
如上图所示,输入数据是字符序列 $ c_{1}…c_{m}$以及与词典匹配的子序列(词)。
W b , e d W_{b,e}^{d} Wb,ed代表由索引b开始到索引e结束的子序列,比如“南京市长江大桥” W 1 , 2 d W^{d}_{1,2} W1,2d 即“南京”, W 6 , 7 d W^{d}_{6,7} W6,7d 即“大桥”。
在lattice模型中有四种向量,input vectors, output hidden vectors, cell vectors ,gate vectors。
作为基本组成,在character-based模型中,char输入向量表示每个字符。
X j c = e c ( c j ) X_{j}^{c} = e^{c}(c_{j}) Xjc=ec(cj) \qquad (10)`
基本的循环结构组成为:字符细胞向量(character cell vector) c j c c^{c}_{j} cjc以及对于每个 c j c_{j} cj得到的隐藏层向量 h j c h_{j}^{c} hjc,其中 c j c c^{c}_{j} cjc表示从句子开始到 c j c_{j} cj的信息流, h j c h^{c}_{j} hjc用于CRF进行序列标记。
基本LSTM函数如下:
lattice lstm
不同于char-based lstm, c j c c^{c}_{j} cjc的组成要考虑句子中与词典相匹配的子序列 w b , e d w_{b,e}^{d} wb,ed.每个子序列可以表示为
$
X_{b,e}^{w} = e{w}(w_{b,e}{d}) \qquad (12)
$
另外,字细胞(word cell ) c b , e w c_{b,e}^{w} cb,ew表示从句子开始到该位置 X b , e w X_{b,e}^{w} Xb,ew的细胞状态。 c b , e w c_{b,e}^{w} cb,ew的计算公式如下:
没有输出,因为只有字粒度才有标注输出。
对于 c b , e w c_{b,e}^{w} cb,ew,有多种路径使得信息流向) c j c c_{j}^{c} cjc。比如“南京市长江大桥”中, c 7 c c_{7}^{c} c7c包括
X 7 c X_{7}^{c} X7c(桥),
c 6 , 7 w c_{6,7}^{w} c6,7w(大桥)以及
c 4 , 7 w c_{4,7}^{w} c4,7w(长江大桥)。
将所有由$ b \in {b’| w_{b’,e}^{d} \in D} 开 始 的 的 开始的的 开始的的c_{b,e}{w}$与$c_{e}{c} 联 系 起 来 。 用 另 一 个 门 联系起来。用另一个门 联系起来。用另一个门i_{b,e}^{c}$ 来控制信息 c b , e w c_{b,e}^{w} cb,ew流向 c b , e c c_{b,e}^{c} cb,ec。
i b , e c = σ ( W l T [ X e c c b , e w ] + b l ( 14 ) i^{c}_{b,e} = \sigma (W^{lT} \begin{bmatrix} & X_{e}{c} \\ & c_{b,e}^{w} \end{bmatrix} +b^{l} \qquad (14) ib,ec=σ(WlT[Xeccb,ew]+bl(14)
所以,细胞状态 c j c c_{j}^{c} cjc的计算变为:
c j c = ∑ b ∈ { b ′ ∣ w b ′ , j d ∈ D } α b , j c ⨀ c b , j w + α j c ⨀ ( ~ c j c ) ( 15 ) c_{j}^{c} = \sum_{b\in \{b'| w_{b',j}^{d} \in D\}} \alpha_{b,j}^{c} \bigodot c_{b,j}^{w} + \alpha^{c}_{j} \bigodot \tilde(c_{j}^{c}) \qquad (15) cjc=b∈{b′∣wb′,jd∈D}∑αb,jc⨀cb,jw+αjc⨀(~cjc)(15)
最终的隐藏状态 h j c h_{j}^{c} hjc计算公式与Eq(11)相同。
h j c = o j c ⨀ t a n h ( c j c ) h_{j}^{c} = o_{j}^{c} \bigodot tanh(c_{j}^{c}) hjc=ojc⨀tanh(cjc)
通过损失函数的最优化,反向传播调整 W c , b c , W w , b w , W l , b l W^{c},b^{c},W^{w},b^{w},W^{l},b^{l} Wc,bc,Ww,bw,Wl,bl使得模型在NER标记过程中能够动态选择相关性最强的词。
CRF层在隐藏层的上一层,标记序列y的概率计算公式为:
在word-based或者char-based输入序列上运用一阶维特比算法得到得分最高的标记序列。
给定手工标注的训练数据 { ( s i , y i ) } ∣ i = 1 N \{(s_{i}, y_{i})\} | _{i=1}^{N} {(si,yi)}∣i=1N,句子级别的对数似然损失函数(使用L2正则)计算公式为:
展开了一系列实验拓展研究词粒度的lattice lstm 在NER上的性能。另一个目的是对比不同参数设置下的基于字和基于词的中文NER性能。
resume数据开放。
OntoNotes 以及 MSRA train data :固定标准的分割。
Yang 神经网络分词应用于MSRA的test/dev的分词。
使用word2vec在 自动分词的Chinese Giga-Word数据集上 预训练了embedding。Character and character bigram embeddings也是基于此预训练的。
在word embedding和char embedding中都使用dropout层,选择SGD进行损失函数的优化。
Character-based NER
Word-based NER.