人工智能的终极目标,是让计算机可以使用人类思考问题的方式来解决问题,达到智能化从而解放人类的脑力,让人们的生活更加便捷,更加有效率。虽然自90年代以来互联网技术已经蓬勃发展了30年,但是计算机的能力还远远达不到人们期望的智能化水平,根本的原因在于目前计算机对于数据的存储和使用方式,与人脑思考问题的方式还有着本质上的区别。
目前已网页为主要载体的互联网信息,都是以字符串、数组等半结构化的数据类型组合而成的超文本链接。对于计算机而言,任何一个以文字来表示的信息都是0和1组成的二进制字符串,其中的差异只是文本存储空间所占大小的不同,文字所表示的语义信息并不能被计算机所理解。
而人却可以从不同的文字中解读不同的信息,这是因为人可以理解不同的文字所指代的不同含义,并且可以根据一些规则,对文字之间的关系进行推理。
举个简单的例子来说,当看到“他儿子今年出生了”这段文字时,我们可以推断出文中的“他”应该有个妻子,也就是“儿子”的母亲,并且儿子的年龄是现在是0岁。虽然文字中并没有明确的表达这些信息,但可以根据常识推断出这些信息,这些常识或者规则我们称之为“知识”。
那么,有没有可能让计算机可以理解这些文字所代表的真实含义,做到像人一样通过知识对这些信息进行理解和推理呢?
万维网之父蒂姆·伯纳斯·李(TimBerners-Lee)曾说过:“我有两个梦想:第一个是连接世界上的每个人,现在这个梦想已经通过互联网实现了,第二个梦想是连接世界上的每个事物,这个光荣的使命交给了语义网。”
时至今日,这项技术已经经历了语义网络、本体论、语义网、链接数据、知识图谱几个阶段。
在2012年,谷歌首次将知识图谱技术应用在搜索引擎中,以提升搜索的能力。在过去没有使用知识图谱技术时,用户搜索某些信息,搜索引擎会将搜索的关键词与网站的文本做匹配,根据匹配度来展示对应的网页信息,所以如果用户想知道一个问题的答案,但却不知道答案的关键词应该搜什么的时候,往往会搜不到自己想要的结果。
1.2对象、实例与RDF知识表示
首先,我们需要了解一下如何描述一个“知识”。在之前的章节,我们提到过数据分为三种类型,分别是名义数据、登记数据和连续数据。但是日常生活中不是所有的事物都可以用这三个数据类型来被描述,比如一个人、一张图片、一段视频,这些东西应该怎么描述呢?这里要用到面向对象的概念。
什么是对象呢?我们刚说的一个人、一张照片、一段视频,都可以称之为一个对象,对象中包含了各种各样的属性,例如人有名字,年龄,身高这些属性,每个人都会有这些属性,但属性的值可能不一样,当我们把属性的值具象化之后,就可以定义到一个具体的人,例如张三,那么张三就称之为人这个对象的实例。
如图所示:
对于对象而言,如果互相之间存在包含关系,则称之为父类对象和子类对象。例如把人作为一个对象,这个对象其实可以进一步细分为男人和女人,那么人就是男人的父类对象,男人是人的子类对象,张三则是男人这个子类对象的实例。如图所示:
RDF中的R表示页面、图片、视频等任何具有统一资源标识符(UniformResourceIdentifier,URI)的资源,D表示属性,即特征和资源之间的关系,F表示模型以及描述的语法。简单来说,每一条RDF知识表述都可以以一个主谓宾的语句形式出现,例如{中国,首都是,北京},其中“中国”“北京”是两个实体,而“首都是”则表示两个实体之间的关系。
在RDF中总是两个实体,以及两个实体之间的关系三者构成,所以RDF又简称三元组,如图所示:
需要注意的是,每个RDF的实体都要有一个唯一的URI进行标识,但RDF也是允许空白节点存在的,同时实体资源也可以允许匿名资源的存在,即不标识具体的资源,只标识资源的类型,作为连接别的实体的桥梁。
虽然RDF是知识图谱的基石,但其本身对于事物的描述能力非常有限,根据RDF的定义我们可以发现,组成RDF的三元组中,两个实体都具有唯一标识,因此缺乏泛化抽象的能力,无法对同一个类别的事物进行定义和描述。举个例子来说,我们可以通过RDF来描述中国的首都是北京,但如果希望归纳出所有国家与首都之间的关系以及他们的属性,仅仅用一条实例的RDF是无法实现的。
知识的泛化能力对于知识图谱实现智能化而言非常重要,只有具备归纳出抽象知识的能力,才能覆盖更广泛的知识。那么要如何做才能解决RDF的这个问题呢?
我们在之前讲解了父类、子类与实例之间的关系,对于RDF而言也可以通过类似的结构来对知识进行泛化的描述,这就是我们接下来要讲到的本体语言——RDFS和OWL。
1.3RDFS与OWL本体语言
RDFS是最基础的本体语言,其中的S表示Schema,可以表示某些实例的抽象属性。具体而言,包括的核心词汇如表所示:
举例来说,我们可以通过
虽然通过RDFS可以表示一些简单的语义,但在更复杂的场景下,RDFS语义表达能力显得太弱,在表达知识的能力上依然存在缺陷,缺少诸多常用的特征。
例如对于局部值域的属性定义:RDFS中通过rdfs:range定义了属性的值域,该值域是全局性的,但无法表示该属性应用于某些具体的类时具有的特殊值域限制;无法表示多个类、实例和属性之间是等价还是不等价;无法表示多个类之间是相交关系还是互斥关系;无法对某些属性值的取值范围进行约束;无法表示某些属性具有传递性、函数性等特性等。
因为RDFS无法很好的满足知识的表示需求,W3C在2002年发布了OWL本体语言(OWL,WebOntologyLanguage)作为RDFS的扩展,并将其作为语义网中表示本体的推荐语言,目前OWL已经迭代至OWL2版本,最初的OWL又称之为OWL1。
2.知识图谱构建流程2.1知识建模
知识图谱从覆盖的知识面来分,可以分为通用知识图谱(General-purposeKnowledgeGraph,GKG)和行业知识图谱(Domain-specificKnowledgeGraph,DKG)两种类型,行业知识图谱因使用的场景是面相特定的领域,故又称领域知识图谱。虽然他们都是知识图谱,但在知识表示、知识获取和知识应用层面来看,两者又有很大的区别,如表所示。
第一是从知识广度来看,通用知识图谱覆盖的知识面较宽,主要涵盖的是日常生活中的常识性问题,例如Google搜索引擎的知识图谱就是面相全领域的通用知识图谱,在2012年发布时就包含了5亿多个的实体,10亿多条的关系,中文的典型通用知识图谱有复旦大学知识工场实验室研发并维护的大规模通用领域中文百科知识图谱(CN-Dbpedia),该项目包含900多万的实体信息以及6700多万的三元组关系,已在问答机器人、智能玩具、智慧医疗、智慧软件等领域产生了3.5亿次API调用量。
第二是从知识深度来看,通用知识图谱的层级体系一般较浅,对于知识的泛化而言通常没有太多的归纳,这与通用知识图谱获取知识的方式有关,也跟通用知识图谱的使用场景有关,对于通用知识图谱而言多数的使用场景都是基于某个具体的实体。而行业知识图谱的层级体系一般较深,例如在电商领域的商品分类中,关于服装的分类就不仅仅只是上衣和下装这么简单,各种风格、时尚元素、款式、材质都有可能构成不同的类。
正因为通用知识图谱和行业知识图谱的应用场景有很大的不同,让这两种知识图谱的知识获取方式有着显著的区别,对于知识获取方式而言可以根据人工参与度的不同划分为自顶向下和自底向上两种方法。
具体来说,行业知识图谱大多采用自顶向下的知识获取方法,这种方法是通过领域专家手工将知识进行整理和归纳,编辑为知识图谱的数据结构。
例如“古龙”这个实体如果是在文学知识图谱上,代表的是一个作家,但如果放在美妆知识图谱中,代表的则是一款香水,如果不对知识图谱的应用范围进行限定则很有可能出现歧义。
专家参与编辑让行业知识图谱具有相对较高的准确性,但同时也带来了很多的弊端,首先是高昂的人力成本,通常编辑一个知识图谱需要成立一个专家团队,团队中的成员需要同时具备领域知识以及计算机知识,人力市场上能满足条件的人非常稀少,人工成本居高不下。
通用知识图谱多采用自底向上的方法获取知识,这种方法是基于行业现有的标准数据库进行转换,或从现有的高质量数据源中提取知识本体以及本体之间的关系,主要应用于搜索、推荐、问答等业务场景。
因其强调知识的广度,数据主要来自于互联网上的公开信息,所以很难生成完整的全局性的本体层进行统一的管理。但因为知识获取的自动化程度较高,所以对于一些新的概念和新的关系可以很好的涵盖。
从知识的应用层面来看,通用知识图谱的知识相对稀疏,所以知识推理链条较短,通常来讲推理操作都是基于上下文的一到两步的推理,如果超出这个很容易出现语义漂移(semanticdrift)现象,让推理的结果答非所问,人工智能秒变人工智障。而行业知识图谱的推理链条可以较长,更适合需要进行复杂推理和计算的场景。
2.2结构化与半结构化知识获取
(1)结构化数据转换
语义网的目标是建议以RDF为标准数据模型的数据网,但当前大多数Web数据源是由关系型数据库(RDB)驱动的,因此如何将RDB数据集向RDF数据集进行映射一直是语义网领域的研究热点。
结构化数据转换就是指将关系型数据库数据,转换为RDF结构知识图谱的知识获取方式。W3C在2012年专门为此制定了一个标准R2RML(RelationaldatabasetoRDFMappingLanguage)。这是一种可以用于表示从关系型数据库到RDF数据集的自定义映射的语言,通过这种映射关系,我们可以将关系型数据库中的数据转换为自定义的知识图谱结构。
虽然这种转换并没有直接生成真正的RDF数据集,仅仅只是在数据库和知识图谱的本体中间做了一重映射关系,但是通过表示映射关系的mapping文件,系统可以将对RDF三元组的查询等操作翻译成对应的SQL语句,快速将企业过去积累的数据转化为知识图谱,这种转化后的数据本身以及数据之间的关系都符合业务的需要,可以让产品快速落地进行迭代。
(2)半结构化数据
半结构化的数据是指没有按照RDF格式,但是却有着一定规律的网络数据,通过网络爬虫爬取完整的网页信息之后,再通过包装器(wrapper)将其转换成知识图谱数据。
如果给每一个网页都开发一个专门的包装器,不仅需要投入大量的开发人力,而且通用性会比较差,为了解决这个问题,可以先对需要爬取的网页进行聚类,针对聚类来设计包装器会大幅提高知识获取的速度。
通过爬虫和包装器抽取互联网的公开信息会面临一个问题,就是随着网站的更新迭代,网页的信息结构可能会发生改变,既是一个微笑的变动也可能会导致原本构建的包装器失效无法再继续工作。对于这个问题最简单的办法是重新创建一个新的包装器以适应网站的升级,但是如果爬取的网站数量非常多,这种做法不但效率很低而且会给开发人员带来很重的工作负担。
为了能维持包装器的正常工作,我们可以对需要采集的数据进行数据标注,用机器学习的方法对数据的特征进行学习并构建出模型,进而在整个网页站点下使用模型自动生成新的包装器进行数据的抽取。
2.3非结构化知识获取
与整个互联网的数据相比,百科类网站的知识库只是沧海一粟,除了网页中半结构化的数据之外,还存在着海量的无结构网页文本数据。如何将这些文本数据中的知识抽取出来是很多计算机科学家的研究方向。
例如华盛顿大学OrenEtzioni教授主导的开放信息抽取(openinformationextraction,OpenIE)项目,该项目从1亿个网页中抽取了5亿条数据,如图所示。还有卡耐基梅隆大学TomMitchell教授主导的永不停止的语言学习(neverendinglanguagelearning,NELL)项目,这个项目从公开网页中抽取了5千万条数据。
(1)实体抽取
除此之外,也可以根据项目的需要指定特定领域内的实体,例如书名、疾病名、事件名等,只要是业务目标需要的实体,都可以做为实体抽取对象。
在中文文本数据中进行实体抽取相比英文文本数据而言难度更大,首先是因为英语中的实体命名有非常明显的形式标志,每个单词之间用空格隔开,并且实体的每个词第一个字母是大写,所以识别的难度相对容易。而中文没有类似英文文本中空格之类的边界标识符,所以要做命名实体第一步是要确定词与词之间的边界,将词与词之间间隔开来,这个过程称之为分词。
第二点是命名实体本身的构成比较复杂,不断会有新的实体名称出现,例如新的人名,地名,物品名等,而且命名实体的长度也没有限制,不同的实体可能会有不同的结构,例如少数民族人名或者翻译的外国人名,难以建立大而全的实体数据库,分词技术对于这部分的实体识别相对来说难度会高很多。
第三点是在不同的文本资料中,命名实体之间可能会出现嵌套的情况,互相交叉以及相互包含,需要根据上下文才能推断出命名实体真实的意思。例如“北京大学的学生参加了运动会”,可以划分为“北京大学/的/学生/参加/了/运动/会/”,也可以划分为“北京/大学/的/学生/参加/了/运动会”,不同的划分方法会造成实体识别的不同。
关于分词,我们会在后续的自然语言处理章节详细讲解。这里仅对命名实体的常用技术方法做一个概述。目前对于命名实识别的主要方法分为三种:基于规则和词典的方法、基于统计和机器学习的方法以及前两者混合使用的方法。
基于统计和机器学习的方法主要包括隐马尔可夫模型(HMM)、条件随机场(CRF)、长短期记忆网络(LSTM)、最大熵模型(MaxEnt)等方法。这类实体抽取的方法对于特征的选择要求较高,需要从文本中选择对该项任务有影响的各种特征,并将这些特征加入到特征向量中。
依据特定命名实体识别的特征,考虑选择能有效反映该类实体特性的特征集合。主要做法是通过对训练预料所包含的语言信息进行统计和分析,从训练预料中挖掘出特征。有关特征可以分为具体的单词特征、上下文特征、词典及词性特征、停用词特征、核心词特征以及语义特征等。
基于统计的方法对语料库依赖比较大,但可以用来建设和评估命名实体识别系统的大规模通用语料库又比较少,一般是使用维基百科或主流纸媒的标注作为基础训练语料,这类语料库虽然在权威性和正确性上有保障,但是在时效性上交叉,对于新词的识别能力较差。
实体识别技术经历了多次迭代,从早期的基于规则和字典的方法,到传统的机器学习方法,再到深度学习方法,以及近期的迁移学习和半监督学习方法。
目前,将神经网络与CRF模型结合的CNN/RNN-CRF是实体识别的主流模型,基于神经网络结构的实体识别方法,继承了深度学习方法的优点,无需大量人工特征,只需词向量和字向量就能达到主流水平,加入高质量的词典特征能够进一步提升效果,而在未来,迁移学习和半监督学习进行实体识别技术方向研究的重点。
(2)实体消歧
不论是英语还是汉语,构成文本的基本单位都是词,但是同一个词在不同的上下文中可能代表不同的含义,例如英语的“play”就有玩、扮演、播放、比赛等含义,而汉语的“打”字除了用作介词和量词之外,用作动词时就有25个不同的意思。实体消歧就是明确多义词在文中具体指代意思的技术,通过实体消歧,就可以根据当前的语境,准确建立实体链接。
实体消歧可以看做是基于上下文的分类问题,同其他自然语言处理的任务一样,早起的实体消歧也是采用基于规则和词典的方法。但这种方法的局限性太大,后续逐渐被机器学习的方法取代。我们知道机器学习分为有监督学习和无监督学习,应用在实体消歧上也分为有监督的实体消歧方法和无监督的实体消歧方法。
基于有监督的学习实质上是通过建立分类器,通过划分多义词的上下文类别的方法来区分多义词的词义,常见的方法有基于互信息的消歧方法,基于贝叶斯分类器的消歧方法以及基于最大熵的消歧方法。
举例来说,“苹果”一词有时指水果,有时指科技公司,但如果与“吃”组成上下文,那么就可以根据贝叶斯概率计算出这个词应该是指水果而不是科技公司。
无监督的实体消歧主要采用聚类算法进行,先对每个实体不同的意思抽取其上下文的特征组成特征向量并进行聚类,当遇到需要进行实体消除的文本时,让文本与之前构建好的特征向量聚类之间的相似度计算来辨别实体的意思。
在一项测试实验中,采用KNN(k=1)方法进行实体消歧的相似度计算,最终取得了平均正确率83.13%的结果。这种方法本质上还是基于词袋模型(bagofwords),并没有考虑上下文之间的联系,所以对于一些复杂的实体辨别上效果不佳。
不论是采用有监督的学习还是无监督的学习,实体消歧最终的结果都依赖于训练集数据的完整性和准确性,所以目前在这一领域还未形成非常完善的解决方案,如何能够提高实体消歧的准确度有待专家学者的进一步研究。
(3)指代消解
在我们日常用语中大量的存在指代词,用来简化语言增加沟通的效率。例如有这样一段文本:“乔布斯在2007年发布了第一代iPhone,他表示这款手机领先其他手机五年”,在这句话中的“他”指代的是“乔布斯”,而“这款手机”指代的是“第一代iPhone”。
根据北京大学的王厚峰教授的研究,指代一般分成两种回指(Anaphora,也成指示性指代)和共指(Coreference,也成同指)两种情况,回指是表示当前的指示代词与上文出现过的词存在语义关联性,而共指则是两个实体名字指向的真是世界中的同一实体,可以独立于上下文存在。例如“阿里巴巴集团首任董事长”和“马云”就是共指。
在汉语中的指代主要有一下三种典型的形式:
人称代词(Pronoun)
例如:【李明】怕高妈妈一个人待在家里寂寞,【他】便将家里的电视搬了过来。
指示代词(Demonstrative)
例如:【很多人都想创造一个美好的世界留给孩子】,【这】可以理解,但不完全正确。
有定描述(DefiniteDescription)。
例如:【贸易制裁】仿佛成了美国政府在对华关系中惯用的大棒,然而,【这根大棒】果真如美国政府所希望的那样灵验吗
指代消解的基本原理是先构造一个先行语候选集,然后再从候选集中做多选一的选择。代表的方法是1998年Hobbs提出的朴素Hobbs算法,这是一种基于句法分析树的搜索,通过遍历桔子的语法数来判断词语词之间是否可以互相替换,另一种指代消解方法是1983年Grose和Sidner提出的中心理论(CenterTheory)。
目前指代消解最新的研究成果是2017年的端到端神经共指消解算法(End-to-endNeuralCoreferenceResolution),其基本原理是找到一个句子中所有出现过的命名实体和代词,并对他们所在的句子进行特征向量构造,计算词与词之间的特征向量,然后将代词和实体进行两两匹配计算共指匹配得分,以此来实现指代消解。
虽然指代消解问题已经经历了多年的研究和发展,但到目前为止,多数的研究成果还是在回指的研究上,对于共指还没有较好的全自动指代消解技术和方法,有待专家学者的进一步研究。
(4)关系抽取
识别实体与实体之间的语义关系是知识抽取中的一项核心任务,只有将实体之间通过关系联系起来构建成RDF三元组,才能形成知识网络。例如:王思聪是万达集团董事长王健林的独子,可以抽取出(王思聪,父子关系,王健林)、(万达集团、董事长、王健林)两组三元组实例。
最早的关系抽取任务可以追溯至1998年,当时是根据触发词作为关系识别的依据,然后填充关系模板槽抽取文本中特定的关系,例如“董事长”这个关键词构造为X的董事长是Y这样的模板,而随着机器学习算法和深度神经网络算法的发展越来越多的研究把关系抽取做成分类任务处理。
例如采用半监督学习的bootstrapping方法,按照“模板生成→实例抽取”的流程反复迭代,先给定一个种子实体的文本集合,例如<中国,北京>,接着从文本中抽取出包含种子实体的文本,例如<中国的首都是北京>,从而将<首都>这个关系抽取出来,然后用新发现的关系模板抽取更多新的三元组实例,匹配出所有X的首都是Y这样的格式。在这个过程中会发现X与Y除了首都这个关系实体之外,还有可能出现其他的关系,通过反复迭代不断抽取新的实例和模板直至无法再发现符合条件的关系位置。
这种方法的优点是构建成本较低,适合大规模的知识库构建,同时可以发现一些未经人工定义的隐含关系。但在实际使用中也面临着很多的问题,最常见的问题是在迭代的过程中容易出现噪声实例和模板,出现语义漂移的现象,结果的准确率较低。
另外一点是因为没有经过人工定义关系,导致关系语义没有归一化,同一种关系可能会有多种不同的表达方式,例如“首都是”也可以表达为“首都位于”、“设为首都”等,这些表述实际上是同一种关系,如何将这些自动发现的关系进行聚类规约是目前还未解决的问题。
(5)事件抽取
事件抽取可以视为关系抽取的强化版,是将文本中的事件以结构化的形式呈现出来。事件抽取的第一步是识别事件及其类型,其次要识别出事件所涉及的属性,最后需要确定每个元素在事件中与事件本身的关系。
事件的主体和其他的属性之间其实可以构建出一对多的多元关系,如上图的自如与其他属性构成的多元,其本质是6个三元组,每个三元组的主语都是触发词这个事件,谓语分别是融资事件的属性,而宾语分别是抽取出来的值。
我们知道知识图谱分为通用知识图谱和领域知识图谱,事件抽取也可以分为适用于通用知识图谱的开放域事件抽取,以及适用于领域知识图谱的限定域事件抽取。上文例举的金融领域融资事件抽取就是一个限定域的事件抽取。
对于限定域的事件抽取,因为目标明确,所以通常都是预先定义好目标事件的类型以及每种类型包含的具体事件元素,并给出一定数量的人工标注数据作为训练集特征,后续采用模式匹配的方法或采用机器学习的方法进行事件抽取。
开放域的事件抽取因为在事件识别之前对于可能的事件类型和事件结构都是未知的,所以这类事件抽取主要是基于无监督的方法和分布假设理论。即如果候选事件触发词或者候选事件元素具有相似的语境,那么这些候选事件触发词倾向于触发相同类型的事件。
总之,对于无结构的文本数据进行知识抽取虽然已经经历了多年的发展,但目在各个子任务中依然存在很多未解决的问题有待专家学者的进一步研究。
小提示:在部分自然语言处理的研究报告中,实体抽取和实体消歧会合并称之为实体链接(EntityLinking),或称实体链指任务。
2.4知识融合
知识融合主要包含有三种类型:
在实际工作中,知识融合是数据预处理不可或缺的一部分,知识融合的好坏直接决定了知识库的质量,也决定了知识图谱项目的成功与否。
最基本的知识融合方法是知识卡片融合,即上文提到的百科类网站infobox信息,不同的百科网站对于同一个实体的描述可能有差异,所以可以将同一个实体在不同的百科类网站中进行搜索查询,将查询信息合并成为一个归一化之后的知识卡片,即可完成知识融合。
但是对于绝大多数的知识融合而言并不会像知识卡片的融合这样简单,我们知道不同的本体实例是由他们所拥有的属性决定的,如果两个不同的实体,属性都是相同或者近似的,那么我们就可以根据一定的规则将实体进行融合。所以要判断实体是否是同一个实体,是实体的属性是否相似来判断,属性的相似度决定了实体的相似度。
知识融合的流程通常分为四步,分别是数据预处理、数据预分组、属性相似度计算和实体相似度计算。
这一步主要是为了加快知识融合的效率,降低计算的难度。如果不进行分组的话,那么后续的实体比较过程就需要庞大的计算量。常用的数据分类方法可以采用产品经理指定类型进行分组,也可以使用机器学习的方法进行无监督聚类分组或有监督的分类进行分组。
根据不同的数据类型,需要采用不同的方法。如果融合的数据对象是纯字符串类型的数据,可以使用编辑距离(levenshteindistance),这是一个度量两个字符串之间相似度的算法,指两个字符串之间,由字符串A转换到另一个字符串B所需要最少的插入、删除、替换等操作的次数,操作次数越少意味着两个词越相似。
如果要融合的是集合类型的数据,可以通过jaccard相似系数进行计算,公式如下:
当两个集合A和B交集元素的个数在A与B的并集中所占比例,称之为jaccard系数,jaccard值越大说明相似度越高,如果完全一致的两个集合则相似度为1。类似的余弦相似度也可以用来计算集合类型的数据。
如果是整篇文档类型的数据,可以线通过TF-IDF算法找出文档的关键词,再通过余弦相似度计算关键词集合的相似度,以此判断文档的相似度。另外,使用词袋模型也可以用来计算文档的相似度,这两个方法我们会在后续章节详细讲解。
另一种计算实体相似度的方法是采用聚合算法,根据属性相似度的结果计算出相似度的得分向量,然后根据机器学习的分类算法,例如逻辑回归、决策树以及支持向量机等。
3.实操案例:Protégé构建漫威英雄关系图谱
知识图谱技术刚刚处于起步阶段,目前业内并没有一款通用的本体编辑工具,多数要进行知识图谱构建的项目,需要先开发一套知识图谱本体辑软件工具,然后再在这基础之上进行图谱的构建工作。
3.1构建本体
3.2构建类
单击选中Thing,在其左上角点击图标可以创建子类,在弹出的菜单中的Name输入项中设置子类的名称,这里我们输入“电影”,然后点击确定。接着选中新创建的电影类,并点击中间的图标创建创建兄弟类,兄弟类的名称我们设置为“人物”,并在人物类下再构建两个子类,分别命名为“男人”和“女人”这样就完成了类的创建。
3.3设置类之间的关系
我们创建四个类,现在可以对这4个类设置一些属性了,在本例中,男人与女人是互斥关系,一个人的实例只能是男人或女人中的某一个,所以我们可以使用“DisjointWith”属性来进行描述。
选中女人类,然后点击右侧的“DisjointWith”属性右侧的加号按钮,在弹出的菜单中选择男人类,然后点击确定即可完成一个关系的创建。同样的操作我们可以设置人物和电影也为互斥的类,如图所示。
3.4构建对象属性
选择“Objectproperties”标签进入对象属性编辑的页面,与“Classes”页面非常类似,只是用主题颜色的不同加以区分。左侧已经有了一个系统默认的“owl:topObjectProperty”属性,点击左上角的按钮或者鼠标右键点击可以创建一个子属性,并在弹出的输入框中输入属性的名称。
我们可以创建一个“主演”的属性,创建完毕后,在右侧的“Description”中点击“Domains”选项右侧的加号按钮,在弹出的菜单中左侧是选择“主演”,右侧是属性对应的类,选择“人物”,然后点击确定按钮将主演和人物关联起来,表示主演的主语一定是某个人物,如图所示。
接下来设置属性的取值范围,点击“Ranges”选项右侧的加号按钮,将“主演”的取值范围设置为“电影”,点击确定即可。
这样我们就完成了一个对象属性的构建,在后续的知识推理中会用到这个属性,如图所示。
3.5构建数据属性
选择“Dataproperties”标签进入数据属性编辑的页面,在左侧已经有了一个系统默认的“owl:topDataProperty”属性,点击左上角的按钮或者鼠标右键点击可以创建一个子属性,并在弹出的输入框中输入属性的名称。
我们可以创建一个“英雄名”的属性,来表示超级英雄的称呼,创建完毕后,在右侧的“Description”中点击“Range”右侧的加号,并选择“Builtindataypes”选项卡,选择“xsd:string”然后点击确定,将这个数据属性的取值范围限定为字符串,设置完毕之后如图所示。
3.6构建实例
点击“Individuals”选项卡进入实例编辑页面,点击左上角的图标创建一个新的实例,在弹出的菜单中输入实例名称“小罗伯特·唐尼”,点击确定即可完成实例的创建,我们用同样的方法继续创建“斯嘉丽·约翰逊”、“钢铁侠1”、“复仇者联盟1”三个实例。
选中“小罗伯特·唐尼”的实例,在右侧窗口中点击“Types”的加号按钮,在弹出的界面中选择“ClassHierarchy”标签,然后从类中选择“男人”,表示这个实例是属于男人这个类的。
接着,在右侧的“Propertyassertions”设置窗口下,点击“Objectpropertyassertions”右侧的加号按钮,在弹出的菜单中会有两个输入框,左侧需要输入对象属性,右侧输入另外的实体,我们在左侧输入“主演”,右侧输入“钢铁侠1”,点击确定按钮即完成了一个三元组的创建。
之后需要设置实例的数据属性,点击“Datapropertyassertions”右侧的加号界面,在弹出的菜单左侧选择英雄名的属性,然后在右侧填写具体的属性值,表示该人物在电影中的英雄名叫什么,这里我们填入“钢铁侠”并点击确定,最终的设置结果如图所示。
依照同样的操作流程将“斯嘉丽·约翰逊”的属性也设置完成,将“钢铁侠1”的Types设置为“电影”,但是先保留“复仇者联盟1”的type为空状态,看看如何让Protégé对这个实例的所属类进行自动判断,实现知识推理。
3.7知识推理
在顶部菜单中点击“Reasoner”菜单并选择“HermiT”选项,将其变为选中状态,然后再次点击“Reasoner”菜单,会发现“StareReasoner”变为了可选择状态,点击该按钮,系统会对知识进行自动推理计算,待计算结束之后,我们选中“复仇者联盟1”的实体,会发现它的Types已经设置为“电影”了,点击右侧的问号图标可以查看到推理的逻辑依据。
如图所示,之前我们定义了小罗伯特·唐尼和斯嘉丽·约翰逊主演了复仇者联盟1,而主演的Range取值范围是电影,所以可以就此推断出复仇者联盟1是一部电影。
3.8图谱可视化
在顶部的“Windows”菜单下选择“Tabs”下的OntoGraf选项,顶部会增加“OntoGraf”菜单,切换到该菜单并点击左侧的类名称,即可在画布中显示类的图标,如果类有子类或者实例,则会在图标上出现一个加号,双击带加号的图标可以下钻展开查看所有的类和实例。鼠标移动到线上,就可以显示这条线代表的关系名称。通过鼠标拖动图标可以很直观的查看到本体之间的关系
本文由@黄瀚星原创发布于人人都是产品经理。未经许可,禁止转载