Press "Enter" to skip to content

中科院刘康:低资源环境下的事件知识抽取

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

人工智能论坛如今浩如烟海,有硬货、有干货的讲座却百里挑一。“AI未来说·青年学术论坛”系列讲座由中国科学院大学主办,百度全力支持,读芯术、paperweekly作为合作自媒体。承办单位为中国科学院大学学生会,协办单位为中国科学院计算所研究生会、网络中心研究生会、人工智能学院学生会、化学工程学院学生会、公共政策与管理学院学生会、微电子学院学生会。 2020 年6 月20日,第16期“AI未来说·青年学术论坛”NLP前沿技术及产业化线上专场论坛以“线上平台直播+微信社群图文直播”形式 举行。 中科院刘康 带来报告《低资源环境下的事件知识抽取》。

 

中科院刘康 的报告视频

 

刘康,中国科学院自动化研究所模式识别国家重点实验室研究员,博士生导师。 研究领域包括信息抽取、网络挖掘、问答系统等,同时也涉及模式识别与机器学习方面的基础研究。 在自然语言处理、知识工程等领域国际重要会议和期刊发表论文 90 余篇, Google Scholar 引用 6300 余次,单篇引用 1100 余次。 曾获 COLING 2014 最佳论文奖、 Google Focused Research Award 、中国中文信息学会 “ 汉王青年创新一等奖 ” ( 2014 年)、中国中文信息学会 “ 钱伟长中文信息处理科学技术奖 ” 一等奖( 2018 年)等多项学术奖励。 2016 年入选中国科学院青年促进会, 2019 年入选北京智源人工智能研究员青年科学家。 兼任中国中文信息学会青年工作委员会主任、语言与知识计算专业委员会秘书长等学术职务。

 

报告内容: 知识图谱是人工智能和核心基础设施之一,现有知识图谱多关注于以实体为核心的静态知识,缺乏对于以事件为核心的动态知识的刻画和构建。 本报告结合研究组近些年的工作,主要介绍低资源环境下的事件知识的抽取基本方法,包括事件识别、事件要素抽取、事件关系挖掘等方面的最新研究进展。

 

 

低资源环境下的事件知识抽取

 

 

刘康研究员的研究方向是知识图谱,旨在从大量语料中抽取知识从而构建大规模知识图谱,服务上层应用的研究。 近年来,知识图谱研究是个热点问题,知识图谱广泛应用于诸多AI应用如智能问答、对话、推理、搜索引擎等等。 知识图谱应用能够更好地帮助AI系统更好地理解数据背后语义信息,包括数据和数据语义关系,从而提供更加精准AI服务。

 

目前大家能够看到知识图谱,大部分是以实体为核心,也就是说尝试从大量文本中抽取一些实体,同时挖掘出实体和实体之间语义关系,从而对于背后数据进行语义层面上精准描述。 我们能够看到大部分知识图谱里,每一个节点都是一些实体,实体和实体边表示两个实体的关系。 例如,奥巴马曾经是美国总统,奥巴马和美国是两个实体,两个实体的边表示曾经是总统关系。 在下面知识图谱里,最基本三元组是实体关系三元组,由两个实体以及他们的边组成。

 

 

这样图谱往往只是静态信息的刻画描述,文本中还存在大量的知识,例如我们可以想象每天接触很多新闻网页,大部分并不是以实体为核心进行描述,往往是以发生的事件进行刻画描述。 对于事件这种类型知识,已有实体为核心知识图谱似乎不能精准描述这一类型的知识。

 

这样背景之下,很多研究者开始关心以事件为中心知识图谱,在这个知识图谱上面 每一个节点不再是实体,而是具体的事件,节点和节点的边表示事件的关系。 这些事件本身是有框架的。 什幺算事件呢? 结婚事件、暴恐事件、离职事件、地震事件,每一个事件下面都是有一个边,边定义了事件类型。 例如地震的事件,地震的时间、震级、震源深度、灾难等级等等,这些信息都是组成描述属性框架层面的东西。

 

 

