背景:前几个月,百度举办了“2019语言与智能技术竞赛”,其中有三个赛道,而我对其中的“信息抽取”赛道颇感兴趣,于是报名参加。经过两个多月的煎熬,比赛终于结束,并且最终结果已经公布。笔者从最初的对信息抽取的一无所知,经过这次比赛的学习和研究,最终探索出在监督学习下做信息抽取的一些经验,遂在此与大家分享。
笔者在最终的测试集上排名第七,指标F1为0.8807(Precision是0.8939,Recall是0.8679),跟第一名相差0.01左右。从比赛角度这个成绩不算突出,但自认为模型有若干创新之处,比如自行设计的抽取结构、CNN+Attention(所以足够快速)、没有用Bert等预训练模型,私以为这对于信息抽取的学术研究和工程应用都有一定的参考价值。
基本分析 #
信息抽取(Information Extraction, IE)是从自然语言文本中抽取实体、属性、关系及事件等事实类信息的文本处理技术,是信息检索、智能问答、智能对话等人工智能应用的重要基础,一直受到业界的广泛关注。... 本次竞赛将提供业界规模最大的基于schema的中文信息抽取数据集(Schema based Knowledge Extraction, SKE),旨在为研究者提供学术交流平台,进一步提升中文信息抽取技术的研究水平,推动相关人工智能应用的发展。------ 比赛官方网站介绍
任务介绍 #
本次的信息抽取任务,更精确地说是“三元组”抽取任务,示例数据如下:
{
"text": "九玄珠是在纵横中文网连载的一部小说,作者是龙马",
"spo_list": [
["九玄珠", "连载网站", "纵横中文网"],
["九玄珠", "作者", "龙马"]
]
}
就是输入一个句子,然后输出该句子包含的所有三元组。其中三元组是(s, p, o)的形式,它的s是subject,即主实体,为query中的一个片段;而o是object,即客实体,也是query中的一个片段;而p是predicate,即两个实体之间的关系,比赛事先给出了所有的候选predicate列表(schema,一共50个候选predicate)。总的来说,(s, p, o)可以理解的“s的p是o”。
比赛给出了将近20万的标注数据,标注质量也颇高,感谢百度。(请不要问我要数据啊,我不负责分享数据集。据说数据集迟点会在http://ai.baidu.com/broad/download公开发布,到时就可以下载了。)
样本特点 #
很显然,这是一个“一对多”的抽取+分类任务,通过对人工观察样本情况,发现其特点如下:
1、s和o未必是分词工具分出来的词,因此要对query做标注才能抽取出正确的s、o,而考虑到分词可能切错边界,因此应该使用基于字的输入来标注;
2、样本中大多数的抽取结果是“一个s、多个(p, o)”的形式,比如“《战狼》的主演包括吴京和余男”,那么要抽出“(战狼, 主演, 吴京)”、“(战狼, 主演, 余男)”;
3、抽取结果是“多个s、一个(p, o)”甚至是“多个s、多个(p, o)”的样本也占有一定比例,比如“《战狼》、《战狼2》的主演都是吴京”,那么要抽出“(战狼, 主演, 吴京)”、“(战狼2, 主演, 吴京)”;
4、同一对(s, o)也可能对应多个p,比如“《战狼》的主演和导演都是吴京”,那么要抽出“(战狼, 主演, 吴京)”、“(战狼, 导演, 吴京)”;
5、极端情况下,s、o之间是可能重叠的,比如“《鲁迅自传》由江苏文艺出版社出版”,严格上来讲,除了要抽出“(鲁迅自传, 出版社, 江苏文艺出版社)”外,还应该抽取出“(鲁迅自传, 作者, 鲁迅)”。
模型设计 #
在“样本特点”一节我们列举了5点基本的观察结果,其中除了第5点略显极端外,其余4点都是信息抽取任务的常见特点。在正式动手之前,我简单调研了目前主要的信息抽取模型,发现竟然没有一个模型能很好地覆盖这5个特点。所以我放弃了已有的抽取思路,自行设计了一个基于概率图思想的抽取方案,然后从效率出发,利用CNN+Attention完成了这个模型
概率图思想 #
比如,一种比较基准的思路是先进行实体识别,然后对识别出的实体进行关系分类,但这种思路无法很好地处理同一组(s, o)对应多个p的情况,同时会存在采样效率地的问题;另一种思路是作为一个整体的序列标注来搞,参考论文《Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme》,但这种设计不能很好地处理同时有多个s、多个o的情况,需要非常丑陋的“就近原则”;还有“杀鸡用牛刀”地动用强化学习的方法...而无一例外地,这些方法都不能解