概要:本文使用神经网络完成了一个快速准确的依存语法分析程序,也就是句子的结构。网络
之前的depenency parser效果很好,可是有几个问题:spa
做者想出了一个好方法来解决这些问题,其实我以为这些都是第一个问题带来的。blog
先解释什么是Dependency Parsing。依存语法是一种二元非对称关系,一个词A有一个箭头指向另一个词B, 箭头上一般有标签(label),这些标签表示语法关系,好比主语,同位语等等。箭头链接的两个词有head(高级)和dependent(低级)的区别。而这些箭头称为dependency。本文的箭头是从head到dependent。一般一个句子中加一个假的root,这样每一个单词dependent于另外一个节点。一般这些依存关系会造成一棵树(连通,非循环,一个根结点)。对于dependency parsing有一个定义是projectivity,叫投影。若是这些箭头没有交叉,则称这个树是projective的。以下图就是这样。get
此图是论文中的例子,好比He就dependent于has,由于has说明了he要干吗,因此has是head。而he是has的名词主语(nominal subjective),就是label。能够看出图中的关系造成了一棵树。it
接下来解释什么叫transition-based。依旧是论文的例子。图:io
parser有如下几项:ast
在本文中,有以下几种transition:class
对于论文中的例子,有下图:pdf
这样就能够获得句子的dependency 树了,也就是句子的结构。sed
Neural Network Based Parser
本文的目的是经过现有的信息,预测出下一步的transition。首先是所用的模型:
如图所示:
输入由三部分组成,词,词的词性,词的箭头的label,可是全都是embedding的形式。一共选18个词xw:(1)stack和buffer的前3个单词:s一、s二、s三、b一、b二、b3;(2)栈顶两个单词的第一个和第二个最左边/最右边的子单词:lc1(si), rc1(si), lc2(si), rc2(si), i = 1,2。(3)最左边的最左边/最右边的最右边——堆栈上最上面两个单词的大多数子元素:lc1(lc1(si))、rc1(rc1(si))、i = 1,2。xt:使用这18个词的词性标记,xl对应的单词arc的label,不包括Sl堆栈/缓冲区上的那6个单词,有12个,没有的元素用null来代替。embedding的长度是50,直接行向量的形式链接起来,因此输入长度是50*(18+18+12)。
隐藏层的长度是200,由图中公式算出,值得注意的是,公式不只是进行了线性变换,加了一个三次方,论文中说比起tanh或者sigmoid效果很不错,可是缘由说不出,说是有待理论调查。
最终输出层是softmax,有2n+1个transition待选,选出其中可能性最高的。n是总的label的数量。leftarc * n+rightarc * n +shift,共2n+1个transition可选。
最终实验效果很好,速度很快。
具体的训练实验细节和模型评估等请看论文A Fast and Accurate Dependency Parser using Neural Networks。
感叹:word2vec对于nlp的影响真大。