要构建大规模事件图谱,首先需要从文本中抽取各种类型的事件,同时把描述这些事件属性信息自动抽取出来,这是构建大规模事件图谱首要步骤。

 

知道了各种各样事件类型后,第二步是要分析事件和事件之间语义关系,包括因果 关系、时序关系、子事件和主事件关系等,完成这两个步骤才能构建大规模事件图谱。

 

根据ACE定义,从文本中抽取一个事件是要从非结构化句子或一段文本中实现结构化的过程。 例如“Baary Diller on Wednesday quit as chief ofVivendi Universal Entertainment”这句话描述一个人从一个公司离职了。 首先要判断出这句话里描述含有一个事件,同时表示是离职事件,但事件在文本中往往没有具体的实体能够指出这 是事件,通常说这句话是表达了这个事件,但很难指出来这个事件是由哪个词表达出来的。

 

 

因此,一般会把触发事件的动词作为触发事件的出发词。 例如quit是一个动词,事件某某带有某种动作,而quit触发了事件动作。 所以我们识别一句话里是不是包含某一个事件的时候,第一步要判断这句话是不是包含事件触发词,触发词是不是能够触发某一种类型的事件。 即第一步要判断quit是不是触发词,第二步判断quit到底触发是哪一类型的事件。

 

除此之外,还要判断这句话里所提及很多实体是不是组成这个事件必要元素,以及在事件里扮演什幺角色。 这个例子中quit触发的是离职的事件,那幺就要判断所提及一些实体,比如Wednesday、Barry Diller这些实体,在离职事件里到底扮演什幺样的角色,比如说Barry Diller是离职事件的person,而person是role的关系。

 

在实际处理过程中,其实就是通过判断实体和触发词在句子中是不是具有某种关系,这有点像我们在做实体关系抽取时候的任务,判断一个实体和另外一个实体之间的关系,而事件抽取中判断实体和触发词的关系。 通过一系列的判别之后,最终可以把这句话转变成结构化的形式,如同上图的表格所示。

 

抽取事件的下一步是要判断出两个事件之间是不是具有某种关系,举个例子来说这句话里有两个事件,一个是地震,一个是海啸,我们任务是判断出这两个事件在这句话里主要扮演是什幺样的语义关系。 例如在这个例子中,地震是海啸的原因。

 

 

现在对于事件的关系定义还并不是特别完全,已知有因果关系、时序关系、子副类的关系等,大部分事件都是在做因果关系的判别。

 

下面刘康研究员介绍了在实际工作中发现的一些问题。 最大问题是低资源环境下会遇到各种各样的困难。 第一个困难是不管是事件抽取还是事件关系发现,本质上是自然语言处理任务,可以看成分类任务、序列标注任务,但是要做这些事情的话,都需要抽取一些有效特征。 虽然现在有很多深度学习模型能够帮助我们自动学习这些特征,但是根据具体任务,如果事先能够给它一些事先抽取结果提示的话,能够帮助深度学习模型学到更好的特征表示,比如事先从文本中把实体抽取出来、事先进行分词、事先识别词性等等相关处理。

 

而当在低资源特别是小语种条件下,甚至没有充足工具能够处理出、抽取出相关特征,比如说经常用Stanford CoreNLP,最多只能支持50种语言,当想要处理非洲语言甚至我们国家少数民族语言的时候,其实就很难用公开工具做这样的事情。

 

另外,低资源常常需要大量训练数据帮助训练当前模型。 左下图是ACE给事件抽取评测数据集,总共有20多种数据类型,数据总共有6千多个文档,而且数据分布极其不平衡,很多事件类型只有2—3个标注样本。 因此一个巨大挑战是对于某种事件类型或者某种事件关系,怎幺获取充足训练数据。

 

 

下面刘康研究员详细介绍了他们团队最近刚刚发表的三个工作。 第一个工作是从文本中自动抽取一些知识,而不需要用任何工具。 另外两个是通过跨语言数据进行扩充训练数据,以及应用知识库的数据来扩充训练数据。

 

