事物、概念之间的关系是人类知识中非常重要的一个部分,但是他们通常隐藏在海量的非结构文本中。为了从文本中抽取这些关系事实,从早期的模式匹配到近年的神经网络,大量的研究在多年前就已经展开。
然而,随着互联网的爆炸发展,人类的知识也随之飞速的增长,因而对关系抽取(Relation Extraction, RE)提出了更高的要求,需要一个有效的RE系统,能够利用更多的数据;有效的获取更多的关系;高效的处理更多复杂的文本;具有较好的扩展性,能够迁移到更多的领域。
本文介绍一种基于循环神经网络的关系抽取方法。
作者&编辑 | 小Dream哥
1 导论
因为基于统计的关系抽取方法需要复杂的特征过程,基于深度学习的方法得以引入,最早的应用在关系抽取中的深度学习模型是CNN,上一篇我们介绍了一种较早的用于关系抽取的CNN模型,感兴趣的读者可以看看:
【信息抽取】如何使用卷积神经网络进行关系抽取
相比于基于统计的方法,基于CNN的方法确实取得了不错的进展,但是CNN对于时序特征的抽取能力偏弱,特别是
当两个实体之间的“距离”比较远时,CNN模型的效果会变差。
RNN时最适合做时序特征抽取的模型,本文介绍一种简单的基于RNN的关系抽取框架,虽然简单,但是在当时取得了非常不错的效果。
Daojian Zeng, Kang Liu, Siwei Lai, Guangyou Zhou, and Jun Zhao. 2014. Relation classifification via convolutional deep neural network. In Proceedings of COLING, pages 2335–2344.
2 网络结构
如上图所示,是这次要介绍的基于RNN的关系抽取模型的的框架图,总的来说,这个框架非常的简洁,主要包括3个部分:词嵌入,双向RNN层,池化层。
1)词嵌入(Word Representation)
词嵌入就是目前NLP领域最普通的词嵌入,每一个输入词语转化成一个固定维度的向量。这个向量是从预先训练好的词向量字典中查找得到,这份词向量字典中的词向量表征了词之间的语义关系。论文中用到的词向量是用word2vec训练好的词向量。
2) 双向RNN层
采用双向RNN层进行特征抽取,这里的双向RNN是最朴素的RNN模型,通过双向RNN建模输入序列的语义特征。循环神经网络是NLP中最基本的概念,这里就不再赘述了。
3) 池化层
在现在的NLP模型中,池化层并不多见,但是在早期的深度学习模型中,池化用的还挺多的,主要是用于特征抽取。
输入序列经过双向RNN层的特征抽取之后,得到一个输出序列[h1,h2,h3,...ht],那么如何利用这些特征,得到一个句向量,来表征输入序列呢?该论文中,参考CNN的池化层,做如下的操作,得到句向量m:
其中t表示输入序列的长度,M表示RNN的size。
总的来说,这个操作就是,对每一个维度,取t个特征向量中最大的值,得到一个维度为M的向量m,用来表征输入序列。
为什么最大池化能有效呢?论文认为,只有那些关键的特征对最后的关系分类有作用,通过模型的训练,可以突出这些特征,从而获得效果。
4) 输出层
输出层就非常的简单了,接一个全连接层,在接softmax就可以输出分类,然后用交叉熵做损失函数,用来训练了。
需要提出的是,论文的输入还引入了实体位置的标识(Position indicators)。即用特殊的标识在输入序列中将两个实体标识出来,例如:
<e1>周杰伦</e1>的<e2>七里香</e2>很受欢迎。
3 模型效果
如上图所示,展示了模型增加不同部分,对最终F1值的影响,我们可以得出一下结论:
(1) 最大池化对模型的效果影响很大:池化的过程能够提取出对关系分类最重要特征,用于分类。
(2) 标识出实体的位置能够给模型带来很好的性能提升。
这些结论和经验对于后续的模型建模都是宝贵的经验,基于这些经验,后面的工作才能更能进一步。
总结
本文介绍了一种基于循环神经的关系抽取的方法,总的来说,这个模型很简洁,但是效果却很好。
最大池化能够提升模型的性能,但是同时也会损失很多特征。因此这个模型对于一些难度较高的,需要一定的语义理解关系的情况会比较吃力,这也是为什么后面的NLP模型都摒弃了池化层的原因之一。
前面介绍的都是关系分类模型,下一篇介绍一种一个模型就能够抽取出来实体和关系的联合模型。
下期预告:一种端到端的关系抽取模型
- =