wjiang的博客 a postgraduate learning NLP

UCCA parsing 系统设计

2019-01-02
wjiang
NLP

一、基本思路

  • 预处理数据,将UCCA图转化为短语结构树的形式。
    • 处理implicit节点
    • 处理linkage node
    • 处理remote边
    • 处理discontinuity
    • 调整label位置到non-terminal node上
  • 用span parser训练(预测)
  • 把短语结构树还原成UCCA图

二、预处理数据

下图统计了所有数据集的大小。但以下测试都是在英文的训练集和开发集上统计的。

  train dev test total
corpus #sentence #sentence #sentence #sentence
English-Wiki 4113 514 515 5142
English-20K 0 0 492 492
French-20K 15 238 239 492
German-20k 5211 651 652 6514

1.处理implicit节点

implicit节点是UCCA中的特殊节点,它没有对应的叶子,如下图所示。baseline模型中也没有提出有效的办法处理它,所以直接将其删除,不考虑。implicit数量待统计。 implicit-example

2.处理linkage node

linkage node也是baseline中一个尚未解决的问题。它类似root节点没有父亲,但它对应的span是句子的一部分。也就是说,一个句子可能会构成类似森林的结构,如下图。统计了训练集和开发集,发现共有3818个linkage node出现在了2544个句子中,对应的边应该更多,或许这就是论文中结果并不高的原因。暂时将所有linkage node以及它出去的边全部删去。 linkage-example

3.处理remote边

短语结构树要求每个节点只能有一个父亲,而UCCA允许一个节点有多个父亲,其中一个父亲经过primary edge(实边)指向它,其他父亲经过remote edge(虚边)指向它。为了消除remote edge,同时又能还原信息,采取扩展标签的方式。如下图所示,只要删除remote edge,同时在primary edge的标签上添加额外的信息,告知该边指向的节点还有其他remote edge指向它即可。简单起见,就在标签后面添加“-R”。 remote-example

但是一个节点可以有多条remote edge指向它,仅仅添加“-R”似乎还不够。于是我统计了训练集和开发集(英文)的remote edge分布,如下图,其中第一行表示共有3626个节点只有1条remote edge指向它。根据分布,或许不必要考虑多条remote edge的情况。

corpus English-Wiki  
#remote edge #node proportion
1 3626 83.0%
2 596 13.6%
3 104 2.4%
4 31 0.7%
5 6 0.1%
6 2 0.1%
corpus German-20K  
#remote edge #node proportion
1 3546 85.7%
2 464 11.2%
3 93 2.2%
4 16 0.4%
5 10 0.2%
6 5 0.1%
7 2 0.1%
9 1 0.1%

remote node与primary父节点的位置关系如下图:

corpus English-Wiki  
remote node和primary父节点关系 #node proportion
兄弟 1969 37.2%
子孙 2398 45.3%
父代 0 0%
其它 929 17.5%
corpus German-20K  
remote node和primary父节点关系 #node proportion
兄弟 1498 30.4%
子孙 2439 49.6%
父代 1 0%
其它 982 20.0%

4.处理discontinuity

短语结构树要求每个non-terminal节点对应的叶子必须连续,而UCCA允许叶子不连续。判断一个节点的叶子是否不连续比较容易,共有939个node出现了discontinuity,分布在735个句子中,占比不是很大。我主要把这些node分成两类。

第一类是node之间没有交叉的discontinuity,如下图所示。不管如何,这种情况可以用两种方法调整。第一种策略是向下移动,这种策略定死了span的左右范围,把范围里的不连续节点移到该范围内。如图中黄色标记所示。第二种策略是向上移动,如图中蓝色标记所示,显然在该例子中向上移动的代价要小一些。 discontinue-example1

再来看下面一个例子,如果采用向下移动的策略,只要修改一条边,但有一个子树移动了位置。如果采用向上移动的策略则要移动右边所有的边,似乎这样代价比较大。事实上,我目测数据中这种情况最多,span中不连续的叶子只占一小片,向下移动只要动这一小片叶子即可,而向上移动要把右边所有的叶子都调整位置,也可能会移动右边的子树,所以大部分情况不是很好。 discontinue-example2

