Chen, Yubo, et al. “Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networks.” ACL 2015
1. 介绍
这篇文章是第一次用 DNN 方法做事件抽取。
之前的方法都是通过文本分析和语言知识获得特征。特征可以分成两类,即词汇级 和 句子级的。词汇级特征包括词性标注(POS)、实体信息、同义词特征(token,lemma)等等,用来得到词的语义信息;句子级特征包括句法结构,用来得到词之间的关系(原文:“which aim to understand how facts are tied together from a larger field of view”)。
CNN 可以提取特征,可以利用最大池化保留句子里最关键的信息。然而,在事件抽取的问题里,一句话可能包含多件事,并且同一个 argument 在这几件事里有不同的 role。事实上,在数据集里,有 27.3% 的句子包含多个事件,这问题很重要。
这篇文章提出一种动态多池化卷积神经网络(DMCNN),可以免去各种麻烦的标注,并同时利用词汇级和句子级特征;为了保留句子里的多个关键事件,设计了动态多池化。
2. 方法
这篇文章大体上还是 Pipeline 的方法,分成 trigger classify 和 argument classify 两步。先用一个 DMCNN 作为 trigger 分类器,找到句子里的 trigger,并分类;如果句子里有 trigger,就再用一个差不多的 DMCNN 作为 argument 分类器,找到trigger 对应的 argument 并分类。由于 argument 这步比较复杂,就先说 argument classify 的 DMCNN。
DMCNN 结构如图所示。对于当前的词,我们输入这个词和它前后的 $c$ 个词的 embedding,通过 DMCNN,得到特征向量;用特征向量作为分类器的输入,有监督训练即可。接下来,我把 DMCNN 分成两部分,分别说明结构。

2.1 词汇级特征提取
是图中下面部分。这篇文章将输入词语的 embedding 直接拼接,就是词汇级的特征了,长度为 $d_l$。
2.2 句子级特征提取
是图中的上面部分。先构建一个 $n\times d$ 的输入矩阵。比如图中,之前得到的 trigger 是 fired,当前词是中间的 an。$c=4$,于是输入上下文共九个词,构建一个 9 $\times$ 7 的矩阵。7=4+1*2+1,其中 4(CWF) 是 an 上下文特征的维度,即对应位置词(比如 tank)的 embedding;中间的 1(PF) 是位置特征,是 tank 离 an 的距离(重复两遍可能是为了更重视?);后面的 1(EF) 是事件种类的特征,是 trigger 的 event type,这个是在第一步 trigger classify 时得到的。
用这个 $n\times d$ 矩阵输入,下面开始卷积。filter 大小为 $h\times d$,即从 $x_i$ 到 $x_{i+h-1}$ 的 $h$ 个词得到特征 $c_i \in R$($i$ 取 1 ~ $n-h+1$),扫一趟就得到特征向量 $c\in R^{n-h+1}$。上面说的是一个 filter,实际上是 $m$ 个 filter,最终得到 $(n-h+1)\times m$ 大小的特征向量。
为了从每个 $(n-h+1)\times d$ 的 feature map 里找到最关键的特征,这篇文章设计了动态多池化。先说说池化,前人方法的池化是从 feature map 里找到一个最大值。这无法满足一句话有多个事件的情况。这篇文章将每个 feature map 以 trigger 为界分开,图中即分成三部分,各自进行最大池化;再把 $m$ 个 feature map 的结果拼在一起,最终得到长度为 $3m$ 的特征。
最后,直接把 2.1 和 2.2 的结果拼到一起,就是最后的特征向量了,再进分类器(FC + Softmax),SGD 优化即可。
2.3 trigger classify
词汇级:只使用这个词和它的左右 token。
句子级:只有 CWF + PF,PF 是这个词的位置;句子由这个词分割成两部分。
3. 实验
- 在 trigger classification 和 argument classification 任务上,DMCNN 比当时的 SOTA 高 1% 左右。
- 使用动态多池化要比单纯的 CNN 提词汇级特征 + 传统句法分析得到的句子级特征 这种方法好很多(trigger classify 高 2.8%,argument classify 高 4.6%,一句话有多个事件的情况就高得更多,10% 左右了),故动态多池化是有效的。
- 对比传统的词汇级特征,用 DMCNN 更好。尤其是当词只在 test 出现,没在 train 出现时,DMCNN 好得多。作者猜测,这是因为 DMCNN 得到的特征表示是连续的,原始方法是离散的。
- DMCNN 如果不用词汇级表示,或不用句子级表示,都会更差。
4. 我的总结
这是我看的第一篇事件抽取文章。算法结构不难,是我第一次见 CNN 在文本上的使用,多池化也可以借鉴。