0. 引言
信息抽取虽然现在做的不是很成熟,但是在我们工作中会经常用到。特别的是将一些非结构化数据转化为结构数据。其实很多信息抽取的工作都是人工做的,人工+自动化是主要潮流。信息抽取涉及到几个方面内容:命名实体识别、文本特征工程、关系抽取(基于规则/监督学习)。还有一些比较细的操作,例如实体消岐、实体统一、指代消解、句法分析等等。
1. 信息抽取概要
信息化抽取最重要的是如何将非结构化数据提取关键信息变为关键数据,例如图片、视频、文本、语音等等我们可以通过一些模型整理成有结构的数据库形式,即结构化数据。
大致可以分为两个任务:
抽取实体(entities)
包括一些通用的实体:人、地名、时间;
还有一些垂直领域的实体:蛋白质、疾病、药物;
抽取关系(relations)
我们得到两个实体之后,就可以判断两个实体之间的关系。我们可以把他看作一个分类任务。例如:位于(located in)、工作在(work at)、部分(in part of)等等。
对于下面一段话,我们第一步把重要的实体给标记出来,例如 hotel(ORG)、NYC(LOC)、Times Square(LOC)、Boradways shows(Event)等等,所以第一步得到了这些零零散散的实体。注意,实体一定是名词,但是名词不一定是我们要标记出来的实体。
第二步可以进行关系抽取,例如根据第二句,Hilton Property in NYC,那我们可以知道Hilton Property和NYC的关系是Located in 的关系。通过判断两两实体关系将两个实体连接起来,那我们就得到了一个类似图的结构。
但是我们在构建右侧这个结构化数据时,还需要做一些别的工作。例如“NYC”和“NEW YORK”是代表着一个城市,所以这里涉及一个实体统一的任务。这里是地名的统一比较简单,具体涉及到公司企业就复杂一点,我们可以设计一些规则或者简单的概率模型。
另外这里还有一个任务,例如句子中出现的“it”、“he"等指代性词语,我们机器是看不出来的,我们需要判断这些指代词对应着前面的哪个实体,所以本质上也是一个分类任务,例如这个"it"对应着前面的"hotel”,这个我们把他叫做指代消解任务。
另外还有一个小问题,就是单词”apple“他到底对应的是苹果公司,还是苹果手机,或者是水果苹果,这个任务我们叫做实体消岐的任务。
下面这张图就是一个信息抽取任务的样例(非结构化数据转化为结构化数据库):
2. 信息抽取应用场景
- 知识库的搭建
- Google Scholar,CiteSeerX
- 用户库:Rapleaf,Spoke
- 购物引擎/产品搜索
- 专利分析
- 证券分析
- 问答答案系统
3. 命名实体识别(Named Entity Recognition)
3.1 NER概述
命名实体识别(Named Entity Recognition)简称NER,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名以及专有名词等。命名实体识别任务很重要,是很多任务的一个基础任务,如果NER效果比较差,那会影响很多上游任务的性能。
现在仔细想想对于”公司“的识别和对于”人名”的识别,这两个任务有什么区别?对于“公司”我们是确定个数的,可以建立词库来解决这个问题(可以穷举,close set问题);另一个“人名”的个数是不确定的,我们只能通过上下文来解决,这个是一个不可以穷举的问题(open set问题)。
3.2 NER案例以及工具
第一个案例(Case1: Chat bot)
例如下面的输入句子“出发地和目的地在哪里呢?”,那我们输出就包括两类实体(出发地:北京, 目的地:上海)。还有一些实体例如时间(11月16日)等等,当我们有了这些实体,就可以进行槽位填充slot filling操作了。
第二个案例(Case2: Extract from News)
读取一大段文档,然后将关键信息提取出来,例如我们通过命名识别提取到了下面的实体信息:产品名、组织、公司以及人物等等。然后将我们的实体信息可以加入到预定义好的Temlpate模板中,生成简短文档。
第三个案例(Case3:Resume Analysls)
举个简单的例子,我们通过读取简历提取一些关键实体信息,这些要提取的关键实体信息是我们预定义好的,例如毕业学校、学历、工作时长、技能等等。然后可以进行分类抽取实习信息。
下面再分享几个NER简单的实用工具:
- English Toolkits:NLTK NE; Spacy; Standford Parser。
- Chinese Toolkits:HanNLP; HIT NLP。
3.3 创建自己的NER分类器(Create NER Recognizer)
如何创建一个NER分类器呢,大体流程可以分为三步:
- 定义实体种类。这一部是比较困难的,因为一些通用模型的实体都预定义好的人名、地名;可能对于我们具体的任务来说,我们需要一些企业名或者药物种类,这种感兴趣的实体都需要人为加入。
- 准备训练数据。
- 训练NER。
具体评估NER性能的方式,我们就可以用分类任务的评估方式,包括Precision、Recall以及F1-Score等等。
那么重点就来了,有哪些适合NER任务的方式呢。
3.3.1 利用规则(Rule-based Approach)
命名实体识别有非常多的方法,其中基于规则是最古老、最笨的方法。规则其实就是根据一定的正则提取或者利用已经定义好的词典或者词库,比如
if token.contains(word) and word in xxx(词库)
3.3.2 投票模型(Majority Voting)
统计每个单词的实体类型,记录针对每个单词,概率最大的实体类型。
该模型不需要训练,只需进行统计即可。比如,我们想输入一句话中每个单词(这里以 phone 为例)的实体类型。
- 遍历语料库中所有的句子。
- 如果这个句子包含phone单词,那么记录下 它的实体类型 比如:count[’ B-tos '] ++.
- 当语料库中所有的句子都遍历了一遍后,那么phone最终的实体类型就是 数组count[ ]中值最大的一个(假设 类型‘B-tos’最大)。
该模型最大的缺点是,以后输出的所有单词的实体类型都固定了。比如这里的phone 以后就永远是 ‘B-tos’;该模型优点是简单,而且效果不会特别差。一般作为基准模型。
3.3.3 利用分类模型(特征工程)
这里开始进入NER的重点,现在NER比较流行的做法就是一个有监督的分类模型。
对于非时序模型:逻辑回归、SVM
对于时序模型:HMM、CRF、LSTM+CRF
分类模型的最重要的点在于特征,特征就是模型的核心,所以要了解特征有哪些表示形式,以及特征工程在NER表示中,如何选择这个词的特征呢?
这里以 “ The professor Colin
proposed model for NER in 1999” 中的Colin
实体为例,在自然语言中常见的特征有:
- Bag-of-word features
当前词:Colin
前后词: professor, proposed
前前,后后词: the,model
Bi-gram: professorColin, Colin Propused
Tri-gram: …
- 词性----features
当前词:名词
前后词:名词,动词
前前后后词:冠词,名词
- 前缀和后缀
当前词:Co, in
前后词: pr, or, pr, ed
前前后后词:… …
- 当前词的特性
词长
含有多少个大写字母
是否大写开头
是否包含 " - "
前面词是否包含大写
是否包含数字
Feature Encoding
常见的特征种类:离散型(Categoral),连续型(Continue),Ordinal Feature。
- 离散型特征
男女(0,1)
姓名(0,1,0)ont - hot encoding - 连续型特征(continous)
身高 167,187 每个区间用一个特征表示,比如1,2,3。
温度 35.2,35.8,连续型的要变成离散型才可以用one-hot表示。 - Ordinal 型特征
这个真的就是表示A,B,C,D,E,可以直接到one-hot型 A=(1,0,0,0,0)。
4. 关系抽取
4.1 关系抽取概述
信息抽取就是实现文本的关系图谱展现出来,如下图所示:
我认为比关系识别更重要的一个与处理任务是关系的定义。比如我有一个场景,我如何根据场景设计关系。设计关系要有一些原则:关系没有歧义性,不会有重复;关系的层次要有逻辑性;关系种类和识别率的关系也要考虑到。
4.2 关系抽取形式
信息抽取可以展示以下几种形式
1、tuple关系图
把重要的信息形成一个tuple的形式,比如上图信息抽取只要是三元组,(人物,组织,地点)。
2、ACE(Automatic Content Extraction)关系图
根据ACE中的定义,事件由事件触发词(Trigger)和描述事件结构的元素(Argument)构成,元素和事件之间的关系定义为角色(Argument role)。所以根据图可知根节点root是触发词也就是类别label,子节点是该类别下的元素,也可以理解为信息抽取后的关系图谱。
3、地缘关系知识图谱
在我们原始的大部分关系里,也就是本体论关系:
- IS-A :草莓是水果,属于从属关系。
- Instance of :我在广州。
4.3 关系抽取方法
关系抽取直观上来看就是两个问题:两个实体之间有没有关系;如果有的话,是什么关系。
4.3.1 基于规则
现在大部分的关系抽取还是基于规则的方法去实现的,人工预先定义好的规则,根据规则判断,然后归并数据, 例如IS-A关系的规则:
根据规则集,判断文章是否有相关规则匹配的关系,有,则把关系数据存入数据库。
但是直接单纯的这样子的关系,不能区分类别的关系,不一样的类别也会分到一起,会存在很大的误差值。那么则需要对实体加限制,比如水果类的实体,汽车类的实体分开判断:
加实体限制的规则集的优点:1. 提升挖掘出的结果的准确性;2. 只返回想要的结果。
基于规则的方法的优点和缺点
优点:比较准确、不需要训练数据。
缺点:
- 覆盖率较低,也就是召回率低,因为人工只能定义一些类别的,但是大量的数据里面,有存在各种各样的数据类别,所以回报率比较低。
- 规则本身难估计,制定规则需要大量人力。
4.3.2 监督学习
第一步,是训练样本的准备。
1. 定义关系类型(IS-A还是Instance of)
2. 定义实体类型(要抽取什么类型的实体)
3. 实体标记(类型,就是类别,label)
4. 实体之间的关系标记 (类别和实体对应关系)
第二步,有了数据之后就可以做特征工程。
征工程操作,选取特征,作为分类算法的输入参数特征工程选择特征主要有以下几点操作:
1. bag of feature (把所有单词列出来)
2. pos feature (单词对应的词性列出来)
3. 实体类别 (每个单词的实体类别分别是什么)
4. stemming (把单词进行词干还原,英文才需要,中文不需要)
5. 位置相关信息 (两个实体之间包含了多少个单词?这句话在本文的位置)
6. 句法分析相关特征(两个节点之间的最短路径)
7. 依存文法相关 也是最短路径方法
第三步,开始进行分类(SVM,GBDT)。
一般有两种方式:
- 分类算法 f(特征)->分类1,分类2,分类3,无分类(对应K+1分类)。
- 首先转换为二分类问题,再变成K个关系分类问题,一般的操作如下:
4.3.3 半监督&无监督学习(BoostrapDistant、 Supervision、无监督学习)
待更新
5. 实体消岐
在关系抽取中,设计到实体之间的关系,但是一个实体可能会有多层的表示形式,不一样的意思。实体消岐的本质在于一个词很有可可能多个意思,也就是在不同的上下文所表达的含义不一样。
比如我们生活中常见的实体:小米和苹果就是存在多个意思。
比如例子:问题定义:今天苹果发布了新手机。
实体库中有两个不同类型的数据:
苹果:水果中的一种,一般产自于......
苹果:美国一家高科技公司,经典的产品有iphone手机
那么实体消岐要如何实现呢?运用什么算法呢?
-
TF-IDF
抽取实体前后的20个或者40个等n个词,进行分词,词库的句子进行分词,得到V,进行TF-IDF,计算cosine(q,实体1),cosine(q,实体2),以此类推,选择值最大的就行分类。 -
词向量
通过词向量的形式计算每个词的词向量,然后通过词向量计算两个句子的相似度,取值最高的相似度。
未完待续
6. 实体统一
问题定义:给定两个实体,判断是否指向同一个实体?
第一种方法:通过计算两个实体设计的字符串的编辑距离判断是否是指向同一个实体。
第二种方法:基于规则,把字符串还原到原型,判断是否是一个实体,也类型英文的stemming操作,进行还原。
第三种方法:指代消解。
第四种方法:基于图的实体统一。
未完待续
7. 指代消解
指代作为一种常见的语言现象,广泛存在于自然语言的各种表达中(下面的他指的是张三还是李四呢?)
张三没有去上班,因为生病了,昨天,李四陪他去了医院,好消息是他已经好了
那么如何去解决,判断这个他是指的是谁呢?
1、最简单的方法,就是收集数据样本,通过规则的形式去判断
2、监督Mention-Pair Model:每个mention与之前的mention做二分类决策,当然如何识别mention是另外一个问题。从训练数据中得到正样本,负样本就是每个mention和其它不正确的mention的pairs。
未完待续
8. 句法分析
待更新