知识图谱系列(一):如何构建一个简单的知识图谱 | 您所在的位置:网站首页 › 怎么构建知识图谱图表 › 知识图谱系列(一):如何构建一个简单的知识图谱 |
之前在了解对话系统的时候,就发现其实一个有应用价值的对话系统,需要引入外部知识辅助决策分析,所以我就打算最近学习一下知识图谱,并尝试结合知识图谱构建一个对话系统。 知识图谱是谷歌提出的一个概念,从定义上来说,知识图谱就是结构化的语义知识库,是一种基于图的数据结构,用于描述物理世界中的概念及其相互关系。 既然是图就有边和节点,边指的是事物之间的关系,而节点这里简单地分成两种,第一种是实体,所谓实体就是指现实世界中的一些具体的事物,比如说一个人、一座城市、一家公司等等,都属于实体的范畴。除此之外,我们可以考虑一下,在现实世界里,我们除了需要描述事物之间的关系,有时候我们还需要描述事物本身具备的一些特征,比如"小明是一个大学生",“小明发表了10篇论文”、“小明有2台汽车”,对于这种情况,就要考虑另一种类型的节点,也就是属性,属性可以分为对象属性和数据属性,在"小明是一个大学生"中,“大学生"就是一个对象属性节点,边可以是"当前学历”,在"小明发表了10篇论文"中,“10"是一个数据属性,边可以是"已发表论文数”。当然概念的东西简单了解一下就好,实际上看图更容易理解。
所谓三元组就是< header entity, relation, tail entity >, 比如说"小明是一个大学生"可以表示为< 小明, 当前学历, 大学生 >,"小明今年十岁"可以表示为< 小明, 年龄, 10 >,这样就可以把知识数据结构化地进行存储。 接下来介绍一下如何构建一个知识图谱,用到的工具是Neo4j。 Neo4j作为一个图数据库,为了数据的储存、读写等操作更合理高效,在设计逻辑上和知识图谱有一些差别,所以这里先介绍一下Neo4j的一些概念,为了方便对应Neo4j的官方文档,下列的概念一律用英文。
除此之外,一个node可以拥有多个label,为node设计什么label,主要还是要根据实际情况判断,看如何设计能方便数据的查询和修改等操作:
property中比较特别的是name,经过测试,我发现一个node没有name的话,在可视化界面是不会显示这个node的名称的(这样说好像很傻仔……),但从Neo4j的逻辑来看,一个node不一定需要name这个property,所以我们应该把Neo4j中的node看成是一个更抽象的node,而不是知识图谱中的实体。 经过上面的介绍,主要想说明的是,Neo4j主要的目的也是构建一个知识图谱,不过在实现上更多从数据库的角度出发,引入了label等结构,方面了用户在查询、增删数据时的便利度。除此之外还有其他一些概念,这里暂不继续说,有兴趣的可以看看Neo4j的官方文档。 接下来就是实操环节,安装方面可以参考这个教程,假设我们已经安装好Neo4j,就能通过localhost:7474进行访问:
以下就是利用python的py2neo库建一个简单的知识图谱: 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)
总的来说,本文简单介绍了知识图谱的基本概念,并且通过Neo4j简单构建了一个知识图谱。 KnowledgeGraphBeginner这个项目目的是从零开始实现基于知识图谱的对话系统,会随着这个系列的文章不断更新。 |
CopyRight 2018-2019 实验室设备网 版权所有 |