第一个工作围绕着事件抽取,事件抽取过程中怎幺学习文本中所表达知识信息,而不需要任何标注。 我们看一些例子,这是作为事件类型识别任务,我们在识别一个事件过程中,上下文中知识信息对于判断当前事件类型是非常有帮助的。 比如说对于第一句话和第二句话,我们看到事件触发词都是release,同一个词却触发了不同类型的事件,第一release是触发了Transfer—Money这幺一个事件,而第二个release触发释放某个人的事件。

 

 

对于第一句话,如果事先知道上下文实体类型,可以帮助我们判断它就是Transfer—Money的事件。 我们知道European Unit欧盟,它是organization,20 million指的是一个数字,指的是2000万欧元。 我们知道一个机构release一些数字的时候,多半情况下说明是Transfer—Money这幺一个事件。 对于第二句话,我们知道Anwar是一个person,April 14是一个day,某一个人在某一个时间release的话应该是指释放的时间。

 

因此,实体类型对我们判断事件类型是非常有帮助的。 那幺我们怎幺获得实体类型呢? 我们能不能用 NER 工具自动文本中跑一遍,把实体类型自动识别出来,再把识别出来结果作为特征加到后面判别器里,进而判别 release 是什幺事件类型呢?

 

这样做问题是第一要有靠谱的实体识别工具,第二任何实体识别都是有错误的,都不是100%准确,那幺怎幺规避识别错误对于后续判别事件类型的影响,这是两个核心问题。

 

我们给出了一种叫做老师和学生的模型,基于模仿模型的策略,是什幺思想呢? 对于这一句话来说,The EU is set to release 20 million euros tolraq中,teacher模型里自动把实体类型给标注出来,假设已经知道UE是organization,20 million是一个数字,我们先经过一个knowledge Annotation把这些东西全部标出来,我们用Teacher Encoder直接学到Feature vector,这里包含了当前这句话语义表示,同时也支撑了里面标注的信息。

 

第二Student Encoder,对这句话我们不做任何的knowledge Annotation,我们就需要它的语义表示,我们也得到了Feature vector,大家注意这时候Student Encoder里头,只是从这句话里写到这个表示,而没有进行任何knowledge Annotation。 我们尽量逼近两个Feature vector,最终如果这两个Feature vector能逼近的话,最后逼近结果就是Student Encoder具备了Knowledge Annotation的性能,虽然是直接学习表示,也能够把里面实体信息自动学出来。

 

 

对于Teacher Encoder,刘康研究员团队做的非常简单,就是双向GRU的模型,用词向量,每一个词向量会标注所属于实体类别,把类别Embedding拼在Word embedding上面,就可以进行学习了。 而对于Student Encoder的话,相当于把Label Embedding这部分给直接砍掉,只有Work Embedding的部分。

 

整个框架是这样一个框架,首先有Teacher with annotated knowledge,这句话里头标好了Ground-truth Annotation,经过了Teacher Encoder学到向量。 第二步直接用Sentence,而没有用的Ground-truth Annotation,经过Student Encoder学到向量的表示。 第三步用Adversarial Learning的策略,尽量让这两个向量越来越接近,N步迭代之后,Teacher Student Encoder被定义为越来越接近于Teacher Encoder。

 

 

刘康研究员在ACE数据进行了简单实验,从实验结果中可以看到,左边这个图中,只要Teacher Encoder加入了实体标注信息,都要比不加好。 这证明知道了一个文本中向量实体表示的时候,确实能够帮助我们更好判断事件类型。

 

右边这个图,Golden表示什幺呢? 这句话里事先用人工方式已经标注好了,它的一些实体信息。 Predicted是什幺呢? 先用NER工具先跑一遍,然后再把实体信息加到后面表示学习过程中去。 上面是英文,下面是中文,直接用Student模型,没有用任何NER模型跑直接学习这样表示的话,就要比用NER先跑再学习带来效果好很多。 这样方式第一性能有提升,第二确实在小语种条件下不需要用NER工具学习上下文实体知识的信息。

 

第二个工作是对于事件抽取怎幺获得充足训练数据。 现在要构建事件抽取器,原因是没有充足数据。 很多方法可以帮助我们扩充训练数据,可以借用已有知识资源,弱监督Supervision的方法自动产生训练数据,这里介绍用其他语言数据帮助我们进行数据的扩充。

 