同样下面的例子也可以用向上和向下两个策略来解决。总之,只要一个句子中只有一个span出现不连续,或者多个不连续的span彼此不交叉,都可以用这两种方法解决。到时候只要选择代价较小的方法即可。目前向下移动已经实现完。 discontinue-example3

第二类是node之间出现了交叉的discontinuity,统计了共有125对交叉的node。如下图,有两块不连续的span(图中标红的node的span)有交叉。这种情况比较简单,似乎也可以用向上和向下移动的方法解决,如图中黄色和蓝色标记。目测这种情况占大多数。 discontinue-example4 discontinue-example5

但下面这个例子比较复杂,从图中来看可以找到一个比较好的移动方法,但是光向上或者向下移动无法解决两个node的不连续。同样有两种策略来解决。一种是向右移动,如图中黄色标记所示,把右边不连续的节点移到右边的span中。与之对应的就是向左移动,如图中蓝色标记所示。这两种方法都可以看成是先向上移动,再向下移动。 discontinue-example6 discontinue-example7

经过试验,英文数据集中所有的discontinuity都可以归类到上述类别中,没有更加复杂的情况了,可以用向上或者向下移动变成连续的树。统计的操作情况如下,只用向下和向左操作。

corpus English-Wiki        
move train dev test total proportion
down1 1460 149 # 1609 91.3%
down2 96 19 # 115 6.5%
down3 21 0 # 21 1.2%
left1 16 2 # 18 1.0%
corpus French-20K        
move train dev test total proportion
down1 8 156 # 164 60.7%
down2 96 3 # 99 36.7%
left1 0 4 # 4 1.5%
left2 0 3 # 3 1.1%
corpus German-20K        
move train dev test total proportion
down1 7268 673 # 7941 83.6%
down2 1068 119 # 1187 12.5%
down3 109 0 # 109 1.1%
down4 10 0 # 10 0.1%
down5 1 0 # 1 0%
down6 6 0 # 6 0%
left1 103 2 # 105 1.1%
left2 94 3 # 97 1.0%
left3 34 0 # 34 0.3%
left4 6 0 # 6 0%

三、训练span parser

经过进一步的处理,把数据处理成结构树的形式后,我们使用minimal span parser(github链接)来训练。数据格式如下图所示,扩展的标签只有-remote,-down,-left,也就是说我们只考虑只有一条remote边,只向下走一步,只向左走一步。需要注意的是数据中会有 ‘(’ 和 ‘)’ 标点导致代码读取数据出错,统一替换成了 ‘{‘ 和 ‘}’。

(TOP (ROOT (H (A (PROPN Hammond)) (P (VERB defended)) (A (PROPN Dylan)) (D (ADV vigorously)) (U (PUNCT .)))))

经过初次实验,span parser在dev上的准确率只有79%左右。如果再经过多个步骤还原为UCCA图进行评价,结果肯定会更低。感觉还有提升的空间,因为span parser只用了pos特征,而baseline用了pos、dependency、entity等等大量的特征。

四、还原为UCCA gragh

要还原成UCCA图只需要逆向执行第一步中的步骤即可。根据规则可以还原discontinuity,但是remote边需要额外的模型来处理。如果span parser给出了正确答案,经过简单的处理可以得到如下图的一个例子。边A-remote就表示还有remote边指向同一个节点,所以需要设计一个分类模型来找出还有哪一个节点指向该节点。问题的关键是如何表征一个node,假设对于图中的每一个node都有一个向量表示,我们就可以用bilinear或者biaffine实现多元分类。(新增:排除图中红色的节点,不可能作为remote edge的parent)

remote2-example

每个node都对应了一个span和指向它的label,所以可以借鉴span parser中的方法用向量表示node,然后用MLP-Biaffine或者Bilinear实现一个多元分类模型。

参考


相关博客

上一篇 UCCA简介

评论