21 December 2018

说说我的理解

事件抽取,还是NLP比较复杂的一个是,比POS、NER、关系抽取啥的都要复杂一些,主要是,他需要抽取的东西比较多,要抽取事件的触发词,还要抽取事件的各个要件,也叫arguments,白话就是事件涉及到的各种元素,这玩意特像chatbot中的slots,而chabot中的意图,可以类别成这边的事件类型。

  • 模板的就不说了,过时了,不过,实际过程中,几个正则最管用。
  • 机器学习方法中,pipeline的说不好,俺也没实践过,就是说不断地pipeline,错误会方法。后来就不pipeline了,直接joint train,就是把事件trigger和arguments都一口气学出来,这个过程中要用到最大熵,我理解就是CRF,还有CRF那一堆前后词啥的特征工程。 再后来,又向前来了一步,不是学序列了,而是学一个依存结果出来。
  • 最后呢,还是上大杀器,深度学习,不过还是pipeline和joint两种,pipeline里用DMCNN,joint用JRNN。

语料不够咋办,俩办法:一个是用自己的判别器把那些置信度高的样本当做样本加进去、二是到知识图谱里,找那些结构化的事件来语料。这又诞生了好几篇论文来搞事情。

我想,是不是可以把BERT引入进来,直接当事件抽取的预训练,然后用在事件抽取里,效果应该很好吧,估计肯定会有人做。

说说体会:

  • 没语料,标注太费劲了,国外有一些,比如ACE的,不过量也不大,国内就少的可怜了,就CEC贡献了一千条
  • 英文的那些对中文不适用,语序、语法啥的差异那么大,没法transfer过来啊,居然还有几个人专门研究e文事件抽取到中文的迁移
  • 还是正则管用,不是复杂的场景,直接就正则把

先列参考资料

研究者

列出我能找到的做事件相关的人:

一些参考资料和笔记

