作者:高开远
学校:上海交通大学
研究方向:自然语言处理
"正确的判断来自经验,而经验来自于错误的判断"
之前做过的百度今年的语言与智能技术竞赛,其中有一个子赛道就是关于信息抽取。信息抽取(Information Extraction)是指从非结构化的自然语言文本中抽取出实体、属性、关系等三元组信息,是构建知识图谱的基础技术之一。IE的子任务大概有以下几种:
之前有介绍过关于实体识别的一些内容,今天这系列文章就主要来看看关系抽取是怎么做的。
同样,在进入具体RE论文之前,先对这个任务有个大概的了解吧。关系抽取的目的是从文本中抽取两个或多个实体之间的语义关系,举个栗子:
关系抽取的解决方案主要有以下几类:
篇幅限制,这里就不具体展开,关系抽取的更具体介绍可以参考斯坦福的Introduction to NLP,不是cs224n!
挺久远的一篇文章,可以算是CNN用于文本处理比较早的一批了。在这之前,大多数模型使用的都是feature-based或者kernel-based方法,不仅处理过程复杂而且算法最终的效果很大程度上依赖于特征设计的有效性。基于此,作者提出了一种基于CNN的深度学习框架,可以自动提取输入中多层次的特征(词层面和句子层面)如下所示:
模型可以分成以下几个部分,接下来一一介绍:
标准操作word embedding,不过用的不是现在主流的word2vec、glove等等,而是预训练的来自Word representations: A simple and general method for semi-supervised learning的词向量。
特征抽取模块设计了两种features:词法特征(Lexical-Feature)和句法特征(sentence-level feature)
在确定实体关系任务中,词法特征是非常重要的。传统的词法特征提取主要包括实体本身、名词性实体对以及实体之间的距离等等,这些特征很大程度上依赖于现有的NLP工具,对RE任务最重效果容易引起误差放大。但是在有了word embedding之后就可以对词法特征设计更恰当的特征,一共有五部分:
举个栗子,对于句子
注意:以上都是word embedding形式
句法特征提取方案如下:
在第一步Window Processing
设计了两个特征输入,一个是单词特征(Word Features), 一个是位置特征(Position Features)
在这里插入图片描述
最后对每一个单词将Word Features和Position Features拼接起来,得到features维度为:
,其中,d_p 为position embedding的维度。
得到句子的抽象表达之后,送入卷积层进行特征提取。不过这里的卷积核设计有点奇怪只有一层将Window Processing
层的输出进行线性映射:
接着为了每一维度提取最重要的特征,设计了max-pooling层:
最后通过非线性激活层得到句子特征表示:
output层的输入是将上一层词法和句法层面提取出来的特征进行拼接
,并送入softmax层进行关系的多分类。损失函数为交叉熵损失,优化方式为SGD。
数据集使用的是SemEval 2010 Task 8,共有19种关系类别(双向的9类 + 一类Other
)。
以上就是基于CNN进行关系抽取的整体思路。总结一下:
CODE HERE
15年的文章,在之前Zeng的模型基础上加入了多尺寸卷积核,并且更"偷懒地"丢弃了人工的词法特征,完全依靠word embedding和CNN来做特征。完整的框架和文本分类领域非常经典的Text-CNN很像,之前在文本分类模块我们也有详细介绍过(【论文复现】使用CNN进行文本分类)
relation classification
在这里插入图片描述 relation extraction
在这里插入图片描述
直接看模型,也是非常传统的文本CNN框架,但是作为顶会文章肯定是有一些亮点的。
模型的框架这里就不多啰嗦了,直接看重点,想比与之前的CNN论文,本文的创新主要有以下几点:
1. 损失函数
不同于一般多分类使用的softmax+cross-entropy损失函数,这里独特地设计了一种margin-based ranking loss
:
其中每个参数的意义如下
:输入句子sent, sent对应的正确标签,sent对应的错误标签 m^{+}:正标签对应的大于0的margin m^{-}:错误标签对应的大于0的margin
:正样本对应的得分
:负样本对应的得分 $\gamma$:缩放系数
理解了参数的意思之后,就可以明白这个损失函数是在干什么了。首先右边第一项计算的是正样本的得分只有大于margin的时候才不会有损失,否则就需要计算损失,即得分越高越好;右边第二项计算的是负样本的得分只有小于 -margin才不计算损失,即负样本得分越小越好;是不是跟SVR的感觉有点像?这样整体的损失函数的目的就是更加清晰地区分正负样本。 实验结果显示,自定义损失函数相较于CE损失效果提高2%左右。
那么具体实现中,怎么去确定负样本采样呢?
2. 对Other类别的处理
Other类别表示两个标定的entity没有任何关系或者是属于不存在与给定关系集合中的关系,对于模型来说都是噪音数据。经过之前是实践(参考github),发现确实模型在对Other类型的处理部分并不是很理想,拉低了最终的得分。因此作者提出在训练阶段,直接不考虑Other这一类别,即对于Other的训练数据,令上一节中损失函数第一项为0。那么在预测阶段,如果其他类别的score都为负数,那么就分类为Other。从实验结果看,这个点的提高有2%左右。
原文链接:
https://blog.csdn.net/Kaiyuan_sjtu/article/details/89877420
本文由作者原创授权AINLP首发于公众号平台,点击'阅读原文'直达原文链接,欢迎投稿,AI、NLP均可。