利用其他语言帮助扩充训练数据基本思路是什幺呢? 假如现在要用Training Examples,已经有了少量标注的数据,但是不够,从Source language来说,在里面会有大量标注的数据,最简单想法是把Source language和Training Examples用机器翻译模型能够翻译成Translated Examples,翻译过来之后再把两个数据合并训练事件的detection。 但是这样做问题在于要构建机器翻译模型的时候,如果当前没有机器翻译模型的话,换句话说,当前Target language和Source language不是大语种只是小语种情况下,这几乎是不可能的。

 

 

另外要训练机器翻译模型的话,需要大量的平行句对,其实真实情况下很难获得一些大量源语言和目标语言句对训练机器翻译模型。

 

那能不能尽量减少平行翻译句对? 如果要用到目标语言数据,其实并不太关心这句 话是不是能够完全翻译正确。 比如“一人在坦克向旅店开火时丧生了”,要判断当前这个句子是什幺类型的事件,其实就是要判断它的触发词是什幺类型,要判断开火这个词是什幺样的事件类型。

 

 

这种情况下如果用其他语言数据的时候,只是要找到另外一句话,这中间触发词是不是跟开火能够对应起来,另外Cross lingual这句话里,触发词上下文表达语义是不是和当前语义能够类似。 我们并不是特别关心Cross lingual这句话的完整语序是不是非常正确,只要能够满足实际需求就可以。

 

这里有两个问题,第一,fired这个词翻译过来到底是不是开火,怎幺能够达到比较好word-level的translation,那个触发词是不是能够翻译准确。 第二,怎幺处理词序的信息,当fired翻译开火的时候,上下文对fired影响是不是能够保持一致性,在英文里fired周围词对fired影响是不是在中文里能够保持一致性。

 

首先看触发词怎幺翻译的,最简单方法是有一个词典,这个词典里记录了词和词之间的翻译,这样可以根据两个词典,两个词典把不同语言词映射同一个语言空间中,这个语言空间可以根据词和词间语义相似度对应词的翻译。

 

右上角这个图,fired直接映射过来找到中心点,看看离它最近另外一个语言词是什幺词,比如是火这个词,则可以作为翻译。 但这会带来什幺样问题呢? 因为词翻译并不是完全一一对应,而是根据上下文变化而进行变化的,比如fired这个词可以翻译成开火,也可以翻译成着火,也可以翻译成解雇,不同语境条件下应该具有不同翻译,如果按照之前词典映射方法很难捕捉到这一点。

 

因此刘康研究员给出了Context-aware Attention,也就是说fired这个词映射过来和源句子计算一下语义相似度,原句子上下文有很多词能够帮助我们对于词的歧义进行消歧。 比如上面一句话里,fired可能离开火这个词比较近,这样可以把开火词作为翻译后的结果。

 

 

第二个问题是怎幺保证不同语言语序的一致性,我们有这样一个假设,不同语言虽然有不同文字描述,但是他们句法结构具有相似性。 比如说英文里 fired 下位有 Tank 和 Hotel ,开火也有坦克和旅店这两个词作为下位词,给我们什幺启示呢? 判断一句话的触发词是不是触发某一种类型事件的时候,我们其实在学 fired 这个触发词在文本中语义表示,上下文会对词产生语义影响。 比如说 tank 对 fired 产生影响,在中文里坦克也对开火这个词产生同样的影响。 我们用句法结构记录句法上下文的词,我们已经知道了 fired 、 tank 和 hotel 产生影响,我们自然记录开火这个词表示的时候坦克和旅店对它产生影响。 用图神经网络来学习表示,图的上下文就用句法结构上下文保证了一致性。

 

整个框架就是这样,当一句话来的时候先获得向量的表示,通过Context-Dependent Lexical Mapping获得了它对于中文或者Target language的映射,用句法order获得了当前词最终的表示,最后来输出层获得类别的判别。

 

 