徐阿衡的文章质量都很高,文末还有论文下载,推荐:

	事件抽取同样需要从文本中抽取 predicate 和对应的 arguments,事件抽取的难点在于,有多个 arguments,而且不一定在一个句子里,而且,有些arguments不一定是必须的。
	核`心概念:

	* 事件描述(Event Mention)
		描述事件的词组/句子/句群,包含一个 trigger 以及任意数量的 arguments
	* 事件触发(Event Trigger)
		事件描述中最能代表事件发生的词汇,决定事件类别的重要特征,一般是动词或者名词
	* 事件元素(Event Argument)
		事件的重要信息,或者说是实体描述(entity mention),主要由实体、属性值等表达完整语义的细粒度单位组成
	* 元素角色(Argument Role)
		事件元素在事件中扮演的角色,事件元素与事件的语义关系,可以理解为 slot
	* 事件类型(Event Type)	

	事件抽取的任务可以理解成从文本中找到特定类别的事件,然后进行填表的过程。事件抽取大多是分阶段进行,通常由 trigger classifier 开始,如果有 trigger,把 trigger 以及它的上下文作为特征进行分类判断事件类型,再进行下一步的 argument classifier,对句子中的每个 entity mention 进行分类,判断是否是 argument,如果是,判定它的角色。

	事件抽取任务最基础的部分包括:
	* 识别事件触发词及事件类型
	* 抽取事件元素(Event Argument)同时判断其角色(Argument Role)
	* 抽出描述事件的词组或句子

	在 ACE 的阶段,大多数系统都是基于监督学习了,但由于标注一致性的问题,系统的效果普遍较差,ACE 事件抽取只举行了一次,在 2005 年。

	基于统计机器学习的事件抽取:建立在统计模型基础上,事件抽取方法可以分为 pipeline 和 joint model 两大类。

	Pipeline:将事件抽取任务转化为多阶段的分类问题(管道抽取),需要顺序执行下面的分类器:
	1.事件触发词分类器(Trigger Classifier)
		判断词汇是否是事件触发词,以及事件类别
	2.元素分类器(Argument Classifier)
		词组是否是事件元素
	3.元素角色分类器(Role Classifier)
		判定元素的角色类别
	4.属性分类器(Attribute Classifier)
		判定事件属性
	5.可报告性分类器(Reportable-Event Classifier)
		判定是否存在值得报告的事件实例

https://www.bilibili.com/video/av30198587

事件,某类事件的属性是不同的,
事件框架:Event Frame(Script)他讲的事件是固定的格式的,
事件的触发词,
ACE评测,这个评测里定义了事件的常见属性,可以参考。

事件抽取抽这4个东西:
1.触发词
2.事件类型
3.识别参数(Aguments)
4.事件角色
Aguments被抽取出来后,还得判断他和事件的关系,比如离职事件,从宜信离职,那么宜信就是一个aguments,关系是组织机构。有多个aguments、关系。

美国的DAPRA和NIST机构来评测。

自动完成标注,然后自动训练出一个事件,

不同类型的事件,找到一种普世的定义。

特征表示:
传统是NLP,实体、短语、词性、句法关系、句法模板,不好,不好。

他们的改进是用CNN,

事件里,往往是多句话来完整表达一个事件,aguments可能再多句话里。

自动回标,就是从知识图谱里面对照事件,细节我没去听,如果用得到,再去看。

http://www.yuzhinlp.com/keenage.html#part7.1

http://www.bestjimmy.com/?cat=5

NLP事件提取算法,一般采用序列标注等算法,如CRF,LSTM,CNN等。一般的套路是触发词+分类+信息抽取。deeplearning最新的paper对于事件提取也无非是加入各种attention(炼丹)。

对于垂直领域,针对金融领域的需求,可能抽取的事件包括:融资信息,公告信息,人事信息等;这些事件文本通常有较强规律,通过一些显而易见的规则,或者直接通过一些垂直网站进行抓取历史事件相关的事件论元和参数,再加上一些远程监督+multi-instance learning方法就可以对通用文本进行标注和训练模型了。

事件是绕不开实体的,任何事件类型的要素中都包含实体,涉及到的实体可能包括时间、地点、人物、机构、很少有“与实体无关的事件”。

现在深度学习遍地开花,但是nlp领域的这种老问题,实体识别效果提升并没有特别大。

事件就是实体与动作的串联。

http://www.zhuanzhi.ai/document/d46c48549db3cef52f3def08723774e2

这篇是中科院自动化所陈玉博老师写的,很详细,很高的参考价值:

事件抽取分两个步骤:第一步就是事件的发现和抽取,第二个是事件元素的抽取。
1.事件发现是你要让计算机知道读完这一句话,是哪一个词触发了这个类型的事件并且判断它触发什么类型。
2.然后是事件元素抽取,就是说你要让计算机判断出参与这个事件所有的元素是什么,并且它们在这个事件当中扮演一个什么角色,比如说美团和大众点评合并这样一个事件,其实它描述的就是一个公司合并事件。美团和大众点评在这里就是两个参与者了,10月8日就是合并事件发生的时间,这是我们希望计算机能自动从文本当中提取出来的。
3.另外一个就是事件关系抽取,事件关系给大家介绍四类:共指,时序,因果和子事件。

真实场景要求你从公告或者是一个研报这样篇章级别的文件中去抽取一个结构化的事件,通常由多个句子描述一个事件,一个事件的多个元素分布在不同的句子中,不确定性加大,难度加大。现在没有一份公开做这个任务的语料,人工标注数据耗时费力,成本高昂,金融领域缺乏大规模高质量的标注数据。

没有标注数据,自己做:自动生成标注数据,利用现有的一些结构化的事件信息,然后去公开文档当中自动生成标注数据。

事件是由篇章当中的不同句子去描述的,你需要从不同的句子当中抽取出来对应的元素,去构成一个这样的一个完整事件,那么你就要从多句话当中,识别出来哪个是主句,这个是用一个 CNN 分类的模型去做的。