最近需要调研NLP中的关系抽取任务
找了一篇RE的综述,关于早期研究的介绍较为笼统,因此找到斯坦福的自然语言处理入门课程学习。
课程是2012年的,比较早,正好学习一下早期的RE模型。
看视频的过程中参考了这篇博客:斯坦福大学-自然语言处理入门 笔记 第十课 关系抽取(relation extraction)
相关资源:
关系抽取一般是指抽取关系三元组(Resource Description Framework (RDF) triples)而不是抽取复杂关系。
为什么进行关系抽取?
下面是一个QA的例子
The granddaughter of which actor starred in the movie “E.T.”?
(acted-in ?x “E.T.”)(is-a ?y actor)(granddaughter-of ?x ?y)
要回答“哪个演员的孙女参演了E.T?”这个问题,需要提取以下三个三元组:
下面是关系抽取任务中一些常见的关系:
那么如何进行关系抽取呢?
在使用神经网络之前,主要有
举个例子,"A, such as B"中"such as"这个短语就表名了A与B之间存在这个类与实例的包含关系。
(Hearst, 1992): Automatic Acquisition of Hyponyms
主要思想:特定关系会发生在特定实体之间,如:
所以使用命名实体标签(named entity tag)来帮助我们进行关系抽取。
2个特定实体间的关系是可列举的
比如“药物”实体与“疾病”实体之间的关系可能是“治愈”,“预防”,“导致”等等
但人和组织这两个实体之间的关系,就不太可能是“治愈”。
为什么训练了两个分类器?
缩写 | 含义 |
---|---|
NP | noun phrase |
PP | prepositional phrase |
VP | verb phrase |
可以使用任何分类器:
最大熵、朴素贝叶斯、SVM
在训练集(training set)上训练,在发展集(dev set)上调试,在测试集(test set)上测试
通过计算precision,recall以及F1评估分类结果
收集一组具有关系R的种子对(seed pair)
迭代:
下面是一个实例
下面是另一篇文章中的实例
Bootstrapping 算法的输入少量实体关系数据作为种子,找到更多有某种关系的相关数据。
存在的问题是利用少量的种子数据在大规模数据中搜寻出来的结果,是否是我们真正想要的,会不会存在歧义的数据,这是 Bootstraping 算法的语义漂移问题。
参考文献:E. Agichtein and L. Gravano 2000. Snowball: Extracting Relations from Large Plain-Text Collections. ICDL
使用类似的迭代算法
也和上面一样利用一组例子(instance)抽取特征
构建具有相似前缀、中间、后缀和的提取模式
参考文献:
[1] Snow, Jurafsky, Ng. 2005. Learning syntactic patterns for automatic hypernym discovery. NIPS 17
[2] Fei Wu and Daniel S. Weld. 2007. Autonomously Semantifying Wikipeida. CIKM 2007
[3] Mintz, Bills, Snow, Jurafsky. 2009. Distant supervision for relation extraction without labeled data. ACL09
远程监督的思想:
如果两个实体在已知知识库中存在,并且两者有相对应的某种关系(Freebase中罗列的关系之一),那么当这两个实体在其他非结构化文本中存在的时候也能够表达这种关系。认为同时包含这两个实体的所有句子也在表达这种关系,可以将这些句子作为这种关系的训练正例。
基于这种强有力的假设,远程监督算法可以利用已有的知识库,给外部非结构化文本中的句子标注某种关系标签,相当于自动语料标注,能够获取大量的标注数据供模型训练。
远程监督的两种范式
参考文献
M. Banko, M. Cararella, S. Soderland, M. Broadhead, and O. Etzioni. 2007. Open information extraction from the web. IJCAI
开放信息抽取:
在没有训练数据和关系列表的情况下,从网页中抽取关系
因为抽取的都是来自互联网语料的新关系,因此我们无法计算准确率(不知道哪些是正确的,即不知道真正例有多少)和召回率(不知道那些是错过的,即不知道假反例有多少)
我们只能大致计算一个准确率。计算的方法是,从结果中随机抽取一些关系,人工来判断这些关系是否是正确的。
我们也可以基于不同水平的recall来计算precision(Can also compute precision at different levels of recall.)