基于弱监督方法的文本结构化学习
今天给大家分享一下最近听到的一个讲座的内容,《learning text structure with weak supervision》基于弱监督方法的文本结构学习。
随着近年来大数据的兴起,我们可以从大量的结构化数据中得到感兴趣的知识。比如数据库中存储的数据,或者表格中展示的数据,都可以算作是结构化的数据,但是,仍有很多的数据是非结构化的(文字数据、图像数据),不能够直接存储到数据库中,同时非结构的数据也不方便我们处理,这就需要我们将非结构化的数据转为结构化的数据(turn unstructured text data into structures)。

数据结构化有哪些好处呢,下面这举一个例子:

上面这个图是一个对于hotel的描述,里面涉及到很多的地名,如果我们能够将里面地名实体抽取出来,用图来进行表示,比如这样,就会更加的直观。

这样将一段非结构化的文本,转换成了结构化的图数据展示,将实体与关系表示出来,更为直观。
类似的例子在问答系统,图谱挖掘相关领域都有很多应用。那么我们是如何将这些非结构化的数据进行结构化的呢?

现在主流的思路是:首先需要人来进行数据的标注,将其中的实体、关系等标记出来,构成训练数据;再通过规则、ML、DL等方法来进行抽取。目前常用的工具有 斯坦福的corenlp、CMU的NELL以及现在最常用bilstm-crf的方法。
但是这些方法的缺点就是需要标注大量的数据,当语料的主题或者语言发生改变,就需要重新标注这些数据。所以,就需要一种方法来减少对标注数据的依赖。
Wikipedia、dbpddia这些平台上已经整理了很多的结构化的数据,我们能不能引入进来,直接进行使用,将结构化的数据映射到文本中,自动产生标注的文本,从而将工作的重点放在如何避免自动标注文本带来的错误。这样当切换主题时,只需要再重新从知识库中选择一批数据来生成样本就可以,这样可以大幅的提高工作的效率。这种方法就是“远程监督”(distantly-supervised)模型。远程监督的兴起还是依赖于现在大规模知识库的构建,如果现在该行业还没有这多强大的知识库资源,远程监督的效果就会大大折扣。
下面这种图是一些常用的文本结构化的方法,目前常用的还是在有监督的方法上。

接下来看一下,整个方法的处理流程:

在拿到语料数据之后,首先还是要对数据进行分词,断句;之后通过引入外部知识的实体名称以及关系来对数据进行标注;之后再进行微调和改进,从而就可以实现将文本数据结构化的过程。

-
从文本数据中抽取出实体
实体标注
NER系统介绍
实体的抽取是一个很经典的问题了传统的NER有两个问题:1、需要大量的标注数据;2、模型训练很慢。那么远程监督是如何来解决这个问题的呢?

第一步还是需要进行分词,尽可能的把实体识别出来;

其次根据外部的知识库,和抽取到的实体做对应;比如可以根据外部知识库确定BBQ是食物类,NYC是地点类;当然大多数的词是匹配不上的,所以就需要使用半监督的模型,来把这部分类别信息添加上。早期的远程监督,是通过上下文的短语来实现实体的标注,下图就是通过上下位词来确定实体的类别。

但是这种方法也是有问题,在1和3中,Phoenix是表示一个酒吧,但是2中代指的是一个城市的名称,使用关系短语就有可能引入噪声。针对这个问题,做出以下改进:

将每个句子中出现的Phoenix都提取出来,同时再和这个Phoenix字符串发生联系,观察这个字符串本身的关系短语,对这些关系短语进行聚类,这个有点类似于多任务学习,最终提高实体标注的准确性。

该方法在F1分值上达到了SOTA
在另外一个场景中,就是要得到根据当前句子含义中实体词的信息。比如

在这个例子中,我们不仅仅是要知道Trump是一个人,同时还是想知道这是一个演员,在远程监督的知识库中,TRump是会被标注成很多的角色,远程的知识库是没有上下文信息,这就有可能出错。如何改正这个错误呢?这是通过构建低维的向量空间,通过计算距离的方式来确定最终使用哪个类别,一种是这个词Trump在知识库中的类别,另外一种是Trump的上下文信息。

通过将句子的上下文信息进行建模,抽象成一个向量,再和不同的身份类别进行距离计算,最终得到所要标识出的类别。

这样基于rank的方法来训练模型,只要保证分支最高的这个词的标注类别是对的,就可以了。

采用这样一个目标函数,在正例和负例之间设置一个margin,来训练模型。

采用上面这个方法和流程,已经可以从文本中获取到准确的实体标注信息了,接下来就是确立实体之间的关系。

使用分类的方法来确定两个实体之间最可能的关系。
对于关系的判断,目前没有很统一的方法,之前的一些方案是在得到的实体里面两两之间进行判断,看是不是一个合适的关系组合。

这个图就是将提取到实体句子中的实体是不是能够关联上,如果两者之间是个关系组,就会经过一个分类器,来判断两者之间的具体关系。但是这样搞的话,每一步都有可能出错,一开始在实体抽取中没有把所有的词都抽取出来,之后是实体类型片判断错了,将地名判断成人名这样会造成错误越来越多……如果最好是将这两者搞到一起,联合学习从而提高准确率。

通过分析得到的关系组的上下文之间的词,以及出现的次数,和关系的类型,进行一个embedding,最终抽象成这向量,通过计算向量的距离,来判断是属于哪个类别。

将知识库中得到的向量,和上下文信息以及关系组的向量,借鉴TransE的思路,就可以来把关系这个项目表示出来。

实际的评价效果,还是有些提高的。
在这个领域上,还有一些其他的问题可以研究,比如如何将知识库中的信息和人工的规则,抽象成neural network的compent来提高信息抽取的效果。

总结一下就是提出了远程监督的方法,通过使用外部的知识库来避免人工的大量标注,从而实现文本抽取。对一些遇到的问题,也进行了改进和说明