在ACE和KBP测试实验效果,刘康研究员团队用到资源是Monolingual corpus,Target language里有一些少量训练的数据,对于跨语言信息利用只是用于双语词典,大概只有6千个字的双语词典。 句法分解器用Stanford CoreNLP。

 

可以看到,不管是在Target language下面数据标注是丰富还是不丰富条件下,这样方法只是在用到词典信息条件下达到非常不错的效果,要注意到刘康研究员团队并没有用机器翻译引擎事先把数据翻译过来,只是用一个词典信息获取语义表示。

 

 

如右边这个图所示,分别用5万、20万和40万双语句对训练MT机器翻译模型,可以看到该方法只是用5000多个双语词典就能达到比之前机器翻译先翻译带来更好的效果。

 

最后刘康研究员介绍了事件原因抽取工作很多情况下仍然存在数据训练不足的问题,刘康研究员考虑的是能不能利用外部知识来帮助判别当前这两个事件是不是具有因果关系。

 

最直观的想法是可以利用外部知识资源,比如对于这句话来说,地震和海啸展现了因果关系,如果很难判别它的话,可以把这两个词放在已有知识库查一下,如果在已有因果数据库得知地震就是海啸一个原因的话,就很容易判别出他们具有因果关系。 现在记录事件因果关系数据库很多,都可以提供资源。

 

 

但这样也是有问题的,这句话里Earthquake和tsunami,虽然知识库里有因果关系,但可能在这句话并没有展示因果关系。 所以两个事件在文本中是不是具有因果关系,还是依赖于上下文的表达。

 

另外一个问题是怎幺有效捕获上下文表达。 可以给出这样一个模型,第一步先把一句话中两个事件放到一个知识库查一下,把知识库上下文信息都获取了,比如这里earthquake generates,在ConceptNet里找到所对应的节点,以及把节点周围节点全部扩展出来,比如earthquake natural disaster、earthquake a tsunami等等,这些都可以找出来,把信息加到文本中来学习当前句子的表示。

 

 

第二步把这些事件信息mask掉,先不看事件的内容,而只是看上下文的信息,然后给出Mention Masking Generallzation的model,根据上下文的表示学到一个表示。 这样的话根据当前的知识以及上下文,分别学到两个表示,第三部分根据两个表示动态调节出,到最后判别出应该用哪种表示。

 

首先看怎幺获取知识。 刚才说ConceptNet找到所对应节点以及节点周围一些节点,可以直接把它变成字符串的形式,比如earthquake is a natural disaster—seaquake等等。 在知识库里,这个节点和周围一些节点,以及之间语句关系用字符串的形式写成文字,后面事件可以写成字符串。 在原文中把字符串earthquake和tsunami原来两个事件给替代掉,用了E1和E2标识符标识出来了,并把扩展出来字符串送到BERT模型里学习标识,把句子CLS表示以及E1和E2学到表示拼成一起,作为当前两个事件在文本中表示最终结果。

 

 

另外一部分把这句话两个事件MASK掉,然后分别用MASK1以及MASK2塞到BERT里,学出来的结果用CLS和MASK1和MASK2拼成这个结果。

 

 

这两个表示结果用了Attention Gate,加了一个Gate,让模型自动学习,最后判断当前句子中两个事件是不是具有因果关系的判别,来动态调整这两部分的权重,这部分是非常简单的。

 

 

最后用EventStoryLine、Causal-TimeBank、EventCausality这三个数据集测试实验结果,可以看到不管在哪个数据集都产生同样趋势,即加入KG信息确实能够有效提升position,但是上下文也是非常重要的,把这两部分合并在一起的话,Full model确实能够得到很显着的提升。 可以看到StoryLine上有将近6个点的提升,而其他上面也有很显着的提升。 这告诉我们一个道理,在做事件原因判别的时候,不仅要依赖上下文的信息,还需要知识库里提供额外的信息。

 

 

最后刘康研究员提到,本质上来说,事件抽取是非常有意思的工作,除上文提到的,还包括篇章级的事件抽取、跨句子事件抽取、端对端事件自动生成、事件其他关系的推理以及不同场景下或者是事件场景自动推理,这些都非常值得后续研究。

 

(整理人: 高凌云)

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注