本文隶属于词表增强的模型,对后续的NER工作有较大的影响。
Pass1
看标题,针对中文NER,设计了一种Lattice(晶格)LSTM,虽然不知道这是什么LSTM,但既然主角是LSTM,那就是应该在LSTM的基础上做事。
看摘要:本文引入一种晶格(lattice)结构的LSTM模型,其对一序列输入以及词典中所有潜在的词语编码。和以字符(character-based)为基础的方法,本模型显式的引入了词语和词语序列的信息。和以词为基础(word-based)的方法比较,晶格LSTM并不会引入分割误差(segmentation errors)。Gated recurrent cells使得模型能够选择最相关的characters、words,在LSTM中。
- 那么看起来lattice LSTM是一种不同于词、字符的方法。
开源代码: https://github.com/jiesutd/LatticeLSTM.
总结:除了之前已经看到的地方,作者对本方法的总结是:The lattice method is fully independent of word segmentation, yet more effective in using word information thanks to the freedom of choosing lexicon words in a context for NER disambiguation.
主要图:
首先作者大概描述了lattice是什么意思。
例如,利用分词系统,还是可以排除一些实体的错误,例如分词得到的长江、大桥,可以避免我们得到不恰当的实体“江大桥”。(不过反过头来说,南京市长 江大桥,也不是说不行…)
- 我突然就想到多音字这个问题了。。市长(zhang) 和长(chang)江大桥。但反过头来说,这样的多音字,很多吗?
这里的意思是,利用gated cells动态的控制词语路径的流动信息。
我们大概可以明白lattice的意思,其实就是以字为单位,以分词系统为参考,达到分割的目的,而不是完全依赖于词语的分割。不过具体这个怎么看,就不太清楚了。
Pass2
2.1 介绍
研究现状:
中文NER中,词语边界一般也是NER的边界;比较经典的方法就是先进行分词,再进行词语序列的NER标注。但是可能存在误差传播,因为NE本身很多都是词表外的词语,错误的词边界自然也就导致错误的NER边界。因此,开放领域(open domain)的NER依旧是严重的问题。相关实验证明,中文NER基于字(character)进行实验,效果会比较好。
不足:
但是基于字的NER工作,并没有有效利用词语(word)和词语序列(word sequence)的信息。因此,作者提出将latent word information融入基于字符(character based)的LSTM-CRF模型,具体体现在representing lexicon words from the sentence using a lattice structure LSTM.
2.2 模型
首先是任务的形式化表达,其中句子表示为
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
n
s=w_1,w_2,...,w_n
s=w1,w2,...,wn,其中
w
i
w_i
wi是第i个词语。另外用记号
t
(
i
,
k
)
t(i,k)
t(i,k)=j表示,下标第i个词语中的第k个字符,是句子的j个字符。例如对于切分“南京市 长江大桥”,其中
t
(
2
,
1
)
=
4
t(2,1)=4
t(2,1)=4,
t
(
1
,
3
)
=
3
t(1,3)=3
t(1,3)=3。其中使用BIOES
标注法,标记基于词语或基于字符的NER标签。
首先很重要的是,如何获取模型的特征,然后才是模型部分。
2.2.1 基于字符的模型
主要流程是:
x
j
c
=
e
c
(
c
j
)
x^c_j=e^c(c_j)
xjc=ec(cj)
其中e^c表示对应的embedding表。然后将
x
j
c
x^c_j
xjc输入双向LSTM中,获得双向的词语隐向量,拼接后得到
h
j
c
h^c_j
hjc。因此对于序列
s
=
x
1
,
x
2
,
.
.
.
,
x
m
s=x_1,x_2,...,x_m
s=x1,x2,...,xm,可以得到特征向量
h
1
c
,
h
2
c
,
.
.
.
,
h
m
c
h^c_1,h^c_2,...,h^c_m
h1c,h2c,...,hmc
具体的,可以引入bichar
特征,如下:
x
j
c
=
[
e
c
(
c
j
)
;
e
b
(
c
j
,
c
j
+
1
)
]
x^c_j=[e^c(c_j);e^b(c_j,c_{j+1})]
xjc=[ec(cj);eb(cj,cj+1)]
其中
e
b
(
)
e^b()
eb()也表示embedding表,只不过是bigram的查找表。
第二种方法是引入sementation label嵌入,这个
其后的LSTM特征获取还是一样的。
2.2.2 基于词的模型
一般流程也是和基于字符的模型差不多,只不过先进行分词,得到词语以后再进行相应的embedding操作。
x
j
w
=
e
w
(
w
j
)
x^w_j=e^w(w_j)
xjw=ew(wj)
其中
e
w
e^w
ew表示embedding的查找表,
w
j
w_j
wj表示的是第
j
j
j个词语。
或者也可以通过将基于词和基于字的嵌入拼接,获得融合后的表示方法。
2.2.2这一小节结构挺乱的…,因为后面讲到的三种方法,都没有用所谓的词语embedding,而都是基于字符embedding操作的。。
这里有几种不同的方法获得句子序列的嵌入:
- word+Char LSTM
- word+Char LSTM’
- Word + Char CNN
三种方法如下所述:
word+Char LSTM,就是在词语内部,利用
e
c
(
c
j
)
e^c(c_j)
ec(cj)(没错,这里用的是字嵌入)输入到双向LSTM中,获得对应的输出,最后将词语隐状态(没错,虽然它写作
x
i
c
x^c_i
xic,其表i示如下:
word+Char LSTM’:是换用了不同的网络结构完成操作,获取词语的表示方法也是同上图。
word+Char CNN:略
2.2.3 Lattice Model
模型的输入是字符序列 c 1 , c 2 , . . . , c m c_1,c_2,...,c_m c1,c2,...,cm以及所有的能够满足词表 D D D的字符串子序列。我们用如下记号 w b , e d w^d_{b,e} wb,ed表示从下标 b b b开始,到下标 e e e结束的字符子序列组成的词语,例如 w 1 , 2 d w^d_{1,2} w1,2d表示“南京”,而 w 7 , 8 d w^d_{7,8} w7,8d表示“大桥”。
首先叙述基础的LSTM结构,其构造如式(11)所示。
但是本模型不是一个纯词语的模型,还加入一个基于词表的模型,这一部分的输入如下所示:
其中
x
b
,
e
w
x^w_{b,e}
xb,ew表示的是词语的embedding嵌入。但是值得注意的是,这里对于从下标b字符开始的词语的信息,是根据字符LSTM的隐状态
h
b
h_b
hb和词嵌入
x
b
,
e
x_{b,e}
xb,e生成的;词语LSTM是没有循环的。前文所说,我们可以输入满足词表
D
D
D的字符串子序列。因此,对于不同的词语序列,输入采取的措施是:
也就是说,对于位置在
j
j
j的字符,我们需要所有结束于位置
j
j
j的词语的词向量,来获取
c
j
c
c^c_j
cjc这个记忆部分。其中各个权值,采用各个LSTM的
i
g
n
o
r
e
ignore
ignore分数做归一化就行,如下所示:
2.2.4 CRF解码模块
经过以上的手法获取序列的特征向量后,使用如下的方法预测某个序列的概率。
其中
W
C
R
F
l
i
W^{l_i}_{CRF}
WCRFli和
b
C
R
F
l
i
−
1
,
l
i
b^{l_{i-1},l_i}_{CRF}
bCRFli−1,li都是相关的参数。在训练完相应的模型后,使用维特比算法得到最大分数的序列。那么模型的损失函数如下:
CRF模块是序列标注的常见模块,功能上类似一般神经网络最后的全连接分类器(例如softmax分类器)。其为概率图模型,虽然很多教科书上都有,但是不够详细。后续将基于理论、实践进行详细讲解。