从最初的 Google 搜索,到如今的聊天机器人、大数据风控、证券投资、智能医疗、自适应教育、推荐系统等各个领域,知识图谱的应用无处不在。知识图谱(Knowledge Graph)的概念由 Google 在 2012 年正式提出,旨在打造更智能的搜索引擎,并在 2013 年后逐渐在学术界和工业界得到了广泛的关注和应用。如今,随着智能信息服务的快速发展,知识图谱已经被广泛应用于智能搜索、智能问答、个性化推荐、情报分析以及反欺诈等诸多领域。
通过知识图谱,可以将 Web 上的信息、数据以及它们之间的链接关系整合为有意义的知识,使得信息资源更容易被计算、理解和评估,从而形成一个 Web 语义知识库。知识图谱凭借其强大的语义处理能力和开放互联能力,为构建万维网上的知识互联提供了坚实的基础,使得 Web 3.0 提出的“知识之网”愿景成为可能。
什么是知识图谱
知识图谱是结构化的语义知识库,是一种基于图的数据结构,用于迅速描述物理世界中的概念及其相互关系。知识图谱通过对错综复杂的文档的数据进行有效的加工、处理、整合,转化为简单、清晰的 “ 实体,关系,实体 ” 的三元组,最后聚合大量知识,从而实现知识的快速响应和推理。
下面我们看一张简单的知识图谱:
我们可以从图中看到,如果两个节点之间存在关系,就会被一条无向边连接在一起,那么这个节点,我们就称为实体(Entity),它们之间的这条边,我们就称为关系(Relationship)。知识图谱的基本单位,便是 “ 实体(Entity)-关系(Relationship)-实体(Entity)” 构成的三元组,这也是知识图谱的核心。其中实体指的是具有可区别性且独立存在的某种事物,而关系是连接不同的实体,指代实体之间的联系。
如何构建知识图谱
知识图谱的构建方式主要有两种:自顶向下和自底向上。
-
自顶向下构建:这种方法依赖于结构化的数据源,例如百科类网站。这些高质量的数据源提供了已经整理好的信息,从中可以直接提取出知识的本体和模式,并将其加入到知识库中。 例如:在构建医学知识图谱时,可以利用医学百科全书、药物数据库等已经结构化的数据源,从中获取疾病、药物、治疗方法等的信息,这些信息本身已经按照一定的模式整理好,方便直接应用于知识图谱的构建。
-
自底向上构建:这种方法从公开采集的海量数据中提取信息,通过一定的技术手段(如自然语言处理、机器学习)识别出潜在的资源模式。然后,选择其中置信度较高的新模式,经过人工审核确认后,再将其纳入知识库。
例如:在电商领域构建知识图谱时,可以从用户评论、产品描述等非结构化数据中提取有用的信息。比如,通过分析大量用户评论,可以识别出某产品的优点或缺点。将这些信息与已有的产品知识结合,经过人工审核后,加入到知识图谱中,以改进产品推荐系统。
通俗而言,从下图我们可以了解到:
- 自顶向下方法:强调了来自结构化数据源的信息,如百科全书、数据库、学术期刊等,这些信息直接被用来构建知识图谱,包含明确的类别,例如“疾病”、“药物”、“治疗方法”、“地理”、“历史事件”等。
- 自底向上方法:展示了来自非结构化数据源的信息,如社交媒体图标、用户评论片段、新闻头条、博客文章等,这些信息通过“自然语言处理与机器学习(NLP & ML)”技术进行处理,最终形成知识图谱,包含“产品反馈”、“用户情感”、“热门话题”、“新兴趋势”等类别。
这两种方法相辅相成,自顶向下方法保证了知识图谱的质量和可靠性,而自底向上方法则可以帮助快速扩展知识图谱的覆盖范围和丰富度。
数据类型和存储方式
知识图谱的原始数据类型一般来说有三类(也是互联网上的三类原始数据):
- 结构化数据(Structed Data):如关系数据库
- 半结构化数据(Semi-Structed Data):如XML、JSON、百科
- 非结构化数据(UnStructed Data):如图片、音频、视频、文本
如何存储上面这三类数据类型呢?一个是通过RDF(资源描述框架)的规范存储格式来进行存储,还有一种方法是使用图数据库来进行存储,常用的有Neo4j等。
接下来介绍一下如何构建一个知识图谱,用到的工具是Neo4j。Neo4j作为一个图数据库,为了数据的储存、读写等操作更合理高效,在设计逻辑上和知识图谱有一些差别,所以这里先介绍一下Neo4j的一些概念。
node:不仅仅是一个单一的实体或者属性,它包括了label和property。
label:根据label把node划分成一个个集合,比如说"学生"可以是一个label,"国家"也可以是一个label,label具体是什么由我们来设计,我们可以通过指定label对这一批数据进行特定的操作。除此之外,一个node可以拥有多个label,为node设计什么label,主要还是要根据实际情况判断,看如何设计能方便数据的查询和修改等操作:
relationship:连接两个node的边,而且这是有向边,relationship中包含relationship type,比如"acted_in",就是表示Tom Hanks是Forrest Gump中的一个演员:
property:是一个键值对,在之前node的介绍中也提到,node由label和property构成。node和relationship都可以有property。其中,如果node没有name的话,在可视化界面是不会显示这个node的名称的。
from py2neo import Graph, Node, Relationship
# 连接Neo4j
g = Graph(
host='127.0.0.1',
http_port=7474,
user='neo4j',
password='neo4j')
# 创建节点
da_vinci = Node('person', name='DA VINCI')
mona_lisa = Node('art', name='MONA LISA')
louvre = Node('place', name='LOUVRE')
g.create(da_vinci)
g.create(mona_lisa)
g.create(louvre)
relation1 = Relationship(da_vinci, 'painted', mona_lisa)
relation2 = Relationship(mona_lisa, 'is_in', louvre)
g.create(relation1)
g.create(relation2)