【知识图谱】获取到知识后,如何进行存储和便捷的检索?
互联网时代,人类在与自然和社会的交互中生产了异常庞大的数据,这些数据中包含了大量描述自然界和人类社会客观规律有用信息。如何将这些信息有效组织起来,进行结构化的存储,就是知识图谱的内容。
知识图谱的难点在于知识图谱的搭建,如何高效、高质量、快速的搭建知识图谱是知识图谱工程的核心,那之后获取到的知识,该如何存储以及便捷的检索呢?
作者&编辑 | 小Dream哥
1 知识存储
在前面的知识图谱的文章中,我们介绍了如何进行知识表示以及知识抽取。今天我们来思考这样一个问题,当获取到了大量的知识(通常是一系列的三元组)之后,该用什么样的形式存储这些知识呢?
先思考一下,用来存储知识的系统,应该具有哪些特点呢?
首先,图谱的价值体现在其对对话系统,信息抽取等下游任务的加成,因此知识的存储系统应该能够支持快速和频繁的知识查询操作。
其次,图谱里的知识是按照shcema的结构抽取的,因此,知识的存储应该能够按照schema的结构,体现出知识的层次结构和知识间联系。
此外,知识存储应该尽量高效,避免出现过多的存储空间的浪费。
1)关系型数据库
数据存储最容易想到的就是常用的关系型数据库,包括Oracle、MySQL等。
如上图所示,是采用传统关系型数据库表示知识的示意图。每条知识是一个三元组(S,P,O),其中S称为主语Subject,其取值可以是实体、事件或者概念中的任何一个;P被称为谓语Predicate,取值可以是关系或者属性;O被称为宾语Object,取值可以是实体、事件、概念或者其他普通的值(例如数字,字符串等)。
在传统关系型数据库中,将三元组一个一个的存储在数据库的一个数据项中,当数据量非常大时,表的规模就非常大,这样的话,查询和修改操作的开销会变得非常的大,这会极大伤害知识图谱的实用性。虽然,基于关系型数据库,有人提出了类型表的方法,即将数据按照schema进行分类,然后数据按照不同的类型表分表存储。但是,由于其本质上并没有“理解”知识图谱的复杂结构,其查表过程仍然较慢较繁琐,无法适应数据量极大的知识图谱的应用。
2)图数据库
将实体看作节点,关系看作带有标签的边,那么知识图谱的数据很自然的满足图模型结构。因此,基于图结构的存储方式能够直接准确的反映知识图谱的内部结构,有利于对知识的查询。另外,以图的方式对知识进行存储,还可以借鉴图论的相关算法,有利于知识推理和知识挖掘。
常用的图数据库有:Neo4J,OrientDB,InfoGrid,HyperGraphDB等。目前,应用较为广泛的为Neo4J和OrientDB。图数据发展较晚,相关标准和技术均不完备,实际应用时可能会遇到意想不到的问题。因此,在为项目选择图数据库时,需要将数据库的易用性和技术文档的完整性等因素也考虑进来。Neo4J是目前较为流行的图数据库,它极易入门,访问速度快。
基于图结构的存储模型用节点表示实体,用边表示实体之间的关系。如下图所示,展示了基于图数据库的知识存储示例。由图可见,节点可以定义属性,用来描述实体的各种特性,下图中“周杰伦”有“身高”,“体重”等属性。基于图结构的存储方法,还可以为边定义属性,因此,还能够描绘实体之间的关系,例如,“周杰伦”和“黄秋生”之间就用了一条叫“义父”的边来连接,表达了他们之间的关系。
2 知识的检索
知识检索的过程,通常是知道三元组(S,P,O)中S和P,从图谱中获取O的过程。以KBQA为例,我们来讲述一下知识检索的过程。
假设用户输入这样的query:“周杰伦的义父是谁?”,读者先想一下,需要经过哪些步骤,才能检索图谱得到答案呢?
如上图所示,展示了这样一个过程:
1.通过实体识别模块,识别出S:周杰伦
2.通过关系识别模块,识别出P:义父是谁
3.检索图数据库,得到答案“黄秋生”
上述过程是一个标准的流程,在实际的应用过程中,可能还会有实体的链接以及关系校正等过程。
当然,检索数据库过程因不同数据库而异,具体不会太复杂,感兴趣的同学可以参考自己所使用的数据库的文档,这里不做详细的介绍。
总结
知识图谱是人工智能技术最重要的基础设施,是计算机能够实现推理、预测等类似人类思考能力的关键。知识存储和检索是知识图谱系列技术中相对简单的一环。对开发者而言,其难点在于检索过程,即组建检索语句的过程,设计实体识别及关系识别。
我会在知识星球中讨论NEO4J的具体操作以及KBQA的具体实现,感兴趣的同学可以扫描下面的二维码加入。