当你看见下面这一串文本你会联想到什么?
Ronaldo Luís Nazário de Lima
估计绝大多数中国人不明白上面的文本代表什么意思。没关系,我们看看它对应的中文:
罗纳尔多·路易斯·纳萨里奥·德·利马
这下大部分人都知道这是一个人的名字了,当然,不出什么意外,还是个外国人。
之所以举这样一个例子,是因为,计算机一直面临着这样的困境—无法获得网络文本的语义信息。尽管近些年人工智能得到了长足的发展,在某些任务上取得超越人类的成绩,但离一台机器拥有一个两三岁小孩的智力这样一个目标还有一段距离。这距离的背后很大一部分原因是机器缺少知识。如同上面的例子,机器看到文本的反应和我们看到罗纳尔多葡萄牙语原名的反应别无二致。为了让机器能够理解文本背后的含义,我们需要对可描述的事物(实体)进行建模,填充它的属性,拓展它和其他事物的联系,即,构建机器的先验知识。就以罗纳尔多这个例子说明,当我们围绕这个实体进行相应的扩展,我们就可以得到下面这张知识图
机器拥有了这样的先验知识,当它再次看到Ronaldo Luís Nazário de Lima,它就会“想”:“这是一个名字叫Ronaldo Luís Nazário de Lima的巴西足球运动员。”这和我们人类在看到熟悉的事物,会做一些联想和推理是很类似的。
Notice: 需要说明的是,上面的知识图并不代表知识图谱的实际组织形式
Google知识图谱的宣传语“things not strings”,给出了知识图谱的精髓,即:不要无意义的字符串,而是要获取字符串背后隐藏的对象或事物
还是以罗纳尔多为例,我们想知道罗纳尔多的相关信息(很多情况下,用户的搜索意图可能也是模糊的,这里我们输入的查询为“罗纳尔多”),在之前的版本,我们只能得到包含这个字符串的相关网页作为返回结果,然后不得不进入某些网页查找我们感兴趣的信息;现在,除了相关网页,搜索引擎还会返回一个“知识卡片”,包含了查询对象的基本信息和其相关的其他对象(C罗名字简称也为罗纳尔多,搜索引擎只是根据“罗纳尔多”的指代概率返回了“C罗”这个罗纳尔多的基本资料,但也许你需要C罗的相关信息,那么搜索引擎把C罗这个实体作为备选项列出),如下图红色方框中的内容。如果我们只是想知道罗纳尔多的国籍、年龄、婚姻状况、子女信息,那么我们不用再做多余的操作。在最短的时间内,我们获取了最为简洁,最为准确的信息。
当然,这只是知识图谱在搜索引擎上的一部分应用场景。举这个例子也是为了表明,知识图谱这样一种概念、或者技术,它的诞生是符合计算机科学、互联网发展潮流的。
知识图谱的本质是为了表示知识。知识图谱背后的思想可以追溯到上个世纪五六十年代所提出的一种知识表示形式——语义网络(Semantic Network)。语义网络由相互连接的节点和边组成,节点表示概念或者对象,边表示他们之间的关系(is-a关系,比如:猫是一种哺乳动物;part-of关系,比如:脊椎是哺乳动物的一部分),如下图。在表现形式上,语义网络和知识图谱相似,但语义网络更侧重于描述概念与概念之间的关系,(有点像生物的层次分类体系——界门纲目科属种),而知识图谱则更偏重于描述实体之间的关联。
知识图谱的定义:A knowledge graph consists of a set of interconnected typed entities and their attributes.
即,知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Object)。
在知识图谱中,我们用RDF形式化地表示这种三元关系。RDF(Resource Description Framework),即资源描述框架
RDF图中一共有三种类型,International Resource Identifiers(IRIs),blank nodes 和 literals。下面是SPO每个部分的类型约束:
IRI可以看成是URI或者URL的泛化和推广(关于URL和URI的知识,可以阅读文章:URL和URI的区别),它在整个网络或者图中唯一定义了一个实体/资源,和我们的身份证号类似
literal是字面量,可以把它看作是带有数据类型的纯文本,比如上文提到的罗纳尔多原名可以表示为"Ronaldo Luís Nazário de Lima"^^xsd:string。
blank node简单来说就是没有IRI和literal的资源,或者说匿名资源
那么“罗纳尔多的中文名是罗纳尔多·路易斯·纳扎里奥·达·利马”这样一个三元组用RDF形式来表示就是:
"www.kg.com/person/1"是一个IRI,用来唯一的表示“罗纳尔多”这个实体。"kg:chineseName"也是一个IRI,用来表示“中文名”这样一个属性。"kg:"是RDF文件中所定义的prefix,如下所示
@prefix kg: http://www.kg.com/ontology/
即,kg:chineseName其实就是"http://www.kg.com/ontology/chineseName"的缩写
将上面的知识图用更正式的形式画出来:
我们其实可以认为知识图谱就包含两种节点类型,资源和字面量。借用数据结构中树的概念,字面量类似叶子节点,出度为0。
下面这张图是知识图,但不是知识图谱,因为在知识图谱中"罗纳尔多·路易斯·纳萨里奥·德·利马"作为字面量,是不能有指向外部节点的边的,况且知识图并不能直观地体现知识图谱中资源/实体(用IRI表示)这样一个极其重要的概念
语义网络指Semantic Network,语义网指Semantic Web
语义网络:用相互连接的节点和边表示知识,节点表示对象、概念,边表示节点之间的关系
简而言之,语义网络可以比较容易地让我们理解语义和语义关系。其表达形式简单直白,符合自然。然而,由于缺少标准,其比较难应用于实践。
RDF的提出,解决了语义网络中节点和边的值没有标准的缺点,RDF在节点和边的取值上做了约束,制定了统一标准。另外,RDF对is-a关系进行了定义,即,rdf:type。因此,不管在哪个语义网络中,表达is-a关系,我们都用rdf:type,在语法上形成了统一。比如上图中猫、熊与哺乳动物的关系就可以形式化的表达为:
猫 rdf:type 哺乳动物
熊 rdf:type 哺乳动物
但还有个问题,如何区分概念和对象?即定义Class和Object(也称作Instance, Entity)。如果不能区分,会对我们产生什么影响?举个例子,假如我们有两个语义网络A和B。在A中,熊是哺乳动物的一个实例。在B中,熊是哺乳动物的一个子类。前者是is-a关系,后者是subClassOf关系。这种情况常有发生,我们建模的角度不同,那么同一个事物的表示也可能不同。如果我们不能用一种方法来区别两者,不仅会给我们带来理解上的困难,在进行融合的时候也会造成数据冲突。我们不能说A既是B的一个实例,又是B的一个子类。W3C制定的另外两个标准RDFS/OWL解决了这个问题,如下图:
在语义网技术栈中,RDFS和OWL是RDF更上一层的技术
通过RDFS或者OWL中的预定义词汇,我们可以形式化地声明一个类:
哺乳动物 rdf:type rdfs:Class
或者
哺乳动物 rdf:type owl:Class
通过RDFS也可以声明一个子类:
熊 rdf:type rdfs:Class
熊 rdfs:subClassOf 哺乳动物
或者声明一个实例:
熊 rdf:type 哺乳动物
RDF,RDFS/OWL属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点
语义网和链接数据倾向于描述万维网中资源、数据之间的关系
本质上,语义网、链接数据还有Web 3.0都是同一个概念,只是在不同的时间节点和环境中,它们各自描述的角度不同。它们都是指W3C制定的用于描述和关联万维网数据的一系列技术标准,即,语义网技术栈
在万维网诞生之初,网络上的内容只是人类可读,而计算机无法理解和处理。比如,我们浏览一个网页,我们能够轻松理解网页上面的内容,而计算机只知道这是一个网页。网页里面有图片,有链接,但是计算机并不知道图片是关于什么的,也不清楚链接指向的页面和当前页面有何关系。语义网正是为了使得网络上的数据变得机器可读而提出的一个通用框架。
“Semantic”就是用更丰富的方式来表达数据背后的含义,让机器能够理解数据。“Web”则是希望这些数据相互链接,组成一个庞大的信息网络,正如互联网中相互链接的网页,只不过基本单位变为粒度更小的数据,如下图:
链接数据起初是用于定义如何利用语义网技术在网上发布数据,其强调在不同的数据集间创建链接
当它指语义网技术时,它更强调“Web”,弱化了“Semantic”的部分。对应到语义网技术栈,它倾向于使用RDF和SPARQL(RDF查询语言)技术,对于Schema层的技术,RDFS或者OWL,则很少使用
链接数据应该是最接近知识图谱的一个概念,从某种角度说,知识图谱是对链接数据这个概念的进一步包装。
知识图谱的定义:A knowledge graph consists of a set of interconnected typed entities and their attributes.
即,知识图谱是由一些相互连接的实体和他们的属性构成的。
知识图谱更正式的说法:知识图谱是由本体(Ontology)作为Schema层,和RDF数据模型兼容的结构化数据集
本体本身是个哲学名词,AI研究人员于上个世纪70年代引入计算机领域。Tom Gruber把本体定义为“概念和关系的形式化描述”,分别指实体的类层次和关系层次。
举个例子,如果我们要做图书领域的知识库或者知识图谱,首先要对图书进行分类,这个分类就是本体,比如说,图书分为计算机类和电子类,计算机类又分为网络、人工智能;
有了这个分类后,我们就可以把图书都分到每个类别,比如说《Zero to One》是一本进口原版书,然后这本书有各种属性-属性值,比如说书的作者是Peter Thiel,这些数据就构成了一个图书知识图谱,而这里分类和知识图谱加在一起可以看成是一个图书知识库。
我们以罗纳尔多知识图为例,我们用IRI唯一标志的节点都是某个类的一个实例,每一条边都表示一个关系。罗纳尔多是一个人,里约热内卢是一个地点,我们用RDF来表示就是:
www.kg.com/person/1 rdf:type kg:Person.
www.kg.com/place/10086 rdf:type kg:Place.
关系我们也称为属性(Property),根据是实体和实体之间的关系还是实体和数据值之间的关系分为对象属性(Object Property)和数据属性(Data Property)。
罗纳尔多和里约热内卢的关系(本例中是对象属性)与罗纳尔多和全名的关系(本例中是数据属性)用RDF就可以表示为:
www.kg.com/person/1 kg:hasBirthPlace www.kg.com/place/10086
www.kg.com/person/1 kg:fullName “Ronaldo Luís Nazário de Lima”^^xsd:string
"www.kg.com/person/1"是一个IRI,用来唯一的表示“罗纳尔多”这个实体。"kg:fullName "也是一个IRI,用来表示“全名”这样一个关系。
这里kg:Person,kg:Place,kg:hasBirthPlace,kg:fullName是我们在Ontology中定义好的类和关系。
链接数据强调不同RDF数据集(知识图谱)的相互链接
知识图谱不一定要链接到外部的知识图谱(和企业内部的数据通常也不会公开一个道理),更强调有一个本体层来定义实体的类型和实体之间的关系
RDF(Resource Description Framework),即资源描述框架,其本质是一个数据模型(Data Model),它提供了一个统一的标准,用于描述实体/资源。简单来说,就是表示事物的一种方法和手段。RDF形式上表示为SPO三元组,有时候也称为一条语句(statement),知识图谱中我们也称其为一条知识
RDF由节点和边组成,节点表示实体/资源、属性,边则表示实体和实体之间的关系以及实体和属性之间的关系
下面是SPO每个部分的类型约束:
- Subject可以是IRI或blank node。
- Predicate是IRI。
- Object可以是IRI、blank node或literal(带有数据类型的纯文本)
RDF的表示形式和类型已经有了,那我们如何创建RDF数据集,将其序列化呢?换句话说,就是我们怎么存储和传输RDF数据
RDF序列化的方式:
下面,我们结合罗纳尔多知识图谱的例子,给出其N-Triples和Turtle的具体表示
Example1 N-Triples:
"罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
"足球运动员"^^string.
"Ronaldo Luís Nazário de Lima"^^string.
"1976-09-18"^^date.
"180"^^int.
"98"^^int.
"巴西"^^string.
.
"里约热内卢"^^string.
"-22.908333, -43.196389"^^string.
用Turtle表示的时候我们会加上前缀(Prefix)对RDF的IRI进行缩写
Example2 Turtle:
@prefix person: .
@prefix place: .
@prefix : .
person:1 :chineseName "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
person:1 :career "足球运动员"^^string.
person:1 :fullName "Ronaldo Luís Nazário de Lima"^^string.
person:1 :birthDate "1976-09-18"^^date.
person:1 :height "180"^^int.
person:1 :weight "98"^^int.
person:1 :nationality "巴西"^^string.
person:1 :hasBirthPlace place:10086.
place:10086 :address "里约热内卢"^^string.
place:10086 :coordinate "-22.908333, -43.196389"^^string.
同一个实体拥有多个属性(数据属性)或关系(对象属性),我们可以只用一个subject来表示,使其更紧凑。我们可以将上面的Turtle改为:
Example3 Turtle:
@prefix person: .
@prefix place: .
@prefix : .
person:1 :chineseName "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string;
:career "足球运动员"^^string;
:fullName "Ronaldo Luís Nazário de Lima"^^string;
:birthDate "1976-09-18"^^date;
:height "180"^^int;
:weight "98"^^int;
:nationality "巴西"^^string;
:hasBirthPlace place:10086.
place:10086 :address "里约热内卢"^^string;
:coordinate "-22.908333, -43.196389"^^string.
即,将一个实体用一个句子表示(这里的句子指的是一个英文句号“.”)而不是多个句子,属性间用分号隔开
本体:“概念和关系的形式化描述”,分别指实体的类层次和关系层次。
RDF的表达能力有限,无法区分类和对象,也无法定义和描述类的关系/属性。RDF是对具体事物的描述,缺乏抽象能力,无法对同一个类别的事物进行定义和描述。就以罗纳尔多这个知识图谱为例,RDF能够表达罗纳尔多和里约热内卢这两个实体具有哪些属性,以及它们之间的关系。但如果我们想定义罗纳尔多是人,里约热内卢是地点,并且人具有哪些属性,地点具有哪些属性,人和地点之间存在哪些关系,这个时候RDF就表示无能为力了。
RDFS和OWL这两种技术或者说模式语言/本体语言(schema/ontology language)解决了RDF表达能力有限的困境
之所以说RDFS/OWL是RDF的“衣服”,因为它们都是用来描述RDF数据的。
用过Mysql的读者应该知道,其database也被称作schema。这个schema和我们这里提到的schema language十分类似。我们可以认为数据库中的每一张表都是一个类(Class),表中的每一行都是该类的一个实例或者对象(学过java等面向对象的编程语言的读者很容易理解)。表中的每一列就是这个类所包含的属性。如果我们是在数据库中来表示人和地点这两个类别,那么为他们分别建一张表就行了;再用另外一张表来表示人和地点之间的关系。RDFS/OWL本质上是一些预定义词汇(vocabulary)构成的集合,用于对RDF进行类似的类定义及其属性的定义。(^ω^)
**Notice:**RDFS/OWL序列化方式和RDF没什么不同,其实在表现形式上,它们就是RDF。其常用的方式主要是RDF/XML,Turtle。另外,通常我们用小写开头的单词或词组来表示属性,大写开头的表示类。数据属性(data property,实体和literal字面量的关系)通常由名词组成,而对象数据(object property,实体和实体之间的关系)通常由动词(has,is之类的)加名词组成。剩下的部分符合驼峰命名法
RDFS,即“Resource Description Framework Schema”。以罗纳尔多知识图谱为例,下面的RDFS定义了人和地点这两个类,以及每个类包含的属性:
@prefix rdfs: .
@prefix rdf: .
@prefix : .
### 这里我们用词汇rdfs:Class定义了“人”和“地点”这两个类。
:Person rdf:type rdfs:Class.
:Place rdf:type rdfs:Class.
### rdfs当中不区分数据属性和对象属性,词汇rdf:Property定义了属性,即RDF的“边”。
:chineseName rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:string .
:career rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:string .
:fullName rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:string .
:birthDate rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:date .
:height rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:int .
:weight rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:int .
:nationality rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range xsd:string .
:hasBirthPlace rdf:type rdf:Property;
rdfs:domain :Person;
rdfs:range :Place .
:address rdf:type rdf:Property;
rdfs:domain :Place;
rdfs:range xsd:string .
:coordinate rdf:type rdf:Property;
rdfs:domain :Place;
rdfs:range xsd:string .
其实rdf:Property和rdf:type也是RDFS的词汇,因为RDFS本质上就是RDF词汇的一个扩展。RDFS的其它词汇及其用法参考:W3C官方文档
为了更直观地理解RDF和RDFS/OWL在知识图谱中所代表的层面,我们用下面的图来表示例子中的数据层和模式层:
Data层是我们用RDF对罗纳尔多知识图谱的具体描述,Vocabulary是我们自己定义的一些词汇(类别、属性),RDF(S)则是预定义词汇,从下到上是一个具体到抽象的过程。图中我们用红色圆角矩形表示类,绿色字体表示rdf:type,rdfs:domain,rdfs:range三种预定义词汇,虚线表示rdf:type这种所属关系。另外,为了减少图中连线的交叉,我们只保留了career这一个属性的rdf:type所属关系,省略了其他属性的此关系
RDFS本质上是RDF词汇的一个扩展,OWL则是RDFS的一个扩展
OWL,即“Web Ontology Language”,语义网技术栈的核心之一
我们先谈如何利用OWL进行数据建模。用OWL对罗纳尔多知识图谱进行语义层的描述:
@prefix rdfs: .
@prefix rdf: .
@prefix : .
@prefix owl: .
### 这里我们用词汇owl:Class定义了“人”和“地点”这两个类。
:Person rdf:type owl:Class.
:Place rdf:type owl:Class.
### owl区分数据属性和对象属性(对象属性表示实体和实体之间的关系)。词汇owl:DatatypeProperty定义了数据属性,owl:ObjectProperty定义了对象属性。
:chineseName rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:string .
:career rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:string .
:fullName rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:string .
:birthDate rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:date .
:height rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:int .
:weight rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:int .
:nationality rdf:type owl:DatatypeProperty;
rdfs:domain :Person;
rdfs:range xsd:string .
:hasBirthPlace rdf:type owl:ObjectProperty;
rdfs:domain :Person;
rdfs:range :Place .
:address rdf:type owl:DatatypeProperty;
rdfs:domain :Place;
rdfs:range xsd:string .
:coordinate rdf:type owl:DatatypeProperty;
rdfs:domain :Place;
rdfs:range xsd:string .
schema层的描述语言换为OWL后,层次图表示为:
数据属性用青色表示,对象属性由蓝色表示
描述属性特征的词汇
本体映射词汇(Ontology Mapping)
本体映射主要用在融合多个独立的Ontology(Schema)。举个例子,张三自己构建了一个本体结构,其中定义了Person这样一个类来表示人;李四则在自己构建的本体中定义Human这个类来表示人。当我们融合这两个本体的时候,就可以用到OWL的本体映射词汇
rdf:type owl:Class .
rdf:type owl:Class .
owl:equivalentClass .
知识图谱的推理主要分为两类:基于本体的推理和基于规则的推理。
我们这里谈的是基于本体的推理,上面所介绍的属性特征词汇其实就创造了对RDF数据进行推理的前提。此时,我们加入支持OWL推理的推理机(reasoner),就能够执行基于本体的推理了。
举个例子,我们用RDFS定义人和动物两个类,另外,定义人是动物的一个子类。此时推理机能够推断出一个实体若是人,那么它也是动物
想象一个场景,我们有一个庞大数据库存储人物的亲属关系。里面很多关系都是单向的,比如,其只保存了A的父亲(母亲)是B,但B的子女字段里面没有A,如下表:
如果在只有单个关系,数据量不多的情况下,我们尚能人工的去补全这种关系。如果在关系种类上百,人物上亿的情况下,我们如何处理?当进行关系修改,添加,删除等操作的时候,该怎么处理?这种场景想想就会让人崩溃。如果我们用inversOf来表示hasParent和hasChild互为逆关系,上面的数据可以表示为:
绿色的关系表示是我们RDF数据中真实存在的,红色的关系是推理得到的
1、为什么需要知识图谱?什么是知识图谱?——KG的前世今生
2、语义网络,语义网,链接数据和知识图谱
3、知识图谱基础之RDF,RDFS与OWL
4、RDF Schema
5、01 知识图谱概论