在疫情期间,斯坦福大学开设了知识图谱的在线课程。 课程组织者录制了该课程的视频,并将其向公众开放。 现在,你可以在油管上收看到这些内容。
我对课程进行了学习,并整理出了一些笔记。 不过,这些笔记并不是对课程内容的罗列,其中会包含其他来源的补充信息,以及我自己的一些想法和思考。
在此与你分享,希望能够给你带来些许启发。
以下是第一篇笔记。
笔记01:什么是知识图谱?
在你用谷歌搜索时,比如搜索“肯尼迪”,搜索结果的右侧就会出现一个展示有肯尼迪相关信息的小窗格。
知识图谱这个概念,在2012年由谷歌提出,可被认为是汇总了众多不同来源信息的知识网络。
最初,谷歌运用知识图谱,是为了强化它的搜索结果。
而在其后,知识图谱得到了越来越广泛的应用,包括用于各领域知识库的建立、机器学习算法的优化、智能问答、推荐系统、决策支持、供应链管理等等。 在学术界,关于知识图谱的研究也在如火如荼地进行着。
尽管应用和研究都层出不穷,但有一个根本性的问题,似乎并没有达成共识。
那就是,我们应该如何定义知识图谱?
1.如何定义知识图谱?
有人认为,知识图谱就以三元组来表示的对真实世界中实体和实体间关系的描述。
有人说,知识图谱就是抽象的图式(schema)加上具体的实例(instances)——描述的是实体、实体的语义类型、实体的属性、以及实体与实体之间的关系。
也有人说,知识图谱就是RDF图。
还有人给知识图谱下了数学上的定义: 给定实体E和关系R,知识图谱G是一个由三元组(s, p, o)构成的多重关系图;其中:
G∈E×R×E
(s,p,o)∈G
……
这些定义展示了不同的人对知识图谱的不同理解。 尽管在理解上会有差异,但没有人会否认,知识图谱的核心是“图结构”。
而我最喜欢的一个定义,来自Dr. Mikhail Galkin,叫:图结构的世界模型(Graph-structured world model)。
短短3个单词,就精妙地表达出了知识图谱的内涵。
2.一些实体
当然,谈到了知识图谱,有一些“实体”是不得不提的; 它们包括:Wikidata、RDF、SPARQL、Schema.org和DataCommon。
这些实体和知识图谱息息相关。 下面我们一一来讲。
(1) Wikidata
Wikidata是一个开源的大型知识库——但其实可以被看作一个超大的知识图谱。
Wikidata综合了Wikipedia、Wikivoyage、Wikitonary、Wikisource等资源的知识,并将它们进行了结构化的整理。
比如,我们进入Wikidata中的爱因斯坦的页面,会看到一系列的方框。
在这里,爱因斯坦是一个实体,人类(human)是另一个实体,而爱因斯坦和人类的关系是“是一个实例”(instance of),即爱因斯坦是人类的一个实例。
同样的,爱因斯坦的照片是一个实体,爱因斯坦和其照片的关系是“照片(image)”,即爱因斯坦的照片是那张白头发肖像照。
就是这样,Wikidata中收录了大量的结构化的信息。截止2020年3月,Wikidata中已有了80807868个实体,而这些实体之间的关系——也就是图谱中的边——达到了1014736155个。
在Wikidata中,每个实体都是由独一无二的QID所标记的。比如爱因斯坦的QID是Q937,中国的QID是Q29520。 类似的,每一种关系,也都是由独一无二的PID所标记的。比如,照片(image)的PID是P18,国籍(country of citizenship)的PID是P27。
这种独立的ID标记,既能起到消除歧义的作用,也为多语言提供了便利。 也就是说,不同语言描述的同一个东西,都能指向相同的实体或关系。 而在目前,Wikidata的图谱中包含的语言有100多种。
幸运的是,这个大型的多语言知识库是完全开源的——基于CC0——其中的数据可以自由复制、修改、分发或商用。 并且,Wikidata提供了SPARQL语句的查询接口,可以进行一些非常有趣的查询 ——我们在第三部分会讲到。
(2) RDF
RDF,全称叫资源描述框架(Resource description framework),是万维网联盟(W3C)制定的一个标准,主要是对网络内容的资源进行描述。
RDF采用三元组(triple)来表达资源。三元组包括的是主体(subject)-谓语(predicate)-客体(object)。主体和客体表示的都是某一实体,而谓语则表达了主体和客体之间的关系。 比如,我们要用三元组表达“木森是终身学习者”。那么在这里,“木森”就是主体、“是”是谓语、“终身学习”则是客体。三元组即是(“木森”,“是”,“终身学习者”)。
不难发现,三元组其实可以看做是两个节点和一条边。在上面的例子中,“木森”和“终身学习者”是两个节点,而“是”则为从“木森”指向“终身学习者”的一条有向边。如果我们用RDF表示大量相关联的元素,最终形成的就是一张有向图。
而在互联网中,RDF表达的内容通常包括:
- 页面信息(如标题、内容、作者、创建/修改日期)
- 商品项目的属性(如产品标题、价格、库存)
- 网页图片的信息
- 电子图书信息
- 网页视频信息
RDF属于语义网络的一部分,最终希望能实现三个目的:
- 所有网页信息都有具体的含义;
- 网页信息能够被计算机理解和处理;
- 计算机能自动地从互联网上整合信息。
RDF有多种格式,包括RDF/XML、JSON-LD、Notation3等等。 其中,RDF/XML是最为常用的。
一段典型的RDF/XML代码长这个样。
<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#
xmlns:si="http://www.musenshuo.com/si/">
<rdf:Description rdf:about="https://www.musenshuo.com/rdf">
<si:author>木森</si:author>
<si:homepage>https://www.musenshuo.com</si:homepage></rdf:Description>
</rdf:RDF>
在上述代码中,第一行是XML文件的声明。
其后,rdf:RDF标签定义了RDF文件的根元素。标签中的xmlns:rdf和xmlns:si分别指定了两个命名空间——以rdf为前缀的元素(如rdf:Description),来自于命名空间“www.w3.org/1999/02/22-…"。
在上面的代码中,定义了两个三元组,进而实现了两组表达。
一组表达是:www.musenshuo.com/rdf 的作者(author)是木森。 其中的主体是:www.musenshuo.com/rdf;谓语是:作者(author); 客体是:木森.
另一组的表达为:www.musenshuo.com/rdf 的主页(homepage)是 www.musenshuo.com。 其中的主体是:www.musenshuo.com/rdf;谓语是:主页(homepage); 客体是:www.musenshuo.com.
更多关于RDF的内容,可以参考W3Schools:XML/RDF
(3) SPARQL
SPARQL(读作sparkle),全名为: SPARQL Protocol and RDF Query Language,顾名思义就是用来查询RDF文档中内容的语句。
SPARQL的语句是像这样的:
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
SELECT ?person
WHERE
{
?person vcard:family-name "Smith"
}
上面这段语句,查询了所有姓氏为“Smith”的人。
在最上方,我们将http://www.w3.org/2006/vcard/ns#这个URI定义为了vcard;这样一来,在后面的代码中就可以用vcard来替代冗长了URI了。
在查询语句中,SELECT关键字表示“要进行查询”——其后紧跟需要查询的变量。变量以?开头的形式来表示。 WHERE子句定义的是查询的约束条件。在上面的代码中,查询的内容即是,姓氏(vcard:family-name)为“Smith”的人(?person)。
在SPARQL中,最常用到的一些关键字包括OPTIONAL、FILTER、NOT EXISTS和BIND。
OPTIONAL关键字可以用来查询可选的内容——内容如果存在,则会显示到结果中,内容不存在则显示为空值。例如:查询所有人员的姓名,以及其可能存在的报道时间。
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX sn: <http://www.snee.com/hr/>
SELECT ?givenName ?familyName ?oDate
WHERE
{
?person vcard:given-name ?givenName .
?person vcard:family-name ?familyName .
OPTIONAL { ?person sn:completedOrientation ?oDate . }
}
FILTER关键字可以用来筛选一些我们希望得到的结果。 例如:查询2020年5月1日后新入职的人员,及其入职日期;其中,筛选条件为2020年5月1日后。
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX sn: <http://www.snee.com/hr/>
SELECT ?givenName ?familyName ?hireDate
WHERE
{
?person vcard:given-name ?givenName .
?person vcard:family-name ?familyName .
?person sn:hireDate ?hireDate .
FILTER(?hireDate > "2020-5-1"^^xsd:dataTime)
}
NOT EXIST关键字可以用来筛选出某个项目为空的条目。 例如,查询报道日期为空(也就是没有报道记录)的所有人员。
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX sn: <http://www.snee.com/hr/>
SELECT ?givenName ?familyName
WHERE
{
?person vcard:given-name ?givenName .
?person vcard:family-name ?familyName .
NOT EXISTS { ?person sn:completedOrientation ?oDate . }
}BIND则能够将某一个值赋值给某个变量。例如,查询所有人员的姓氏和名称,并返回完整的姓名。
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX sn: <http://www.snee.com/hr/>
SELECT ?name
WHERE
{
?person vcard:given-name ?givenName .
?person vcard:family-name ?familyName .
BIND (concat(?givenName, ' ', ?familyName) AS ?name )
}
以上就是SPARQL的基本概念和用法,更多内容可以参考SPARQL教程和W3C-SPARQL文档
(4) schema.org
schema.org是一个为了促进网络内容结构化的组织。
这个组织于2011年由三大搜索引擎巨头(谷歌、必应和雅虎)联合成立,随后俄罗斯最大的搜索引擎Yandex也加入到了其中。
他们做的事情简单地说就是,制定了一个统一的词汇表,能让网站主们用统一的词汇来标记自己网站上的内容。 这样一来,网络爬虫能够更好地抓取网站上的元素;而网站主们的页面也更容易被搜索引擎所收录。
在如今,超过30%的网站,都用到了schema.org所制定的词汇表。 你应该不难想到,当大量的网站都进行了规范和统一的标记,从互联网中自动化地整合信息就会变得容易。而这一点,对于知识图谱的构建来说是非常有帮助的。
更多关于schema.org内容,可以参见:schema.org
3.用Wikidata,查点有趣的东西
在上面,我们讲到了Wikidata这个大型的知识图谱,以及SPARQL这个用来查询RDF的查询语言。
既然有了资源又有了工具,我们就应该想办法把它们用起来。
幸运的是。Wikidata提供了SPARQL的查询接口,你可以在Wikidata检索服务中使用它。
我们可以从最简单的开始,查询各种狗的图片。
#Dogs
#defaultView:ImageGrid
SELECT ?item ?itemLabel ?image # 查询狗,狗的标签,以及狗的图片
WHERE
{
?item wdt:P31 wd:Q144. # P31为instance of, Q144为狗
?item wdt:P18 ?image. # P18为image
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
# SERVICE wikibase:label是Wikidata提供的服务,可以将查询到的item编号转化为自然语言的label名称
}
结果如图:
在上述代码中,你可以看到Wikidata查询语句中的关系的前缀是wdt,而实体的前缀是wd。
其中,关系是以PID来命名的,实体则用QID来命名。
QID可以在对应词条的上方找到。而PID可以在其正文的Statements中找到。
在下面,我们就来检索一些更有意思的东西。
① 川建国同志的时间线
# 特朗普一生中的重要节点所组成的时间线
# defaultView:Timeline
SELECT DISTINCT ?t ?rrLabel ?valueLabel
WHERE
{
{wd:Q22686 ?prop ?t FILTER (datatype(?t)=xsd:dateTime) .
?value wikibase:directClaim ?prop. }
UNION
{
wd:Q22686 ?q ?statement FILTER regex (STR(?q),"prop/P") .
?statement ?p ?t FILTER regex (STR(?p), "prop/qualifier/P") FILTER (datatype(?t)=xsd:dateTime) .
?statement ?r ?value FILTER regex (STR(?r),"prop/statement/") .
BIND(IRI(CONCAT(CONCAT(SUBSTR(STR(?r),1,29),"direct/"),SUBSTR(STR(?r),40))) as ?rprop)
?rr wikibase:directClaim ?rprop .
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
我一般不怎么看八卦新闻,看了时间线才知道,川建国同志娶过3个老婆。
② Lady Gaga受到了哪些音乐人的影响?以及更多
# 以Lady Gaga为起点的音乐人影响链
# defaultView:Graph
select
?influencer1 ?influencer1Label ?image ?influencer2 ?influencer2Label
{
wd:Q19848 wdt:P737* ?influencer1 .
?influencer1 wdt:P737 ?influencer2
optional { ?influencer1 wdt:P18 ?image }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
Lady Gaga受到过皇后乐队、麦当娜和大卫·鲍伊的影响。 而大卫·鲍伊共同影响过Gaga和麦当娜。
从皇后乐队这边链接出去,影响链最终会抵达那几个大名字:贝多芬、巴赫、莫扎特、海顿。
③ 诺贝尔奖的男女比例
# 诺贝尔奖中的男女比例
# defaultView:BarChart
SELECT (REPLACE(REPLACE(?nobelPrizeLabel_, "^Nobel Prize in ", ""), "^Nobel (.*) Prize$", "$1") AS ?nobelPrizeLabel) (COUNT(DISTINCT ?winner) AS ?winners) (COALESCE(?genderLabel_, "N/A"@en) AS ?genderLabel) WHERE {
?nobelPrize wdt:P361 wd:Q7191.
?winner p:P166 [
ps:P166 ?nobelPrize;
pq:P585 ?date
].
OPTIONAL { ?winner wdt:P21 ?gender. } # optional because organizations can win the Peace Prize
SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
?nobelPrize rdfs:label ?nobelPrizeLabel_.
?gender rdfs:label ?genderLabel_.
}
}
GROUP BY ?nobelPrizeLabel_ ?genderLabel_
诺奖获奖者的男女比例,真的是严重失调啊——不管从总体上来看,还是自2000年以后。
总体的:
2000年以后的:
④ 最常出现艺术作品中的动物是什么?
# 最常出现在艺术作品中的动物
SELECT ?animal ?animalLabel ?count
WITH {
SELECT DISTINCT ?animal ?statement WHERE {
?work wdt:P31/wdt:P279* wd:Q838948;
p:P180 ?statement.
?statement ps:P180 ?depicted.
MINUS { ?statement wikibase:rank wikibase:DeprecatedRank. }
?depicted wdt:P31? ?animal.
?animal wdt:P279+ wd:Q729.
MINUS { ?animal wdt:P279* wd:Q15978631. }
}
} AS %statements
WITH {
SELECT ?animal (SUM(COALESCE(?quantity, 1)) AS ?count) WHERE {
INCLUDE %statements.
OPTIONAL { ?statement pq:P1114 ?quantity. }
}
GROUP BY ?animal
HAVING(?count >= 10)
} AS %counts
WHERE {
INCLUDE %counts.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
ORDER BY DESC(?count)
答案是:马——有3000多个作品都涉及到了马。
紧随其后的是狗、牛和羊(似乎对猫咪的喜爱只是最近这些年的事情。。。)
⑤ 21世纪以来,维基中有条目的人都是怎么挂掉的?
#
SELECT ?cause ?causeLabel (COUNT(?person) AS ?count)
WHERE
{
?person wdt:P31 wd:Q5;
wdt:P509 ?cause;
wdt:P570 ?date.
FILTER(?date>"2000-01-01"^^xsd:dateTime)
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?cause ?causeLabel
HAVING(?count > 1)
ORDER BY DESC(?count)
2000年以来,维基中有条目的人,最重要死因排名依次是:癌症、心肌梗死、疾病(未指明)、肺癌、肺炎、撞车、中风、心力衰竭、新冠病毒和胰腺癌。
我没有料到的是,新冠病毒竟然能排到第九。
而如果把时间改成2020年以来,新冠是有名人士最主要的死亡原因,远远超过其他死因。
4.知识图谱有哪些优点?
在上面,我们介绍了知识图谱的定义,以及用Wikidata进行了一些有趣的检索。
到这里,你可能已经注意到了知识图谱所具有的诸多好处——或者说,用图结构来表示数据的好处。
① 能帮助发现隐藏的知识
在上面的Lady Gaga的例子中,我们在图的结果中发现了,Lady Gaga和麦当娜的音乐都受到了大卫·鲍伊的影响——如果不是图谱中展示了直观的结果,人们通常不会把这三个人联系起来。
而在课程中,Dr. Denny Vrandečić举了另一个例子。
在维基百科的城市页面中,通常都会列出这个城市的姐妹城市(或叫友好城市)。姐妹城市是一种双向的关系,比如北京的姐妹城市包括日本东京,而日本东京的姐妹城市也包括北京。
而美国加利福尼亚州的安大略市(Ontario),它的姐妹城市的列表中包含有一个位于法国的叫温特图尔(Winterthur)的城市。
然而,在温特图尔的姐妹城市的列表中,却没有安大略市的存在。
很显然,这属于数据的不一致。
在很长的一段时间里,没有任何人发现这个问题的存在。直到后来,有人在Wikidata上试着查询姊妹城市时,才发现了这个隐藏的错误。
最终,这个维基页面的错误被修正了。与此同时,温特图尔重新建立了与安大略市的连接,还特别发了一条新闻稿。
② 扩展灵活
图结构是非常灵活的,在业务需求改变时,可以轻松地调整节点和连接,而不需要去不断地修改Schema。
但更为重要的是,运用知识图谱,融合不同的图谱会变得非常容易。你只需要将相同的节点合并起来,便能够实现图谱的融合。
③ 数据表示简单,特别方便多对多的表达
在关系数据库中,表达多对多的关系是非常麻烦的,通常需要用到中间表。
比如疾病和身体器官之间存在多对多的关系——一种疾病可能波及多个不同的人体器官,而一个器官也会具有多种不同的疾病。因而在设计时,你就需要加入一个中间表来表达这种多对多的关系。
而在图谱中,多对多的表达就简单多了。各个器官是单独的节点,各种疾病也是单独的节点;某种疾病涉及多个器官,只需将这个疾病节点和多个器官相连;某个器官具有多种疾病,将这个器官节点连向所涉及的疾病节点即可。
④ 用简单的语句就能进行复杂的查询,并且查询快捷
在课程中,Dr. Jans Aasman举了一个查询的例子——查询有多少个病人患有胆结石。
在下图中,左边是用SPARQL在图数据库中进行查询的语句,右边则是用SQL语言在关系数据库中进行的查询。
不难发现,由于关系数据库涉及到大量表的连接,只要数据表一多,查询语句就会变得异常复杂。而查询图数据库,只需要表达清楚连接关系即可。
在我看来,相比于SPARQL语句,Neo4j图数据库所使用的Cypher语句还要更加的直观简洁。关于Cypher语句的更多内容,可以详见:Cypher-Query-Language
当数据库中的数据量变得非常大时,传统关系数据库的查询速度就会变非常慢——因为在查询过程中需要连接大量的表。而在图数据库中进行查询,性能往往会维持稳定。
*
除了上述的好处,知识图谱的优点还包括:能够提供推理、能够提供解释、以及拥有大量基于图论的算法支持。
5.图谱的表示方式:符号与向量
知识图谱有两种主要的表示方式,分别是符号表示法和向量表示法。
符号表示,也就是我们之前提到的三元组的表示方法,即 (s, p, o)——subject(主体),predicate(谓语),object(客体)。
下图展示了一个用符号表示法构成的图谱。 钢铁侠(Iron man) 的饰演者为小罗伯特唐尼(RDJ),即表示为Iron_Man dbp:starring RDJ。 而RDJ出生在纽约则表示为RDJ dbp:born NY,依次类推。
而向量表示法,则是将知识图谱的节点和边转化为向量或张量,也就是所谓的图嵌入(graph embedding)。 图嵌入,在某种程度上来说,就是将图某些特征抽象出来,从而变成更为简单,更容易处理的东西。
而用向量或张量来表示图谱,就能更好被机器学习的算法所处理。
6.两种类型的知识图谱:文本与事件
在课程中,Dr. Jans Aasman介绍了两种主要的知识图谱类型,一种是基于文本和自然语言处理的,而另一种则是基于实体或事件的。
① 基于文本的知识图谱
所谓基于文本的知识图谱,就是通过自然语言处理的方法,从文本内容中构建起的知识图谱。 课程中介绍了乔姆斯基知识图谱(Chomsky graph)。 诺姆·乔姆斯基(Noam Chomsky)是美国重量级的学者,90多岁的他著作在语言学、计算机科学、哲学和心理学上都有诸多建树,并发布过大量的作品。
而乔姆斯基知识图谱,则是将乔姆斯基写过的所有内容,以及其他人对乔姆斯基的评述都汇集一处,整理成一个知识图谱。
最终呈现出的效果是这样的: 他的每本书的章节段落都被按照层次纳入到了图谱中,段落中提及的关键概念也都被提取了出来。
将文本内容汇集一处,并进行了结构化的处理,这就使得后人能更为方便地查阅乔姆斯基的思想。
而许多来自互联网和电子文档的文本内容,也可以通过类似的方式来生成图谱。
② 基于实体或事件的知识图谱
基于事件的知识图谱,就是把事件作为节点而生成的图谱。
课程中介绍了一个用于预测病人是否会呼吸衰竭的知识图谱。 在这个图谱中,病人在临床过程中的每个环节都会被作为图谱的节点,包括入院、出院、各种检测、诊断、手续、用药、生命体征的读取等等。
研究者基于这个图谱构建了随机森林模型。该模型能在48小时之前准确地预测病人可能出现的呼吸衰竭——这比医生和护士的判断都更为快捷。
这个模型使用了46个不同的参数,而一个医生通常的判断依据通常只是3~4个参数。
在其他需要决策支持的领域,也都能使用类似的图谱构建方式。比如在电信领域,就可以把通话、短信、网站访问、账单支付等各个环节作为图谱的节点。
7.不同视角下的知识图谱
站在不同的计算机领域,对知识图谱的感知和理解是不一样的。
站在逻辑的角度,图谱中的元素和关系是事实的集合,同时也是一系列公理的集合。
事实的集合,很好理解,三元组表达的就是一个又一个的事实。 比如,小罗伯特唐尼住在旧金山的事实,在图谱中表达为lives(RobertDowneyJr, SanFrancisco); 小波伯特唐尼出生在纽约,则表达为born(RobertDowneyJr, NewYork)。
而公理的集合,指的是由理论(TBox)、断言(Assertion)和约束(Restriction)定义的表达框架。
比如,在一个关于作家的知识图谱中,可以将成功的作家定义为拥有1本以上畅销书的作者——这个是定义的“理论”。同时,将StanLee声明为成功的作家——这个是断言。最后,著名的作品属于所有创作了的作品——这个是约束。
站在数据库的角度,知识图谱属于结构化数据的一种,同时也是语义数据的一种整合方式。
若要将表格式的数据转化为图谱,按照的原则是这样的:
单元格变成节点,列标题变成关系。
站在计算机视觉的角度,知识图谱可以用来更好地表示图像中识别出的实体的关系。
比如在下图中,用深度学习算法识别出了图中的马、人、帽子、衬衫、山、马脸等实体。
在这里,构建一个图谱,能够让物体的关系变得更为明确。 比如马脸是属于马的(face-(of)->horse),而人骑在马上(man-(riding)->horse)。
站在自然语言处理的角度,知识图谱可以是将非结构化数据转为结构化的一个目标。
在文本中,可以运用命名实体识别,识别出其中的实体和关系,从而构建起知识图谱。
而在另一个方面,对问题进行自然语言处理,也能将其转化为图谱的查询语句,从而让知识图谱实现智能问答的功能。
8.一些问题
在课程中,老师们还回答了一些学生的提问。
我觉得比较有价值的是以下的三个。
① 知识图谱和本体有什么区别?
在计算机领域有一个和知识图谱非常类似的概念,叫“本体”(ontology)。
用官方的术语来说,本体是指“对特定领域中某套概念及其相互关系的形式化表达”。比如,一个关于动物的本体是这样的。
我们可以这样理解。本体描述的是抽象的东西,可以看做是定义的类(class)。 而知识谱图描述的更像是实在的东西,可以看做是实例(instance)。
在构建知识图谱前,可以先建立本体,这样通常就能更好地避免错误。
② 图谱的数据一定要保持一致性吗?
所谓数据的一致性,指的是数据间不存在逻辑上的矛盾。
比如,我们前面说过的,姐妹城市的关系应该是双向的——如果表示成了单向,就说明图谱的数据存在不一致性。
那么,需要事先对这些关系加以约束,从而保证数据的一致性吗?
答案是,不一定,特别是对于Wikidata这种大的图谱来说。
因为世界本身就是充满变化而难以保持一致性的。 为了追求绝对的一致性,往往需要加上过多的约束,这就会使得数据的录入变得非常麻烦——有一点小错就会录入失败。若要协调录入的各方,协作成本也会变得相当高。
更好的做法是,在录入时,容忍不一致性。
至于可能错误,可以依靠后期的维护,来进行慢慢地调整。
③ 知识图谱有什么局限性?
和任何事物一样,知识图谱也并不是万能的。
一方面,知识图谱并不容易表达非常复杂的过程,比如光合作用。
而在另一方面,用知识图谱来表达表格化的数据也只会徒增麻烦。适合关系数据库的数据,还是应该用关系数据库。
毕竟,图数据库只是众多数据库中的一种。
对于数据的表示,没有最好的方法,只有最适合的方法。
小结
① 知识图谱,是图结构的世界模型。
② Wikidata可以看做是大型的知识图谱,而用SPARQL语句,可以在其中查询到许多有趣的东西。
③ 知识图谱具有许多优点,包括能帮助发现隐藏知识、扩展灵活、方便多对多表达、查询简便、能提供推理和解释,以及具有众多的图算法基础。
④ 知识图谱通常采用的是符号化的表示,但有时也会将其投射成向量或张量,从而方便其被机器学习的算法处理。
⑤ 知识图谱的构建可以来源于纯文本(通过自然语言处理),也可以来自于事件和实体(可能通过手工、也可能来自半结构化和结构化的数据)。
⑥ 站在逻辑、数据库、计算机视觉和自然语言处理的角度,可以看到知识图谱的不同特质和不同的应用场景。其中,从文本中构建知识图谱,以及用知识图谱来进行智能问答,都需要用到自然语言处理的技术。
⑦ 知识图谱不是万能的,对于数据的表示,没有最好的方法,只有最适合的方法。
-END-