⾃然语⾔处理之知识图谱
1. 引⾔
最早接触知识图谱是在⼀篇分析⼈⼯智能的⽂章,⽂章提出⼀个很有意思的观点:“在感知层⾯,⼈⼯智能进步很⼤,在更⾼级的认知层⾯,我们现在了解的仍然很少。” 我对这句话的粗浅理解是,⼈⼯智能在学习数据的内在表⽰(⽆监督学习),或者对数据的输出结果判别⽅⾯表现出了强⼤的能⼒,甚⾄在计算机视觉、语⾳识别、机器翻译等⽅⾯接近或超过⼈类的表现⽔平,但这些都还停留在对数据内容的归纳和感知层⾯,对于需要复杂背景知识和前后上下⽂的认知和推理层⾯了解仍然不够,例如我有⼀堆数据,我想让机器⾃⼰学习和推理出正确的知识,以及知识和知识的联系。当然知识图谱也知识在认知计算领域⾛出了⼀步,远未达到⼈们对认知的期望。
具体到知识图谱,简单理解就是⼀个知识库,我们能利⽤这个知识库,给定你要查询的内容,然后到知识库中去进⾏关联分析和推理,试图让机器了解你的意图,反馈和你查询相关内容的更多关联信息。举⼀个简单例⼦,我们⽤所有的菜谱构建知识图谱,然后问“夏天西红柿怎么做汤”,知识图谱会查询“夏天”、“‘西红柿”和“汤”在所有菜谱中的直接和间接关系,进⽽推荐给你⼏个最匹配的菜谱。就我的总结,知识图谱有两⼤类主要应⽤:a) 搜索和问答类型的场景;b)⾃然语⾔理解类的场景。典型的应⽤场景如下:
那知识图谱是怎么表⽰的呢?⼤多数知识图谱⽤RDF(Resource Description Framework)表⽰,RDF表征了实体和实体的关系,这种关系有两种:⼀种是属性关系,即⼀个实体是另⼀个实体的属性;另⼀种是外部关系,表明两个实体之间存在外部关联。。RDF形式上表⽰为SPO(Subject Predicate Object)三元组,所以实体通过关系链接成⽆向的⽹络。例如:
2. 知识图谱的架构体系
可以⽤知名的知识图谱平台PlantData为例,介绍知识图谱的架构体系:
从图中我们可以看出知识图谱的体系分成4个过程:数据采集、知识抽取、知识链接和融合、知识的应⽤。
⾸先说数据采集,构建知识图谱是以⼤量的数据为基础的,需要进⾏⼤规模的数据采集,采集的数据来源⼀般是:⽹络上的公开数据、学术领域的已整理的开放数据、商业领域的共享和合作数据,这些数据可能是结构化的、半结构化的或者⾮结构化的,数据采集器要适应不同类型的数据。
知识抽取是对数据进⾏粗加⼯,将数据提取成实体-关系三元组,根据数据所在的问题领域,抽取⽅法分成开放⽀持抽取和专有领域知识抽取。
知识链接和融合,由于表征知识的实体-关系三元组抽取⾃不同来源的数据,可能不同的实体可以进⼀步融合成新的实体,实现在抽象层⾯的融合;根据融合之后的新实体,三元组集合可以进⼀步学习和推理,将表达相同或相似含义的不同关系合并成相同关系,检测相同实体对之间的关系冲突等。
知识图谱构建完成之后,形成了⼀个⽆向图⽹络,可以运⽤⼀些图论⽅法进⾏⽹络关联分析,将其⽤于⽂档、检索以及智能决策等领域。例如,阿⾥的知识图谱以商品、标准产品、 标准品牌、 标准条码、标准分类为核⼼, 利⽤实体识别、实体链指和语义分析技术,整合关联了例如舆情、百科、国家⾏业标准等9⼤类⼀级本体,包含了百亿级别的三元组,形成了巨⼤的知识⽹,然后将商品知识图谱⼴泛地应⽤于搜索、前端导购、平台治理、智能问答、品牌商运营等核⼼、创新业务。
3. 知识图谱的构建
知识图谱的构建有两⼤类⽅法:如果知识领域⽐较贴近开放领域,可以先从⽹络上⼀个开放知识图谱,然后以此为基础进⾏扩充;如果知识领域只某个专有⾏业的,例如信息安全领域,则开发知识图谱图谱中可直接使⽤的知识表⽰相对较少,需要花更多的精⼒构建专业的知识图谱,⼀个典型的⼯具是Deepdive允许通过机器学习和⼈⼯参与的⽅式不断迭代提升知识图谱。
其中,“数据”栏⽬⾥给出了开源知识图谱或者⽤于构建知识图谱的专业数据集。“⼯具”栏⽬⾥给出了⼏⼗种⽤于⾃然语⾔处理、知识抽取、知识存储、知识表⽰、知识链接、知识推理、知识查询、对话系统等⽤于构建知识图谱和应⽤知识图谱的⼯具。“成员”⾥列出了参与的科研机构和知识图谱从业企业单位。
我们可以利⽤OpenKG.CN⾥提供的数据集和⼯具帮助我们构建知识图谱。数据集可以帮助我们建⽴⼀个知识图谱的初始版本,即从⾥⾯获得初始的知识表⽰:SPO三元组,然后根据我们收集的真实业务数据再进⾏知识抽取和知识推理。构建知识图谱的前提是收集数据,收集的数据越全⾯,则可供提取的知识表⽰越丰富,知识图谱的⽤处越⼤。
3.1 数据收集
收集数据的⽅法包括:
a) 收集通⽤的百科知识,包括百度百科、等;
b)收集⾃然语⾔处理或者类似OpenKG.CN这类⽹站提供的公开数据集,例如⾃然语⾔处理的语料库、同义词近义词
库,OpenKG.CN提供的疾病、菜谱、⼈物、商品、⾳乐、企业年报、突发事件、脑科学、中⽂地理、中医药等领域的数据集;
c) 业务领域的数据,从业者所在的企业或者机构所能获取的问题领域的数据。
以上数据的规模较⼤,需要⼀个⼤数据平台来⽀撑数据的收集、存储和查询,例如利⽤Hadoop系统或者单独的⾮关系数据库(Redis、Mongodb、Hbase和postgresql等数据库)进⾏存储。
3.2 知识抽取(⽣成SPO三元组)
收集数据之后需要对数据进⾏处理,这⾥⾯最有价值的⾸先是⽂本数据,因此要⽤到⾃然语⾔处理,
基本的过程是:语⾔分词、词性标注、命名实体识别、句法分析,更⾼级写的应⽤还包括语义依存分析。对于构建知识库⽽⾔,⾃然语⾔处理的⽬的是获取命名实体,再根据命名实体和句法分析抽取知识三元组SPO。⾃然语⾔处理有两个强⼤的⼯具NLTK和Standford NLP,由于Standford NLP提供了开放信息抽取OpenIE功能⽤于提取三元组SPO,所以使⽤Standford NLP更贴合知识图谱构建任务,⽐较⿇烦的⼀点是Standford NLP需要的计算资源和内存较⼤(推荐内存4GB),启动时间较长,分析效率低于NLTK,不过⽀持⽂件列表的输⼊⽅式,实现⼀次多⽂件输⼊得到多个⽂件的输出结果,总体效率还好。当然研究者也开发和共享了更多的知识抽取⼯具,例如OpenKG.CN⾥除了Standford NLP还提供了Reverb: 开放三元组抽取、SOFIE: 抽取链接本体及本体间关系、OLLIE:开放三元组知识抽取等⼯具。
3.2.1 DeepDive
DeepDive系统架构和⼯作流程:
总结⼀下,知识三元组的抽取,对于开放领域的信息抽取直接使⽤现有OpenIE⼯具,对于特定⾏业领域内的信息抽取,需要使⽤类似Deepdive这样的⼯具,在内部集成⾃然语⾔处理⼯具、实体识别⼯具、实体对之间的关系抽取、⼈⼯标注修正错误等步骤。实体识别⼯具可以直接⽤资源语⾔处理领域的命名实体识别NER⼯具,也可以根据从外部或者⼈⼯提取的知识库进⾏实体匹配,最难做的是实体对之间的关系抽取。Deepdive对实体对之间的关系通过弱监督训练和预测的⽅法,具体步骤是:
a) 先通过启发式规则的⽅式标注⼀部分实体对之间的关系作为监督学习的标记;
b) 对每个实体对所在的⽂本进⾏特征提取⽣成监督学习的特征向量;
c) 根据启发式规则的标注对所有已标实体对所在⽂本的特征向量进⾏监督学习的训练过程⽣成预测模型,再根据预测模型预测未标注实体对的关系标签,得到所有候选实体对的关系标签;
d) 导出所有候选实体对及其关系标签,然后对SPO三元组做⼈⼯确认,将⼈⼯修改后实体对的关系标记重新导⼊启发式规则作为监督学习的已标注样本。
  重复以上监督学习的训练、预测过程和⼈⼯确认过程,迭代式的实现实体对关系的更新。
