依存句法分析—A Fast and Accurate Dependency Parser using Neural Networks

一、问题描述

这是一篇使用神经网络来做依存句法分析的经典文章,传统的依存句法分析特征向量稀疏,特征向量泛化能力差,特征计算消耗大,用神经网络做transition-based贪心模型可以缓解上述问题,准确率提高,速度变快。由于源代码是java写的,所以本人看了用tensorflow改写的代码,但是该代码存在一些问题,只预测是LEFT-ARC,RIGHT-ARC,SHIFT中的一种(即三分类),但没有预测ARC是哪种依赖关系(label),也就是只预测unlabeled attachment scores(UAS),不能预测labeled attachment scores(LAS),但是有助于特征处理以及整个模型过程的理解,看不懂论文和博客的建议看一下代码。

二、transition-based dependency parser

首先每一个决策过程都是基于当前的状态(configuration)做的决策(transition),做好transition后更新configuration进入下一步决策过程中,做决策时采用贪心算法哦,就是每一步都选择当前认为最好的transition就行,这样只损失了一丢丢准确率,换来了速度的大幅度提升。

configurationc=\left ( s, b, A \right )s是一个栈(stack),b为缓存队列(buffer),A为当前已经画好的依赖弧线集合(dependency arcs),假设一个句子为w_{1},w_{2},\cdots ,w_{n}w_{n}为句子中的单词哦,初始configuration为s=\left [ ROOT \right ]b=\left [w_{1},w_{2},\cdots ,w_{n} \right ]A=\varnothing,如果一个configuration的buffer是空的,且s=\left [ ROOT \right ],则这是最后一个configuration,即终点状态哦,即结束整个决策过程了哦。

transition:有三种,LEFT-ARC,RIGHT-ARC,SHIFT。下面详细介绍,先用S_{i}代表stack的第几个top元素(注意栈的先进后出哦,是按出的顺序算第几个的),用b_{i}对应buffer中的第几个元素(队列先进先出,是按出的顺序算第几个的),则

             LEFT-ARC\left ( l \right ):当stack中元素个数大于等于2时,添加一个dependency arc为S_{1}\rightarrow S_{2},且该arc对应的依赖关系(label)为l,然后将S_{2}从stack中移除。

             RIGHT-ARC\left ( l \right ):当stack中元素个数大于等于2时,添加一个dependency arc为S_{2}\rightarrow S_{1},且该arc对应的依赖关系为l,然后将S_{1}从stack中移除。

             SHIFT:当buffer中元素个数大于等于1时,将b_{1}从buffer中移除,添加到stack中。

N_{l}代表依赖关系l总共的种类数,那么在一个configuration对应的transition有2N_{l}+1种,也就是说每一步决策都是一个2N_{l}+1分类问题。将上述过程对应一下下图一看就明白了。

 三、将上述过程用神经网络表示

神经网络为三层,输入层,隐藏层,softmax输出层

 输入层:当然是从configuration中提取的特征啦,将单词、词性、已产生的arc label三种输入的embedding cancat起来,那么这三种输入分别为什么呢?

      单词S_{1}_{\cdot}wS_{2}_{\cdot}wS_{3}_{\cdot}wb_{1}_{\cdot}wb_{2}_{\cdot}wb_{3}_{\cdot}wlc_1\left ( S_{1} \right )_{\cdot}wlc_1\left ( S_{2} \right )_{\cdot}wrc_1\left ( S_{1} \right )_{\cdot}wrc_1\left ( S_{2} \right )_{\cdot}wlc_2\left ( S_{1} \right )_{\cdot}wlc_2\left ( S_{2} \right )_{\cdot}wrc_2\left ( S_{1} \right )_{\cdot}wrc_2\left ( S_{2} \right )_{\cdot}wlc_1\left (lc_1\left ( S_{1} \right ) \right )_{\cdot}wlc_1\left (lc_1\left ( S_{2} \right ) \right )_{\cdot}wrc_1\left (rc_1\left ( S_{1} \right ) \right )_{\cdot}wrc_1\left (rc_1\left ( S_{2} \right ) \right )_{\cdot}w

