论文笔记 – Scale Up Event Extraction Learning via Automatic Training Data Generation

Ying Zeng, Yansong Feng, et al, “Scale Up Event Extraction Learning via Automatic Training Data Generation”, AAAI 2018

1 简介

本文想法非常新奇。传统的事件抽取是分成 trigger classification 和 argument classification 两步,这篇文章却认为,trigger 并不是必要的。很多时候,句子里有几个关键的 argument,就足以判断出 event type。作者就设计了一种 序列标注找关键 argument → argument 匹配知识库得到事件 的事件抽取算法。

这算法还有个好处,就是能提取一个 mention 可能包含的多个 event type,这个第三部分具体说。

顺着这个思路,这篇文章还提出了一种用知识库和远程监督,来生成数据的方法,很方便就能生成大量数据。另外,本文还在 Bi-LSTM + CRF 的基础上,加入了一些对于 BIO 标注的约束,将其设计成整数线性规划(ILP)的问题求解,让整个事件抽取算法性能略有提升。

2 背景知识

2.1 远程监督 distant supervision

下面这段是网上搜的

  • 定义:只要包含两个 Entity 的句子,都在描述同一种关系。
  • 用途:主要用来为关系分类任务扩充数据集。
  • 优点:能够很快速地为数据集打上标签
  • 缺点:它假设只要包含两个 Entity 的句子,都在描述同一种关系,这个假设会产生很多地错误标签。可能这两个 Entity 这是与某个主题有关。 因此往往还需要用一些过滤的方法去筛选出对关系分类有用的句子,比如 sentence-level Attention。

2.2 事件提取

3 方法

3.1 key insight

简介说过,这篇文章认为不一定非得用 trigger 判断 event type,用一些关键的 argument 也可以。这样就不用做 trigger identification,就简单很多。

3.2 数据生成

3.2.1 方法

数据的生成是借助 CVT table 做的。CVT table 是现成的,它的每一项,都包含一堆 entity,这堆 entity 就对应一件事。这篇文章把 entity 当做 argument,认为只要能在句子里找到 argument,那么这句话就说的是 CVT 表项对应的那件事儿,也就找到了 event type。这就是远程监督的思想。

由于 CVT 表里没写 event type(只是 event 编号),所以可能得先在对应句子里,用传统的事件抽取方法找到 event type?(这是我猜的,文章里没有写)最后,可能会有多个 CVT 表项对应同一个事的情况。

3.2.2 关键 argument 的选取

如果非得让一句话里出现 CVT 表项的全部 entity(argument),那就太为难了,实验里也是很难生成这样的句子。于是作者就松弛了一下,只要句子里找到 CVT 表项里关键的 argument,那这句话的 event type 就是 CVT 表项的 event。

那问题就来了,什么才是“关键”呢?作者给出了标准:$I_{cvt,arg}$ 是 argument $arg$ 对于 $cvt$ 这个 event type 的重要分值,

$$I_{cvt,arg} = \log\frac{count(cvt,arg)}{count(cvt)\times count(arg)}$$

其中 $count(cvt)$ 是 CVT table 里面 event type 是 cvt 的项的个数,$count(arg)$ 是 CVT table 里面 event type 是 cvt 的项里,$arg$ 这个 argument 出现的次数,$count(cvt,arg)$ 是 CVT table 里面 event type 是 cvt 的项里,包含 $arg$ 这个 argument 的表项个数。大概意思就是归一化的共现频率越高,越重要。

计算得到重要度的分值之后,再根据下列三条规则判断是否重要:

  1. 分数排在前一半的,重要。这个“一半”是试出来效果最好的。
  2. 描述时间的,重要。因为非常有可能存在“同一批 entity 在不同时间做了不同的事”这种情况。很多 CVT 表项中不包含时间,这里就在 generate 的时候,如果在句子里发现了时间,就把时间加到表项里。
  3. 如果两个 argument 在句法树上距离太远(2),不重要。这里举了一个例子:A and B witnessed the marriage of C. 这里 AB 并非结婚,在句法树上看,AB 和 marriage 距离不近。

小结一下。数据生成的方法就是检查句子里是否包含所有关键的 argument,如果包含,则这句话便收入数据集中,关键的 argument 就是所谓的标注。

3.2.3 方法的局限

  1. 远程监督的缺点(上文有述)
  2. 需要进行实体对齐
  3. 当 argument 是代词的时候,由于不算 entity,故本方法识别不到

3.3 事件抽取

这篇文章的事件抽取是直接抽取关键的 argument,再加上 argument 大多是词组,因此就转化成一个序列标注的问题。目标是标出句子里的 BIO,这样就找到了这一堆实体,再去 CVT 表里匹配即可。

序列标注的模型使用的是 Bi-LSTM + CRF + ILP。Bi-LSTM 可以对于每个单独的词,很好地预测标签;而 CRF 的目标函数是整个序列的联合概率,可以让相邻的标签之间满足该有的依存规则。这都很常见,不多解释了,下面详细说说整数线性规划 ILP。

作者认为 Bi-LSTM + CRF 输出的序列还是不能很好地满足标注该有的规则,因此在这一步又加入了对 BIO 标注的约束。

令 $L$ 为 argument 可能的标签的集合,对于每个 token $w_i$ 和一个标签对 $l,l’\in L\times L$,都设置一个二元指示变量 $v_{i,l,l’} \in {0,1}$,如果 $w_i$ 的标签是 $l$ 且后面 $w_{i+1}$ 的标签是 $l’$,则 $v_{i,l,l’}=1$。ILP 的过程是最大化目标函数:

$$\sum_{i,l,l’}v_{i,l,l’} * (P_{i,l} + A{l.l’})$$

这里的 $P$ 和 $A$ 分别是 CRF 中的 emission score 和 transition score,$P_{i,j}$ 表示 $w_i$ 是标签 $j$ 的概率,$A_{i,j}$ 表示标签 $i$ 到标签 $j$ 的 transition score,是给好的参数。当然,最大化目标函数是要在以下四条约束下进行的:

  1. 每个 token 有且仅有一种标注,即

$$\sum_{l,l’} v_{i,l,l’}= 1$$

  1. 指示变量 $v$ 代表前后两个 token 的标注,所以肯定得有传递性,即如果 $v_{i,l,l’}=1$,那么一定 $\forall ; l^*$,使得 $v_{i+1,l’,l’^*}=1$,即

$$v_{i,l,l’}=\sum_{l^*}v_{i+1,l’,l^*}$$

  1. 如果当前 token 标注是 I,那么上一个一定是 B 或 I,即

$$v_{i,I,l’} = v_{i-1,B,I}+v_{i-1,I,I}$$

  1. 对于一个 event type 对应的所有关键 argument,要么共现,要么共不现。比如一件事有 arg1 和 arg2,那么

$$\sum_{i,l’}v_{i,B-arg_1,l’}\le n * \sum{j,l^*} v_{j,B-arg_2,l^*}$$

其中 $n$ 是句子长度。这个式子的意思就是,如果句子里没有 arg2,那么也不能有 arg1;如果有 arg2,那么 arg1 最多也就是句子长度个(这个松弛的有点太过分了吧…)

这样的优化过程,就能让最后的输出结果满足上述条件。

3.4 多重 event type 的情况

首先,啥叫多重 event type 呢?这里举个例子:

Kevin Spacey stared as Frank Underwood in theNetflix series House of Cards, and later as Tom Brand in Nine Lives.

在这句话里,“stared” 作为一个 trigger,既是前半句 film performance 这个 event type,又是后半句 tv appearance 这个 event type,传统的先 trigger 后 argument 的方法没法识别出两种。而本方法看到了 argument 的共现,就能找出多重的 event。

具体的找法如下:用 CRF 的输出做 ILP,迭代 t 次之后,得到最佳的标注序列 $s^t$,再从这个时候开始,继续迭代,直到 $s^T$ 和 $s^1$ 的分数差距大于 $\lambda$ 为止。(意思就是大于 $\lambda$ 且最少 $t$ 次)那么得到的一组标注 ${s^1,…,s^{T-1}}$ 就是多重事件的标注了,每个对应一种可能。实践下来,平均每句话有 1.07 种最好的标注。

3.5 识别不关键的 argument

上面的过程识别出了关键 argument,也就识别出了对应的 event type。但是句子里还可能有不关键的 argument 呀,还得把他们也是别出来。就把刚才得到的关键 argument 的 label 接到 word embedding 后面,输入 Bi-LSTM + CRF,得到标注。这里无需 ILP,因为不重要的 argument 没有那些限制。

4 实验

4.1 生成数据

实验发现,如果要匹配全部的 argument,那么只能生成非常少的句子;如果把分数排在前一半的作为关键 argument,只匹配这些,生成的句子量将翻 1000 倍!但是准确度就很低,那么加上“时间词都很关键”和“太远的不要”,最后生成的数据里,数量和准确率都还不错。

作者还把这个数据生成的算法放在 ACE 数据集进行实验:把 ACE 数据集的句子先不标注,然后去匹配 CVT 表,看能不能包含事件。最后的结果是 ACE 的句子有 65% 能有事件,作者觉得这是因为,ACE 数据集中很多 argument 都是代词,咱们的方法办不了,以后得想想怎么先做个实体对齐。

4.2 事件抽取

  1. 只有本方法可以应对 multiple type event mentions。
  2. Bi-LSTM + CRF + ILP 要比 Bi-LSTM 和 Bi-LSTM + CRF 在召回率和 f1 都好,但是准确率最差。
  3. 通过 ILP 里面的第四条约束,可以通过一个关键 argument,很快找到匹配的其它 argument。
  4. 这个方法成功把 132 个 multiple event type 的句子识别,并且有 95.6% 的准确率。但是对于每个 event,argument 的识别都很差劲。

4.3 手动评估

本文又拿自己生成标签的方法,跟手动标进行对比,发现:

  1. 本文的方法很多时候找到了关键 argument,但是其实这句话并没有再说这件事。这是远程监督的老毛病了。
  2. 本文的所谓匹配 entity,其实只是匹配 token 而已,并没有什么销岐等等语义上的理解,这也有待改进。
  3. 远程监督的方法,可以创造出 CVT 表里没有的 event type,这种自监督的感觉就很厉害了。

作者还在其他领域的语料里测试,结果都挺好。

5 总结

  1. 读了过这篇文章,argument 和 trigger 的区别在我心中更小了。我的理解是这样:为啥以前要先搞 trigger?因为 trigger 大多是动词,在句子里比较少,识别比较方便——这只是在操作上有利,但是在语义上,这并没有什么道理,所以只用 argument 也可。
  2. 作者的数学功底是真强,能把标签的约束转化成优化问题,我还以后还是要好好学数学啊!

[mathjax]

Leave a Comment

电子邮件地址不会被公开。