事件抽取算法DMCNN
最近一直在阅读事件抽取方向的相关论文,这里做一个系列的论文阅读笔记。
DMCNN是一种基于动态池化(dynamic pooling)的卷积神经网络模型的事件抽取方法,来自论文《Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networks》。这是一种pipeline方式的事件抽取方案,即对触发词的检测和识别、对论元的检测和识别两个任务是分开进行的,后者依赖于前者的预测结果。两个子任务都被转换成了多分类问题,模型都采用DMCNN,只是稍有不同。本文将对该方法做一个简要的介绍。
一、核心思想
1.1 两类特征(低阶和高阶特征)
我们知道通常进行文本类任务时都需要进行特征提取,对于事件抽取而言有两类较为重要的特征:词级别语义特征以及句子级别语义特征。
词级别语义特征
词级别特征有许多,比如词性、实体信息等。但这些信息本质上只是离散的类别标签,不能表征语义,而词级别的语义信息对于事件抽取是很重要的。比如以下两个例子:
句1:李晓明昨天在选民投票中beat了他的对手王大苗。
句2:李晓明昨天beat了王大苗,王大苗鼻青脸肿了。
两个句子的触发词都是beat
。beat比较常见的意思是打/击,也就是攻击类。句2中beat的确代表了攻击事件,但在句1中却不是如此。
如果考虑到李晓明、王大苗是政治类人物实体的信息,我们大概率会知道句1中的触发词beat代表了选举事件。按这个逻辑那么句2中的beat就会被误认为代表了攻击事件。但是从词级别语义角度,选民投票和鼻青脸肿则会带给我们区分性的信息,足以让我们知道句1是选举事件,句2是攻击事件。
句子级别语义特征
相对于词级别的语义特征而言,句子级别的语义特征更高阶,更抽像。它是由句子中的词之间语义交互而来的整体语义,对于事件抽取任务本身也很重要。
句3:昨日,在A地区发生了斗殴,王大苗轻微擦伤。
比如句3中其实有两个触发词:斗殴
和擦伤
,分别表示攻击和受伤事件。从句法分析角度,我们可以知道擦伤的受事者是王大苗,但是斗殴和王大苗之间的关系却不那么直接。如果我们挖掘了整句话的语义,知道攻击事件可以导致受伤事件,那么也就知道了斗殴的参与者是王大苗了。也就是通过句子语义,可以挖掘到王大苗在受伤事件中扮演了参与者的角色。
1.2多事件场景
在两类特征中,词级别的语义特征可以由词嵌入(比如:word2vec等)获得,那句子级别的语义特征呢?这篇工作采用的是CNN,即通过卷积和池化不断往上层抽像,最终将词级别语义特征转换成句子级别语义特征。
但是又有一个问题,这篇工作实际在做事件抽取(论元以及触发词挖掘)的时候是当作多分类问题去做的,也就是对每一个候选论元或候选触发词都会进行一次多分类,当然最终的多分类层的输入就是词级别语义特征+句子级别语义特征。如果采用传统的CNN,那么最终获得的句子级语义特征就全都一样了。
但是实际情况是:一个句子内可能有多个事件、在不同的事件中同一实体可能扮演不同的角色。那么我们也应该在对不同的候选触发词、不同的候选论元进行预测时,提供针对性的句子语义(有偏向性、有侧重点)。如何提供呢?这篇论文采用的是分段的方式,至于如何分段,那就跟每次进行预测时的候选论元、候选触发词在句中的位置相关。
二、模型细节
注意:这里按原文顺序先讲针对论元的模型设计,再讲针对触发词的模型设计。后者模型基本和前者一致,只是先验信息更少。
2. 1针对论元挖掘的DMCNN
-
输入层(特征)
DMCNN输入层包括了三种类型的特征:CWF、PF、EF,分别代表了词嵌入、位置嵌入以及事件类型嵌入。三个嵌入拼接的结果作为一个词的词级别特征。这里的位置嵌入实际表达的是每个词相对于触发词以及候选论元的位置,事件类型即触发词的类型。(个人感觉这种方式又进一步地使得每个词在不同事件不同候选论元时有了区分性特征。加上分段池化的方式最终获得的句子级语义就更具针对性了,可谓双重保障啊。)
-
卷积+分段(动态)池化
卷积部分就不再赘述了,简单地说就是多个filter提取多个featureMap。
传统的池化(无论是Max Pooling还是Average Pooling)最终一个featureMap都只有一个结果。分段池化就是对卷积的结果分块,每块单独池化,最终分了3段就有3个值。如上图所示,分段的切分点分别是触发词和候选论元。这样无论是触发词同候选论元不同,触发词不同而候选论元相同、还是触发词不同且候选论元同…最终获得的句子级语义特征都不同了。
-
分类层
最后分类层的输入是词级语义特征+分段卷积后的句子级语义特征,然后经过一个线性层就获得了相应角色的分值了。需要注意的是这里词级别的语义特征仅是由触发词和候选论元以及它们左右的词的词嵌入特征拼接,可以把左右词的词嵌入看作local context,而句子级的语义特征则是global context。
2.2 针对触发词挖掘的DMCNN
- 相同
针对触发词的挖掘基本模型也是DMCNN,这没什么太多说的,因为两个任务都被当作了分类任务。 - 不同
不同的地方只是因为触发词提取时额外的信息就只有候选触发词,所以- 词级的语义特征:触发词及其左右的词的嵌入拼接
- 句子级语义特征:首先位置特征只相对于候选触发词而言,然后则是分段也只有两段(因为切分点就只有触发词)
三、总结和疑问
3.1 核心思想
-
分段池化(动态池化)+ DMCNN的输入(CWF+PF+EF)
原文说是考虑到一个句子中可能存在多个事件,同一论元在不同事件中可能扮演不同的角色,所以想用分段卷积的方式保留更多的特征。
个人感觉是通过融合位置、事件类型特征以及分段卷积两个方式去加入先验信息,便于有侧重点的有偏向性的进行特征提取,最终获得不一样的句子信息。
-
叠加词级别语义、句子级别语义(融合低阶高阶语义或者说local context 以及global context)
这个地方比较有趣的是作者的一个发现:触发词挖掘的时候,词级语义特征更重要;而论元挖掘的时候句子级语义特征更重要。当然两个任务融合两个特征之后都取得了最好的效果。也就是说大部分情况而言我们看到触发词大概就知道发生了什么事,但是少数时候由于词有歧义,这个时候如果只看触发词和它附近的少数词,很容易犯错,但是结合整体句子的意思,我们能更好地进行判定。而对于论元角色的判定,更多的是需要理解整个句子的意思。
3.2 疑问
由于还没有看源码,有比较困惑的几个点:
-
候选触发词从何而来
候选论元一般是实体等词,但是候选触发词呢?难道是句子中每一个词?
-
多个token
文中的都是对单个词判定,可是触发词或者候选论元不一定是单个词,万一是多个token呢?文中没有说是不是考虑的BIO标签,如果是,好像还能勉强说的过去,不是的话似乎无法处理多个token构成触发词或论元的情况把。
四、后续
事件抽取系列看了很多篇工作了,后续再逐步上JMEE等。DMCNN的疑问后面看完源码再来更新吧。