原文链接:

Dynamic Oracles for Top-Down and In-Order Shift-Reduce Constituent Parsing

论文地址:

Dynamic Oracles for Top-Down and In-Order Shift-Reduce Constituent Parsing

代码地址:

danifg/Dynamic-InOrderParser

本文是发表在EMNLP18上的一篇关于Dynamic Oracle的论文,主要介绍了针对自顶向下和中序两种移进归约成分句法分析模型的Dynamic Oracles。在PTB数据集上,取得了单模型最高的F1值92.0(截至论文发稿时是最高的,张岳TACL18的论文已经取得了92.4的最高F1值)。

介绍

Dynamic Oracle是用在转移系统中,防止错误传播的一种手段。而转移系统主要有分为三种:bottom-up、top-down和in-order的转移系统。

其中bottom-up转移系统的Dynamic Oracle在

Span-Based Constituency Parsing with a Structure-Label System and Provably Optimal Dynamic Oracles

中有很详细的证明,也可以参看我之前的博客

Deep Understanding of Dynamic Oracle in Constituent Parsing

而本文就提出了另外两种转移系统的Dynamic Oracle,其中top-down转移系统主要基于

Recurrent Neural Network Grammars

in-order转移系统主要基于

In-Order Transition-based Constituent Parsing

基础知识

形式化定义

bottom-up的转移系统这里就不讨论了,这里主要讨论另外两种转移系统。转移系统的状态用五元组 表示,五元组内元素分别表示stack、buffer第一个单词的下标、in-order转移系统中结束标记、已经生成的短语成分集合、stack中非终结符集合。

每个短语成分用三元组 表示,其中X是非终结符,l和r是短语的边界下标。而非终结符用二元组 表示,其中j表示X入栈后下一个入栈的单词的下标。

例如对于上图中的句法树,它的gold短语成分集合是

如果采用top-down的转移系统,非终结符入栈的顺序为

如果采用in-order的转移系统,非终结符入栈的顺序为

正如之前所说,top-down中非终结符的下标就是短语的第一个单词的下标,但是in-order不是的,因为短语的第一个子结点已经在非终结符入栈之前形成了,所以它的下标是第二个子结点表示的短语的第一个单词的下标。

之前的top-down和in-order转移系统中并没有用到预测的短语集合 和stack里的非终结符集合 ,但是在本文的转移系统中需要用到,因为本文要用它来改进loss函数,以此来实现Dynamic Oracle。

top-down转移系统

上面两张图分别是top-down转移系统的转移过程和具体的转移示例。注意到REDUCE动作会将新的短语加入到 集合中,并且从非终结符集合 中删去该非终结符。而NT-X动作会将新的非终结符X加入到非终结符集合 中。

in-order转移系统

上面两张图分别是in-order转移系统的转移过程和具体的转移示例,大致细节和top-down转移系统类似。

Dynamic Oracles简介

最后再解释一下Dynamic Oracle是干嘛用的,传统的Static Oracle就是在转移的每一步按照标准转移序列中的action进行转移,但是这样会有一个问题,如果预测的时候某一步预测错了,遇到了一个训练阶段没有出现过的状态,那么该怎么进行转移呢?这时候就要用到Dynamic Oracle,用来针对不同的错误情况进行动态的指导,引导它转移到正确的状态中去。另外在训练时可以手动加入一些错误状态,来训练模型,不然的话遇到的错误状态还是太少了,不足以训练好模型。

Dynamic Oracles

Goldberg (2012)证明了Dynamic Oracle可以通过定义一个损失函数来直接实现,而这个损失函数可以用来衡量当前状态可以产生的最优句法树和标准句法树的距离。最小化这个距离就会使得错误状态也会转移到最终错误最少的状态。而这个损失函数就要和当前状态c挂钩了,这样才能达到和传统的Dynamic Oracle类似的效果。

损失函数

传统的损失函数定义为预测短语成分集合和标准短语成分集合不相交的元素数量,即:

根据上一篇博文

更快的基于非二叉化自底向上策略的转移系统成分句法分析

的推导,该损失函数可以计算为

上面的损失函数是上一篇论文中介绍的bottom-up的转移系统的Dynamic Oracle,但是本文主要讨论top-down和in-order的转移系统,因为转移系统多了non-terminal,所以需要新加入两项损失,用来衡量当前状态可以产生的最优句法树与标准句法树之间的汉明损失。

这两项新加的损失分别是:

  • 当前栈中已经生成的non-terminal集合 中不包含在标准non-terminal集合 中的non-terminal数量,即
  • 当前栈中违反了标准树中non-terminal顺序的non-terminal数量。

所以最终的损失函数为:

前面三项都很容易求得,至于最后一项,可以通过计算栈里的gold non-terminal序列的最长上升子序列来得到,而序列中每个non-terminal的标号就是它在标准树转移序列的non-terminal顺序标号。

短语的可达性

在这里用短语集合 来表示一棵句法树,我们假设状态c的短语集合为 ,那么我们说,标准句法树中的一个短语 当且仅当满足如下三个条件之一时,称它是“各自可达短语”:

对于top-down转移系统:

  • (因为短语已经包含在了状态c已生成的短语集合里,那么它当然是可达的)。
  • (因为短语还在buffer中,并且短语的non-terminal还没有入栈,所以可以通过入栈 ,再不断SHIFT然后REDUCE得到)。
  • (这种情况表明了短语的左端点恰好位于栈里某个短语的边界处,而右端点又还在buffer里,所以还可以通过不断SHUFT然后REDUCE得到短语。但是如果左端点不是栈里短语的边界,那说明产生了交叉,自然不会可达了。而如果右端点已经在栈里了,那之后也不会得到了,因为转移系统每次都是REDUCE栈顶的短语,不可能从栈里面开始REDUCE的,当然这些前提条件当然是non-terminal 已经在栈里了)。

