基本定义
关系抽取: 从一个句子中判断两个entity是否有关系,一般是一个二分类问题,指定某种关系
关系分类: 一般是判断一个句子中 两个entity是哪种关系,属于多分类问题。
论文简介
这篇论文发表于2014年,介绍了一个用于文本中实体对“关系分类”的模型,作为2014年的模型,它非常精巧的从多个level来进行特征获取以实现契合“关系分类”任务,分别是Lexical Level和 **Sentence Level ** 。并进行了一层简单的卷积处理,来精简参数量并保留关键信息。下面简单对其进行描述。
网络结构
整体结构直接上图:
2014年词向量逐渐崛起,本篇论文所介绍的网络结构中输入层不出所料,选择了word embedding(词嵌入),受限当时算力的匮乏,embedding size很小,应付短文本应该没有问题。
本篇论文的关键贡献在于对word embedding(词嵌入)的后续特征提取部分,分为两个level:Lexical Level Features以及 Sentence Level Features 。
Lexical Level Features
首先看Lexical Level(词级别)的特征提取:
分别使用了6个特征:
1、实体词1
2、实体词2
3、实体词1的上下文(左右一词)
4、实体词2的上下文(左右一词)
5、实体词的上游语义词汇(2)(实际实现中经常被忽略)
代码实现中,分别将这六个词向量按照最后一维concat起来,得到*[None, 6*width]**的向量,做词嵌入。按照论文来看,这样的效果非常不错,当然,这么多年了,我想这部分或许可以做一些改善,例如在实体词之间加入attention机制等。待补充…
Sentence Level Features
Sentence Level(句级别)特征这一部分是个亮点,作者认为词向量的提出虽然贡献很大,但仅用词级别的特征提取,是会丢失语序、上下文、句子整体的信息的(后面nlp的不断发展证明这个方向十分正确),所以作者使用了一个seq_length方向的词卷积,以尽量提取些句子级别的信息,并最后使用max pooling池化保留了提取出的关键信息。
但是要注意的是,这里的词卷积并非直接对词向量使用,而是做了一些处理,分别使用了WF(Word Features)和PF(Position Features)范畴来描述信息,WF使用当前词的前后上下文词(以当前词为中心窗口内的词汇)的词向量。而PF类似于transformer的embedding层的position embedding,不过与之不同的是,这里使用的当前词到两个实体词的相对距离作为衡量,而且进行的计算并不是直接相加在本身的词向量上,而是和本身的词向量concat起来,类似:
- tf.concat([sentence, pos_1,pos_2], axis=-1)
这样依然能够保留模型的对称性,并且包含位置信息。
随后就是将处理好的WF以及PF两者concat起来的向量作为多核词卷积的输入,padding采用same,stride取1,并且使用bias,并将输出经过一个激励函数(例如leaky_relu之类的),最后使用max pooling池化这输出
,注意这里的max池化维度消除掉了seq_length的维度,作者描述这样消除掉了句子长度波动的影响。最后再使用个tanh激活函数的全连接层,至此,输出的既是sentence level的特征。
Classification
最后的分类任务实现比较简单,将之前的Lexical Features以及Sentence Features输出concat起来:
- tf.concat([lexical, sentence], axis=1)
具体来看,就是两个实体词相关的6个词向量,以及sentence-level的句向量所串联的形式。
然后使用softmax激活函数处理做多分类任务。
自己的胡思乱想
这个模型,分别使用了实体词对本身相关的词特征以及基于位置信息和临近上下文信息的句特征做了整合,并经过了实验后,发现效果不错,网络本身并不复杂,但构思非常巧妙,作者对关系分类任务本身的理解很深入,作为baseline模型非常合适。
这些年来,attention机制种类繁多,发展迅速,相信它对实体词对这件的关联信息使用帮助会很大,可以进行思考学习。
本文中作者未使用RNN系统来提取语序信息,不知道RNN对关系分类这类词对的任务会不会有帮助(在句子长度语序混乱的情况下或许会帮倒忙?)。