共18个特征哦,其中.w代表对应的单词,lc_1代表left-most children,rc_1代表right-most children,比如上上图中,has的left-most children就是所有从has画起的箭头指向的单词中在has左边且最靠左的(在句子中最靠开头的),has的right-most children就是所有从has画起的箭头指向的单词中在has右边且最靠右的(在句子中最靠开头的),he是has的left-most children,\cdot (末尾的句号)是has的right-most children。

      词性S_{1}_{\cdot}tS_{2}_{\cdot}tS_{3}_{\cdot}tb_{1}_{\cdot}tb_{2}_{\cdot}tb_{3}_{\cdot}tlc_1\left ( S_{1} \right )_{\cdot}tlc_1\left ( S_{2} \right )_{\cdot}trc_1\left ( S_{1} \right )_{\cdot}trc_1\left ( S_{2} \right )_{\cdot}tlc_2\left ( S_{1} \right )_{\cdot}tlc_2\left ( S_{2} \right )_{\cdot}trc_2\left ( S_{1} \right )_{\cdot}trc_2\left ( S_{2} \right )_{\cdot}tlc_1\left (lc_1\left ( S_{1} \right ) \right )_{\cdot}tlc_1\left (lc_1\left ( S_{2} \right ) \right )_{\cdot}trc_1\left (rc_1\left ( S_{1} \right ) \right )_{\cdot}trc_1\left (rc_1\left ( S_{2} \right ) \right )_{\cdot}t。共18个特征哦,其中.t代表对应的词性。

      arc labellc_1\left ( S_{1} \right )_{\cdot}llc_1\left ( S_{2} \right )_{\cdot}lrc_1\left ( S_{1} \right )_{\cdot}lrc_1\left ( S_{2} \right )_{\cdot}llc_2\left ( S_{1} \right )_{\cdot}llc_2\left ( S_{2} \right )_{\cdot}lrc_2\left ( S_{1} \right )_{\cdot}lrc_2\left ( S_{2} \right )_{\cdot}llc_1\left (lc_1\left ( S_{1} \right ) \right )_{\cdot}llc_1\left (lc_1\left ( S_{2} \right ) \right )_{\cdot}lrc_1\left (rc_1\left ( S_{1} \right ) \right )_{\cdot}lrc_1\left (rc_1\left ( S_{2} \right ) \right )_{\cdot}l。共12个特征哦,其中.l代表对应的依赖关系。

输入层到隐层为全连接,在隐层后面加全连接和softmax,输出属于2N_{l}+1中某一种的概率。

四、trick

1. 隐层的激活函数不用relu,而用立方函数,主要是立方函数刚好拟合上述48中特征的各种组合,非常像人工设计的那种。你看下面的公式一下就能明白。

                                             \left (w_{1}x_1+ w_{2}x_2+\cdots +w_{m}x_m+b \right )^3\\ =\sum_{i,j,k}\left ( w_{i}w_{j}w_{k} \right )x_{i}x_{j}x_{k}+\sum_{i,j}b\left ( w_{i}w_{j} \right )x_{i}x_{j}\cdots

2.提前计算好高频率单词的embedding和权重矩阵相乘,这样后面需要计算的时候只需要去里面找,减少重复计算,节约时间。

3.目标函数加入了正则化项。

五、和传统方法相比

上面可知神经网络为48个特征,因为神经网络是非线性,包括立方函数都能帮助提取各个特征直接的隐含联系,比如是否共同出现这种。但是传统的方法只能人工将这48个特征各种组合,表示一起出现的情况,那样就会出现成千上百种组合,即成千上百种特征,但是每个句子可能只出现了一两种,这样特征向量(0101那种向量)就会非常稀疏。而且统计起来也很耗时,关键是人工设计的特征容易漏掉一些信息,换一种场景,特征就得重新设计,泛化能力差。

六、实验结果

验证用了三种数据,英文的有两种CoNLL dependencies和Stanford dependencies,中文的有CTB。

精度判读:

            unlabeled attachment scores(UAS):只预测是LEFT-ARC,RIGHT-ARC,SHIFT中的一种(即三分类)

            labeled attachment scores(LAS):还有预测是那种依赖关系,即2N_{l}+1分类。

1. 准确率和速度基本都最好

2. 立方函数效果最好

3. 使用预训练的词向量初始化比随机初始化词向量效果好

 

4.词性和已有依赖关系作为输入是有用的,但是若已经有词性,再加入已有依赖关系则效果甚微,因为词性已经捕捉了依赖关系信息。

5. 将隐层的每一个神经元作为一个特征(feature),分别看这个神经元与输入(word,pos,label)的权重矩阵大于0.2的部分,看图中多数分布在pos,说明pos特征很重要。这个方法可以帮我们看出什么特征更重要,比传统方法好。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值