对于in-order转移系统:

  • (因为短语已经包含在了状态c已生成的短语集合里,那么它当然是可达的)。
  • (因为短语还在buffer中,所以可以通过入栈第一个左儿子,再入栈 ,再不断SHIFT然后REDUCE得到)。
  • (这种情况表明了第一个左儿子已经生成了一部分或者完全生成了,并且根结点non-terminal还没有入栈,所以依然可以生成)。
  • (这种情况表明了第一个左儿子已经完全生成了,并且根结点non-terminal在栈里,所以依然可以生成)。

枚举标准树中的所有短语,根据以上规则可以得到可达短语集合 ,然后从标准短语集合中排除掉这部分短语,剩下的就是不可达短语集合 。这部分短语就是不论采取何种动作序列,最后都不可能生成的短语集合。

关于这两个Dynamic Oracles的正确性,这里就不再证明了,证明过程和上一篇bottom-up的差不多。

实验结果

本文和基础的几个转移系统做了对比,代码也是在他们基础上进行修改的,结果如下:

可以发现,加了Dynamic Oracles之后,结果还是有略微提高的。

[EMNLP18]针对自顶向下和中序移进归约成分句法分析的Dynamic Oracles相关推荐

  1. [编译原理]构造LR分析器和SLR移进归约分析表

    目录 目标 1.基础知识引入 1.1 文法 1.2 拓广文法 1.3 全部的项目集 2. 计算文法的LR(0)项目集的.识别活前缀的DFA 2.1 分析得到各个项目集 2.2 构建SLR分析表中的移进 ...

  2. Bison 移进-归约分析

    bison 采用自底向上 (bottom-up) 的分析方法.它用到一个分析栈 (parser stack),关键有两个动作: 1. 移进 (shift)     读取的 token 移进到分析栈中. ...

  3. 编译原理什么是移进规约冲突_编译原理复习题

    可以微信扫码观看 河南城建 <编译原理>复习题丨杨海振整理丨20150521 一.单项选择题 1.构造编译程序应掌握   .D a. 源程序                         ...

  4. 怎样将树的中序遍历的数输入到一个数组中_数据结构与算法-二叉查找树平衡(DSW)...

    上一节探讨了二叉查找树的基本操作,二叉查找树的查找效率在理想状态下是O(lgn),使用该树进行查找总是比链表快得多.但是,该论点并不总是正确,因为查找效率和二叉树的形状息息相关.就像这样: 图1-1给 ...

  5. 基本题型记录-二叉树中序遍历

    由于本人基础较差,所以针对部分题型做一个记录,以免自己忘记 1.二叉树中序遍历 这个遍历方法可以搜一下博客上很多讲解,这里主要是记录一下代码实现,以下面的二叉树为例子 结果应该是 2.迭代法 2.1 ...

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

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

  7. 非递归,不用栈实现二叉树中序遍历

    最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...

  8. 二叉树深度优先 java_二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历) java实现...

    二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历.由于树的 ...

  9. 数据结构2:中序线索化二叉树为什么要通过pre设置后继结点

    在听尚硅谷韩顺平老师课程的时候这个地方没有理解,先把java中序线索化二叉树代码附上: private HeroNode pre = null;//在递归线索化,pre总是保留前一个结点 /**** ...

  10. js移除某个样式_js中如何移除css样式?

    js中如何移除css样式? dom元素应用css有两种方式: ● 通过class类名和id名应用样式 ● 通过指定style属性应用样式 我们可以针对以上两种方式写移除css样式的方法 (相关课程推荐 ...

最新文章

  1. 新手教程:用.htaccess实现二级域名功能
  2. 强联通分量算法的个人详解Tarjan算法(包含缩点)
  3. java telnet乱码_telnet乱码的解决方法
  4. python继承问题_深入浅析python继承问题
  5. iostat命令(转)
  6. 充分利用系统的组策略 保障共享目录安全
  7. P4197-Peaks【Kruskal重构树,主席树】
  8. Dom4j完整教程~字符串与XML的转换
  9. Linux连接xshell时连不上的问题【转载】
  10. 软件工程期末复习汇总
  11. jupyter怎么安装jieba_记录 anaconda安装jieba
  12. 【STM32】 SG90舵机
  13. Direct Sparse Visual-Inertial Odometry using Dynamic Marginalization
  14. python 多行注释_python 多行注释
  15. 如何批量导出数据到excel并下载,看这一篇就够了,一看就会
  16. [Matlab]中solve函数与subs函数的使用方法
  17. 计算机手机远程控制,手机怎么远程控制电脑?手机远程控制电脑步骤详解
  18. 小新想把百度搜索引擎改为edge
  19. 服务端开发框架及技术(转)
  20. -20dB谱宽是什么意思?

热门文章

  1. 函数指针,函数指针数组,函数返回值为函数指针
  2. 【翻译】优秀网站的10个技巧
  3. windows2003下如何关闭共享?
  4. final关键字的用法
  5. CentOS7.2 在线安装MySQL8.0
  6. 如何造数据——分分钟变成造数据大师
  7. SQL的别名和SQL的执行顺序和SQL优化
  8. 树、图与二分图的转换
  9. eclipse引入jar类包的源代码
  10. oracle中decode方法使用