信息抽取 information extraction(IE)
信息抽取概要
从非结构化数据,也就是需要进一步处理的数据,如图片,文本,video,音频。进一步处理转化为可以用于建模的feature。结构化数据可以存入到数据库中进行管理
主要从文本中进行信息的抽取
抽取实体(entities)
现实中存在的事物,各个领域有专属的实体。
医疗领域:蛋白质,疾病,药物。。。
金融领域:申请人,表单,公司,地址。。。
各个领域关注的实体内容不同,开源的NER的方法很难应用到垂直领域中
抽取关系(relations)
位于,工作在,部分
处理步骤
对文档的内容进行实体抽取,在探究两两之间是否存在关系
国外团队
USC的ISI实验室
信息抽取例子
- 寻找所有的实体
- 确定实体的类型,实体类型可以快速筛选关系,有些关系是特定实体之间的
- 寻找所有的关系
- 在关系的寻找中并不都是A ralate B,往往会遇到许多指代性的词,所以要通过指代消解得到指代的实体,从而再建立关系
Trick
- 随着实体的增加,实体消解的分类的备选项增加,可以使用moving window
- 实体之间的关系会不会越来越复杂,这里的关系是事先定义好的,是通过遍历整天文章的方式来找到这个关系。
- 实体的统一是对同一实体的不同叫法的统一,百度,百度有限公司
- 实体的消岐是对同一个词的不同含义,苹果表示水果和苹果公司
- 定义的关系不能是类似的,少定义
信息抽取国内外公司
- alphasense:大量的金融领域的年报,提取出关键信息通过数据库存下来
- diffbot:给定一个网页的链接URL,可以提取网页中的关键信息
- palantir
- 国内的明略数据
更多应用
- 知识库搭建
- Google scholar,CiteSeerX
- 用户库:Repleaf,Spoke
- 购物引擎,产品搜索
- 专利分析
- 证券分析
- 问答案系统
搜索引擎和问答系统
- 搜索引擎:根据用户的问题,输出一系列的网页,用户要自己筛选
- 问答系统:根据用户的问题,直接给出回答
问答系统的分类
根据返回的精确度,颗粒度,从粗到细
- Level 1:返回一个文档
- Level 2:返回关键的句子(sentence extraction)
- Level 3:返回key-phrase
- Level 4:返回答案,几个词
上面的容错率比较大,从上到下,准确率下降。上层可能只需要进行一些相似度的计算,但是更下层需要构建知识图谱,基本上要人进行构造,人的工作也越多
命名实体识别(Named Entity Recognition,NER)
识别文本中具有特别意义的实体
case 1 :Chatbot
从AIML的Alicebot,2004年。解决多轮学习的问题需要使用增强学习的方法,当前工业界大部分是使用的是基于规则的
识别完intention,每个intention都有一个状态机
通过用户的回答识别意图,针对每个意图都有一个dialogue management基于规则的对话管理系统。通过NER抽取出实体进行槽填充,通过API获取相对应的数据库信息,来基于规则生成答案
意图识别通过规则和模型进行判断,也就是相当于一个分类
case 2:Extract from News
- 产品:玻森数据的demo的演示,看看这些工具的效果怎么样
- English Toolkits:NLTK NE,Spacy,Stanford Parser
- Chinese Toolkit:HanNLP,HIT NLP,Fudan NLP
- 都包含了NER的识别器
- 缺点在于只提供一些通用性的,如果是垂直领域用不了,只能提取人名地名时间等等,如果想提自己的要自己设计
case 3:Resume Analysis简历分析
- 定义出关心的实体类别,有些可能识别不出来,要有一个大的库,如地点要有一个所有地点的库
构造一个实体识别器(create NET recognizer)
- 定义关心的实体
- 数据库中每一个句子的每一个单词的词性,实体类型标签,实体类别标注的方法B-per,其中per是类别,一个实体可能由多个单词组成所以加上B和I,Begin,Inner
- 训练一个NER Recognizer
- 评估实体识别器,精确率,召回率,F1-score
NER的方法
- 利用规则(正则)
- 投票模型(majority voting)是baseline
- 利用分类模型:非时序模型:逻辑回归,SVM;时序模型:HMM,CRF,LSTM-CRF
利用规则的方法(正则)人工设计
如美国的电话号码的实体,可以用一个正则表达式
利用已经定义的词典,词库。如果出现词库中的词,那么就提取出来
Majority voting(baseline)
统计每个单词的实体类型,记录针对每个单词,概率最大的实体类型。也就是每个词在训练集中出现时的标签,取出现最多的那个标签。不需要学习,只需要统计。
基于监督学习的方法
非时序和时序,核心是做一个特征工程。
对于每个单词来说都是一个多分类的问题
对每个单词做特征工程得到一个特征向量,放到模型里面得到分类的结果。但是这里没有考虑上下文的信息
对于一个词能够提取出什么样的特征?
- bag of word:跟单词相关的特征,当前的词,前后词,前前后后的词,bi-gram(是两个词,并非前一个词),trigram
- 词性:当前词词性,前后词词性,也可以n-gram。。。
- 前缀和后缀:当前词的前后缀,前后词的前后缀。。。。
- 当前词的特性:词长,含有多少个大写字母,是否大写开头,是否包含横杠的符号,前面词是否包含大写,是否包含数字
- 英文的stemming后重复bag of word等等
feature encoding
当前特征要转化为一个one-hot encoding
常见的特征种类
- categorical feature类别特征:男女,要转化为one-hot encoding
- 连续型(数值型):身高,温度,方法:直接用(归一化,0-1或者高斯分布),或特征做一个离散化,分组是哪一组(相当于具备了一些非线性的能力)
- ordinal feature(ranking):成绩ABCD和数值型乘积相比,无法知道之间的差距,相减没有含义。使用方法:直接使用,或当作类别特征处理
feature merging
城市的one-hot encoding中对于很多没有出现的城市,可以合并多个区域,区域会少一些
信息抽取的重要性
命名实体识别NER是基础,上层是关系抽取
- 问答系统
- 扩充原有的知识库(knowledge Base)
- 法律,金融领域
- 大量文本通过表单的形式表示关键的信息
实体关系
- IS-A(Hypernym Relation),子集和超集
- instance-of:广泛和具体
开源的知识库
- FreeBase
- WorldNet
- Yago
- Dpedia
- KnowledgeVault
关系抽取的方法
- 基于规则的
- 监督学习
- 半监督&无监督学习:Bootstrap,Distant Suppervision,无监督学习。尽量使用半监督,基于一些已有的知识库
基于规则的方法:抽取is-a关系
定义一个规则集,如if X is a Y, Y such as X, Y including X, Y especially X
文章中出现了:… apple is a fruit… 通过实体抽取,抽取出apple和fruit,然后is a出现在规则集中,那么就存到表中
如果只是需要特定的实体所具备的关系,那么就要过滤掉有相同关系但是实体不满足的情况,那么要在规则集上加入一些对实体的限制。从而提升挖掘的结果准确率,只返回想要的结果
优点:
- 比较准确
- 不需要训练数据
缺点:
- low recall ratio,同样的is-a关系的表述方式不可能完全覆盖
- 人力成本
- 规则本身难设计,规则之间的冲突和冗余
基于监督关系抽取方法
- 定义关系类型
- 定义所有的实体类型
- 训练数据搜集准备,很多文本,文本中的实体标记,实体类型标记,实体之间的关系的标记。人工成本非常高
- 特征工程
- 分类算法的输入是一个关于两个实体特征,输出所属的关系的概率。
特征工程
- bag-of-word:当前单词的前后,中间的词
- pos feature:词性相关的特征
- 实体类别的特征
- 位置相关的信息:两个实体间包含了多少个单词,这句话在本文中的位置
- 句法分析相关特征:将句子通过树状的方式连接起来,两个节点之间最短的路径
- 依存文法相关特征:每个单词之间存在的关系的方向,仍有最短路径,有无直接依赖关系0-1
分类模型
注意有一类是无关系
- 模型根据特征确定是哪个类
- 特征通过一个二分类模型(简单,且大部分是没关系的)确定有无关系,若有关系通过一个多分类模型分出是哪个类
特征提取器
传统的特征是基于词的维度人为定义的特征,会缺乏一些语义上的信息
RNN
一个单元的不断循环,不同的时间步。对输入的权重,对隐状态的权重是相同的
有一个前后词的语序关系,会对不同的句子有一个同样维度的结果
如果要考虑上下文,那么是双向的RNN
CNN
以往是对图像的处理,
对于句子来做的时候,其中句子的每一个词作为每一行,每个词的编码作为列,从而构成了一个矩阵。那么整个文章就成了“sentence词数编码”
与图像中的卷积核不同的是,每个词的词向量应该保持完整,所以他只能在词的维度上进行移动。(但也不是绝对的)
每一个卷积核做出来的结果经过max-pooling转化为一个数,然后不同卷积核的结果组成了一个向量,
对于句子的长度不同的情况,虽然前面卷积核的结果会不同,但是max-pooling后都会成为1维。
视野是在gram的量级,可以通过多层卷积的方式,扩大视野
Transformer
github上面的源码,attention的结构,位置信息通过positional encoding来提升
https://blog.youkuaiyun.com/zongza/article/details/88851032
https://www.leiphone.com/news/201902/fRHKKOZuS3wldH0o.html
关系抽取
- 基于规则
- 监督学习的方法
- 半监督的,Bootstrap(原始),Bootstrap(snowball),distant-supervisor
- 无监督的方法
Bootstrap算法(原始)
数据库中先存在由一些同一关系的实体对,作为seed tuple种子实体对
- 第一步:在文本中找到种子实体对,看他们之间的连接方式,将连接方式存到规则库中。就得到了同一关系的不同规则表述形式
- 第二步:生成其他的实体对,扫描整篇文章按照规则找新的相同关系的实体对
- 将新的实体对加入到实体对库中,然后找到新的规则表述形式,然后再去找新的实体对,不断循环
缺点:
- 同一实体对之间并不一定都是想要的那个关系
- 有修饰语的话,可以只做近似匹配
- 太多语料库的重复计算,设置一些标签,用过的就不要了
- 生成规则,生成实体对,生成规则。。。的流程是循环式穿行结构,会造成Error Accumulation造成误差的累计
Bootstrap(snowball)
- 生成规则
- 生成tuple
- 评估规则准确率并过滤
- 评估tuple准确率并过滤
- 通过这样的方式来循环
匹配的模式上原始算法式精准的匹配,多了修饰词之后可能匹配不了。snowball采用近似匹配的方式,把规则表示成五元组的方式,计算出规则与规则之间的相似度,规则与tuple之间的相似度
- 将规则表示成一个五元组,两个实体的left,mid,right
- 把左中右的词转化为向量形式
- 当两个规则,实体类型不匹配,相似度为0;否则按照前中后词的相似度然后加权平均。
- 模板之间的相似度通过聚类的方式,将模板进行聚类k-means,spatial clustering,Hierachical clustering,然后使用聚类中心代表此类模板
- 生成新的tuple:如果实体类型匹配了,而且模板核模板库中的各条规则满足相似度大于阈值那么加入该规则下的实体对中
- 模板的评估,根据已有seed tuple的内容作为ground truth,对模板检测出来的实体对的准确性进行评估,小于阈值舍去该模板
- tuple评估,规则模板和tuple的关系可以是多对多的,①看用来生成tuple的规则模板的置信度,②是由多个靠谱的规则生成的 。数学形式1-(1-confidence(Pi))()()…
开源的GitHub代码snowball,以及论文
实体消岐(Entity Disambiguiation)
一个词很可能有多个意思,在不同的上下文中所表达的含义不同
当前句子中的实体和实体库中内容比较,相似度的计算方式
将实体表示成向量的形式,实体库中同样需要转化为一个向量的形式。通过余弦相似度计算的方法来计算相似度。可以是将整个实体库中的实体的出现方式那一句话转换为向量,现在的这个句子也转化为向量。也就是将语境之间进行比较相似度。
相当于是一个分类问题,可以建立上下文的文本向量,相似的相近。
实体统一(Entity Resolution)
背后是同一个实体的不同的指代,金融反欺诈,判断那些设备来自同一个人。
推荐任务,不同的登录设备
问题定义:给定两个实体,判断是否只想同一实体
例子:给定两个实体,字符串,str1,str2是否为同一实体
- 计算编辑距离:小于某一阈值,认为是同一实体
- 基于规则:地址名,公司名消岐,百度有限公司,百度科技有限公司。维护实体的描述库。也就是实体描述和原型的对应。这样就只要看原型是否相同。
- 基于有监督的学习方法:将两个可能是同一个实体的上下文做一个tfidf转换为特征向量,通过concat然后进行二分类或者计算两者的余弦相似度
- 基于图的实体统一:知识图谱,物联网的关系网络。提取个体的特征(年龄收入),关系相关特征(出度入度,1阶相邻再延伸),再计算相似度
指代消解Co-reference Resolution
他指的是哪个人(实体),分类问题
- 最简单的方法:分类成最近的实体,但往往不太对
- 基于有监督的方法:训练的样本是有标记的(实体,指代)是否属于0/1,特征上面上下文的信息构造特征向量,训练出分类器
句法分析
理解一个句子的两种方法:
- 句子的结构,主谓宾,句法分析,转化为一棵语法树的形式,syntax tree
- 凭感觉:基于语言模型的方法
从句法树中提取特征。 - 原先是上下文的特征
- 现在使用基于图的特征,两个单词之间的最短路径,路径下的
句子转化为一个句法树: 根据语法,各个父节点的子节点是一定的
旧机器翻译使用句法分析的过程:中文句子通过句法分析转化为一个句法树,然后对应到英文的句法树,然后通过句法分析转换成英文句子。为了翻译,需要语言学家,懂中英文语法,中英文转化,需要大量domain-knowledge。现在想实现端到端的方法。
给定语法的时候,怎么把句子转化为语法树
- Context from grammars(CFG),一些列写的规则
- Probabilistic context from grammars(PCFG),将规则转化为同一父节点转化为不同类型子节点的不同概率。
- 给定一个PCFG,将sentence转化为syntax tree,找最优的句法树,评价的指标的设计,分数,使用PCFG的概率将树的分数算出来。那么只要维护到PCFG,通过training data求出来,人工标记的一系列树。
- 寻找最优树:枚举出所有可能的句法树,指数增长;引入CKY算法,动态规划的方法
CKY算法
- 比如4个词的句子的句法树,将整个问题分成几个子问题独立考虑。不同的拆分的方式来计算,然后从下到上。
- 二值化,小于等于2,多了之后选项会有指数型增长
- CNF形式,chomsky normal form,只能两个后续,不能0,1,大于2。0的去掉这条规则,但是基于这条规则,对符合条件的规则进行改造之后作为新的规则加入;1的,去掉改规则,然后用父代替子过一遍以子为父的规则。3的,去掉这条,然后把他转化为几条子规则,
- CKY只要binaralization就可以
- 各条规则,不能简单的理解为可以由父节点生成下面的子节点的概率,而是这样形式的一棵句法树子结构出现的概率。
实施的过程:
- 最开始考虑只有1个单词各自的情况,那么对应的就是通过他的类型找他的顶头的父节点,而且他们的匹配的方式也应该是一直一串下来的,不然如果有分支的话一定就有别的单词了。
- 因为单词都是叶节点的形式,所以对于子任务来说,先生成的树应该是一棵包含这两个单词的简单二叉树,然后向上扩展。
- 如果出现了同一个父节点的情况,那么选取概率大的那种情况。
- 两个子节点的前后顺序是固定的。
- 考虑到3个单词时候,选取哪两个作为组合然后和剩下的一个做同样的操作
- 4个的话,考虑1-3组合和2-2组合