Deepdive中的监督学习是⼀种远程监督学习技术。为了打破有监督学习中⼈⼯数据标注的局限性,Mintz等⼈提出了远程监督(Distant Supervision)算法,该算法的核⼼思想是将⽂本与⼤规模知识图谱进⾏实体对齐,利⽤知识图谱已有的实体间关系对⽂本进⾏标注。远程监督基于的基本假设是:如果从知识图谱中可获取三元组R(E1,E2)(注:R代表关系,E1、E2代表两个实体),且E1和
E2共现与句⼦S中,则S表达了E1和E2间的关系R,标注为训练正例。
远程监督算法是⽬前主流的关系抽取系统⼴泛采⽤的⽅法,也是该领域的研究热点之⼀。该算法很好地解决了数据标注的规模问题,但它基于的基本假设过强,会引⼊⼤量噪⾳数据,出现 the wrong label problem 的问题,原因是远程监督假设⼀个实体对只对应⼀种关系,但实际上实体对间可以同时具有多种关系,如上例中还存在CEO(乔布斯,苹果公司)的关系,实体对间也可能不存在通常定义的某种关系,⽽仅因为共同涉及了某个话题才在句中共现。
为了减⼩ the wrong label problem 的影响,学术界陆续提出了多种改进算法,主要包括:
a) 基于规则的⽅法:通过对wrong label cases的统计分析,添加规则,将原本获得正例标注的wrong label cases直接标为负例,或通过分值控制,抵消原有的正标注。
b) 基于图模型的⽅法:构建因⼦图(factor graph)等能表征变量间关联的图模型,通过对特征的学习和对特征权重的推算减⼩wrong label cases对全局的影响。
c) 基于多⽰例学习(multi-instance learning)的⽅法:将所有包含(E1,E2)的句⼦组成⼀个bag,从每个bag对句⼦进⾏筛选来⽣成训练样本。
除了Deepdive的关系抽取技术,基于深度学习的关系技术也很流⾏。两种⽅法相辅相成,各有优势:DeepDive系统较多依赖于⾃然语⾔处理⼯具和基于上下⽂的特征进⾏抽取,在语料规模的选择上更为灵活,能进⾏有针对性的关系抽取,且能⽅便地在抽取过程中进⾏⼈⼯检验和⼲预;⽽深度学习的⽅法主要应⽤了词向量和卷积神经⽹络,在⼤规模语料处理和多关系抽取的⼈物中有明显的优势。
4. 知识图谱的应⽤
4.1 进⾏图分析
列举⼀些我们常⽤的图算法:
1. 图遍历:⼴度优先遍历、深度优先遍历
2. 最短路径查询: Dijkstra(迪杰斯特拉算法)、Floyd(弗洛伊德算法)
3. 路径探寻:给定两个或多个节点,发现它们之间的关联关系
4. 权威节点分析:PageRank算法
5. 族发现:最⼤流算法
6. 相似节点发现:基于节点属性、关系的相似度算法
其中,权威节点分析做过社交⽹络分析的⼈应该都知道,可以⽤来做社交⽹络⾥的权威⼈物分析,我们在创投知识图谱中⽤来做权威投资机构的发现。族发现算法⼀般⽤来在社交⽹络中主题社区的发现,在这⾥我们同样可以⽤来识别企业知识图谱中的派系(阿⾥系、腾讯系)。相似节点发现应⽤就更加⼴泛了,在企业知识图谱中可以做相似企业的发现,这⾥有个很重要的实际应⽤场景,可以利⽤相似企业进⾏精准的获客营销。
4.2 基于本体的推理
基于本体的知识推理应⽤也⾮常的多,⽐如我们在实际场景中的冲突检测。因为不管是⼿动构建,还是⾃动构建知识图谱,都会碰到这样⼀个问题:或者数据来源不同,或者构建的⼈员不同、⽅法不同,这就会不可避免的导致⼀些冲突,这些冲突⾃⾝很难直观的去发现,但是
可以利⽤知识图谱⾥⾯的冲突检测去发现存在的有⽭盾的、有冲突的知识。
本体推理基本⽅法包括:
基于表运算及改进的⽅法:FaCT++、Racer、 Pellet Hermit等
基于⼀阶查询重写的⽅法(Ontology based data access,基于本体的数据访问)
基于产⽣式规则的算法(如rete):Jena 、Sesame、OWLIM等
基于Datalog转换的⽅法如KAON、RDFox等
回答集程序 Answer set programming
OpenKG.CN上有⼀些知识推理的⼯具,例如:www.openkg/tool?
tags=%E7%9F%A5%E8%AF%86%E6%8E%A8%E7%90%86
4.3 基于规则的推理
基于规则的推理是在知识图谱基础知识的基础上,专家依据⾏业应⽤的业务特征进⾏规则的定义,这在业务应⽤中是⾮常常见的。基于规则的推理是在知识图谱基础知识的基础上,专家依据⾏业应⽤的业务特征进⾏规则的定义,这在业务应⽤中是⾮常常见的。介绍⼀下我们常⽤的Drools(因被JBOSS收购,现已更名为JBoss Rules),它是为Java量⾝定制的基于Charles Forgy的RETE算法的规则引擎的实现,使⽤了OO接⼝的RETE,使得商业规则有了更⾃然的表达,其推理的效率也⽐较⾼。结合规则引擎⼯具,基于基础知识与所定义的规则,执⾏推理过程给出推理结果。
4.4 可视化辅助决策
⾸先介绍两个⽐较常见的可视化⼯具D3.js和ECharts。D3.js全称Data-Driven Documents,是⼀个⽤动态图形显⽰数据的JavaScript库,⼀个数据可视化⼯具,它提供了各种简单易⽤的函数,⼤⼤⽅便了数据可视化的⼯作。
hermit
ECharts是⼀款由百度前端技术部开发的,同样基于Javascript的数据可视化图标库。它提供⼤量常⽤的数据可视化图表。对于出⼊门的知识图谱使⽤者,推荐两个⼊门级别的开源的知识图谱展⽰⼯具:
a) 知识图谱Demo,Demo的详细介绍:
zhuanlan.zhihu/p/29332977?group_id=891668221558661120
开源代码⽹址:
github/Shuang0420/knowledge_graph_demo
⽣成的图谱展⽰结果如下:
b) 农业知识图谱(KG):农业领域的信息检索,命名实体识别,关系抽取,分类树构建,数据挖掘。
开源代码⽹址:
知识图谱的Demo展⽰⽹址:
展⽰效果如下: