原文链接:

In-Order Transition-based Constituent Parsing

论文地址: In-Order Transition-based Constituent Parsing

代码地址: github

今天要介绍的这篇论文是成分句法分析领域目前的第三名,结果最高的几篇paper可以参见ruder在github整理的列表:github。 下面就是成分句法分析目前排名:

摘要

基于转移的成分句法分析主要分为两种: 一种是自顶向下(top-down)的方法,按照前序遍历(pre-order)的顺序生成句法树。这种方法可以更好地利用全局信息,但是需要一个强大的编码器来对每个短语成分进行编码。 一种是自底向上(bottom-up)的方法,按照后序遍历(post-order)的顺序生成句法树。这种方法可以充分利用子树的特征来进行分析,但是却无法利用全局信息。

本文的模型就对这两种方法进行了改进,采用中序遍历(in-order)的顺序来生成句法树。单模型最终取得了91.8的F1值(貌似也不是特别高?),采用监督重排序之后F1值提升到了93.6,采用半监督重排序之后F1值提升到了94.2。所以看起来还是重排序起了很大的作用。

基于转移的成分句法分析

首先简要介绍一下这三种基于转移的句法分析方法。

自底向上的转移系统

自底向上的转移系统是基于后序遍历的,例如对于下图这棵句法树,算法产生结点的顺序为3、4、5、2、7、9、10、8、6、11、1。

a图是未经二叉化的句法树,b图是二叉化之后的句法树,二叉化之后的结点要用l和r来区分头结点。其实不二叉化也是可以的,伯克利一帮人的做法就是用 来作为临时结点,构造树的时候去掉就行了。

句法分析系统如下:

每个时刻的状态用三元组 来表示,分别表示栈中元素、buffer的第一个元素在句子中的下标、句法分析结束标记。

系统一共有四个操作:

  • SHIFT: 从buffer中移进一个单词到栈里。
  • REDUCE-L/R-X:将栈顶两个结点归约为一个父结点X。
  • UNARY-X:将栈顶元素归约为一元结点X。
  • FINISH:句法分析结束。

上面那个句法树按照该模型分析的话过程如下:

优缺点很显然,可以充分利用已生成的子树来对父结点的预测进行分析,但是不能利用全局信息(也就是其他子树、父结点等信息),并且需要提前进行二叉化(这点可以用临时结点标记来规避)。

自顶向下的转移系统

自顶向下的转移系统是基于前序遍历的,例如对于之前那棵句法树,算法产生结点的顺序为1、2、3、4、5、6、7、8、9、10、11。

句法分析系统如下:

系统一共有三个操作:

  • SHIFT: 从buffer中移进一个单词到栈里。
  • NT-X:对一个父结点生成出它的一个子结点X。
  • REDUCE:将栈顶的若干个结点归约为一个结点,并且全部出栈,注意它们的父结点这时已经在栈顶了。

上面那个句法树按照该模型分析的话过程如下:

优缺点也很显然,可以充分利用全局信息,但是因为预测子树的时候,子树还没有生成,所以无法利用子树的特征来进行分析,所以需要提前对句子的每个短语进行编码。

采用中序遍历的转移系统

为了协调上面的两种问题,本文提出了一种基于中序遍历的转移系统。

其实采用中序遍历也符合人们的直觉判断,比如你读到一个单词“like”,脑子里首先就会想到,这个可能和下面短语共同组成了动词短语VP,然后接着往下看,果然印证了你的猜想。

中序遍历就是采用这种思想的,例如对于之前那棵句法树,算法产生结点的顺序为3、2、4、5、1、7、6、9、8、10。

句法分析系统如下:

系统一共有四个操作:

  • SHIFT: 从buffer中移进一个单词到栈里。
  • PJ-X:向栈里移进父结点X,来作为栈顶结点的父结点。
  • REDUCE:将栈顶的若干个结点归约为一个结点,并且全部出栈,注意它们的父结点在出栈元素的倒数第二个。然后再将父结点入栈。
  • FINISH:句法分析结束。

上面那个句法树按照该模型分析的话过程如下:

该转移系统还有很多变体。对于短语(S, a, b, c, d),可以令它在栈中S结点之前的子结点个数为 ,例如对于上面的中序转移系统,栈里存放顺序是“a S b c d”,那么 ,如果栈里存放顺序是“a b S c d”,那么 。而对于自底向上的转移系统, 就是正无穷,对于自顶向下的转移系统, 就是0。

句法分析模型

对于每一个状态,模型采用三个LSTM来预测当前步动作,结构如下图所示:

一个LSTM用来对栈顶元素进行编码,一个LSTM用来对buffer中所有元素进行编码,一个LSTM用来对之前预测完毕的所有动作进行编码。

单词表示

对于每个单词,用预训练词向量、随机初始化词向量、POS向量拼接起来,然后经过一个前馈神经网络来作为最终的单词表示:

其中 表示POS为 的向量, 表示单词 的预训练词向量, 表示单词 的随机初始化词向量。 函数通常取ReLU。

栈里的短语表示

对于自顶向下和in-order的转移系统,由于不需要二叉化,所以采用如下图所示的LSTM来对栈里的短语进行编码:

具体的短语表示为:

其中 是父结点的向量表示,其他都是子结点的短语表示。

而作为对比实验,自底向上的转移系统因为是二叉树,所以LSTM略有不同,结构图如下所示:

唯一的区别就是不管你短语的单词顺序如何,都要把中心词也就是头结点放在前面。

贪心动作预测

上面的两个小节将buffer和栈里的元素都进行了编码,最后就要对当前状态进行动作预测了。

假设第 个状态为 ,那么当前状态每个动作的概率为:

其中 是栈里的LSTM编码结果:

是buffer里的LSTM编码结果:

是之前动作序列的LSTM编码结果:

最终的损失函数采用交叉熵:

实验

实验的超参数设置如下:

经过对比实验可以发现,结果比自底向上和自顶向下的转移系统都要略高一点,就算加上了重排序,还是略高一点。单模型的话,和2017年之前的结果相比的确是最高的,但是91.8的F1值现在看来不是特别高了,毕竟伯克利基于CKY算法的chart-parser都已经到了92多甚至93了。

详细结果如下表:

模型在依存句法分析和CTB上的表现也都很不错。

总结

本文提出了一种基于中序遍历转移系统的成分句法分析模型,主要的动机还是基于人类阅读时的直觉,该模型协调了自底向上和自顶向下转移系统的优缺点,在采用重排序之后,结果达到了非常高的水准。

当然我个人认为模型也存在一些改进的地方:

  • 单词的表示可以加上Char-LSTM。
  • 预测阶段可以采用之前文章提到的Dynamic Oracle技术,来减少预测错误的发生。详见之前的文章:地址。不过这里的Dynamic Oracle要重新设计了,设计好了说不定又可以发一篇论文了?(手动滑稽)

[TACL17]基于中序转移的成分句法分析相关推荐

  1. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  2. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  3. 二叉树的前序,中序,后序遍历

    我们知道,二叉树的遍历有三种,分别是前序遍历.中序遍历和后序遍历,我们来看看这三种遍历的特性: 一.前序 前序遍历的基本思路是先遍历根节点,再遍历左节点,最后遍历右节点. 我们在这里随便找一个二叉树给 ...

  4. 基于层序+中序遍历序列构建二叉树

    问题是:基于层序遍历序列+中序遍历序列唯一建立一棵树,然后输出前序,后序遍历序列. 四种遍历树的思路以及代码自然不必多言,有趣的是如何由层序+中序建立树. 首先需要说的是,这个也是递归解法. http ...

  5. MFC二叉树可视化绘制 (C++)—— 插入、删除、先序遍历、中序遍历、后序遍历、层序遍历(基于平衡二叉树实现)

    界面展示: 相关文章目录 平衡二叉树的构造过程图解 C/C++平衡二叉树实现 -- 插入.删除.先序遍历.中序遍历.后序遍历.层序遍历(设计详解) MFC 在对话框中绘制图形的方法 -- 及二叉树绘制 ...

  6. 基于R语言的主成分回归(PCR)与Lasso回归在水稻基因组预测中的对比(生信数基实验作业)

    基于R语言的主成分回归(PCR)与Lasso回归在水稻基因组预测中的对比 0 引言 全基因组选择是 21 世纪动植物育种的一种重要的选择策略,其核心就是全基因组预测,即基于分布在整个基因组上的多样性分 ...

  7. 依存句法分析:基于图的依存句法分析、基于转移的依存句法分析、基于神经网络的依存句法分析

    依存句法分析:基于图的依存句法分析.基于转移的依存句法分析.基于神经网络的依存句法分析 目录

  8. 数据结构-中序遍历二叉树(基于C++)

    二叉树是一种常见的数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点,常见的遍历方式有前序遍历.中序遍历和后序遍历. ...

  9. 微信后台基于时间序的海量数据冷热分级架构设计实践

    写在前面 微信的后台数据存储随着微信产品特性的演进,经历了数次的架构改造,才形成如今成熟的大规模分布式存储系统,有条不紊的管理着由数千台异构机型组成的机器集群,得以支撑每天千万亿级的访问.键值以及 P ...

  10. 72.编辑距离105.前序中序遍历序列构造二叉树151.翻转字符串里的单词104.二叉树的最大深度76.最小覆盖子串110.平衡二叉树31.下一个排列

    72.编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 .你可以对一个单词进行如下三种操作:插入一个字符,删除一个字符,替换一个字符. ...

最新文章

  1. Vue---自定义组件
  2. python控制电脑关机_Python利用智能音箱语音控制电脑开关机
  3. css中的display属性值:table,table-row,table-cell
  4. jdbc mysql ssh通道_Jdbc使用ssh通道连接Mysql
  5. 从0开始 Java实习 黑白棋
  6. 【数据结构与算法】二项队列与二叉堆的比较
  7. weblogic部署方式
  8. 从零学ELK系列(十一):SpringBoot项目接入ELK超级版(超详细图文教程)
  9. Unicode编码表/常用码表(内容多、卡)
  10. 反向题在测试问卷信效度_如何进行问卷的信度和效度分析_spss问卷信度效度分析...
  11. Iphone8如何投屏到电脑 苹果手机投屏到电脑
  12. 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
  13. 紫书刷题记录 UVa297 四分树
  14. CQI related
  15. 电脑时间倒流,程序拒绝穿越:应用程序发生异常 未知的软件异常(0xe06d7363)
  16. win10系统服务器错误怎么解决方法,分享win10系统提示内部服务器错误的解决方案...
  17. NMOS的栅极充电过程
  18. 厘米换算英尺英寸 (15 分)如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是?
  19. 牛客网华为机试题(JavaScript)
  20. Java中tif转png,tif格式图片转换为gif、png、jpg格式(Java实战)

热门文章

  1. ios客户端快速滚动和回弹效果的实现
  2. 转载--#define 用法
  3. 自定义snmp oid
  4. 【leetcode】557. 反转字符串中的单词 III-原地算法
  5. 08 Javascript的函数
  6. 五校联考R1 Day2T2 矩阵matrix(容斥)
  7. maven新建的项目,不自动引入依赖包
  8. 关于跨域的处理的几种方法的整理
  9. JSON: jasckson 字段 过滤
  10. 收藏:常用的广告代码的表达式