自然语言学习16-知识图谱

知识图谱的通用表示方法

本质上,知识图谱是一种揭示实体之间关系的语义网络 ,可以对现实世界的事物及其相互关系进行形式化地描述 。现在的知识图谱己被用来泛指各种大规模的知识库 。

三元组是知识图谱的一种通用表示方式,即 G=(E,R,S)G=(E,R,S),其中 E=e1,e2,…,e|E|E=e1,e2,…,e|E|是知识库中的实体集合,共包含 |E||E| 种不同实体,R=r1,r2,…,r|E|R=r1,r2,…,r|E| 是知识库中的关系集合,共包含 |R||R| 种不同关系,S⊆E×R×ES⊆E×R×E 代表知识库中的三元组集合。

三元组的基本形式主要包括实体 A、关系、实体 B 和概念、属性、属性值等,实体是知识图谱中的最基本元素,不同的实体间存在不同的关系。概念主要指集合、类别、对象类型、事物的种类,例如人物、地理等;属性主要指对象可能具有的属性、特征、特性、特点以及参数,例如国籍、生日等;属性值主要指对象指定属性的值,例如中国、1988—09—08等。每个实体(概念的外延)可用一个全局唯一确定的 ID 来标识,每个属性—属性值对可用来刻画实体的内在特性,而关系可用来连接两个实体,刻画它们之间的关联。

如下图是实体 A 与实体 B 组成的一个简单三元组形式。

enter image description here

知识图谱的架构

知识图谱的架构主要包括自身的逻辑结构以及体系架构,分别说明如下。

1. 知识图谱的逻辑结构。

知识图谱在逻辑上可分为模式层与数据层两个层次,数据层主要是由一系列的事实组成,而知识将以事实为单位进行存储。如果用(实体 A,关系,实体 B)、(实体、属性,属性值)这样的三元组来表达事实,可选择图数据库作为存储介质,例如开源的 Neo4j、Twitter 的 FlockDB、Sones 的 GraphDB 等。模式层构建在数据层之上,主要是通过本体库来规范数据层的一系列事实表达。本体是结构化知识库的概念模板,通过本体库而形成的知识库不仅层次结构较强,并且冗余程度较小。

2. 知识图谱的体系架构。

知识图谱的体系架构是指其构建模式结构,如图下图所示。

enter image description here

知识图谱主要有自顶向下与自底向上两种构建方式。自顶向下指的是先为知识图谱定义好本体与数据模式,再将实体加入到知识库。该构建方式需要利用一些现有的结构化知识库作为其基础知识库,例如 Freebase 项目就是采用这种方式,它的绝大部分数据是从维基百科中得到的。自底向上指的是从一些开放链接数据中提取出实体,选择其中置信度较高的加入到知识库,再构建顶层的本体模式。目前,大多数知识图谱都采用自底向上的方式进行构建,其中最典型就是 Google 的 Knowledge Vault。

知识图谱的关键技术

 

enter image description here

 

1. 知识抽取。

知识抽取技术,可以从一些公开的半结构化、非结构化的数据中提取出实体、关系、属性等知识要素。

知识抽取主要包含实体抽取、关系抽取、属性抽取等,涉及到的 NLP 技术有命名实体识别、句法依存、实体关系识别等。

2. 知识表示。

知识表示形成的综合向量对知识库的构建、推理、融合以及应用均具有重要的意义。

基于三元组的知识表示形式受到了人们广泛的认可,但是其在计算效率、数据稀疏性等方面却面临着诸多问题。近年来,以深度学习为代表的表示学习技术取得了重要的进展,可以将实体的语义信息表示为稠密低维实值向量,进而在低维空间中高效计算实体、关系及其之间的复杂语义关联。

知识表示学习主要包含的 NLP 技术有语义相似度计算、复杂关系模型,知识代表模型如距离模型、双线性模型、神经张量模型、矩阵分解模型、翻译模型等。

3.知识融合。

由于知识图谱中的知识来源广泛,存在知识质量良莠不齐、来自不同数据源的知识重复、知识间的关联不够明确等问题,所以必须要进行知识的融合。知识融合是高层次的知识组织,使来自不同知识源的知识在同一框架规范下进行异构数据整合、消歧、加工、推理验证、更新等步骤,达到数据、信息、方法、经验以及人的思想的融合,形成高质量的知识库。

在知识融合过程中,实体对齐、知识加工是两个重要的过程。

4.知识推理。

知识推理则是在已有的知识库基础上进一步挖掘隐含的知识,从而丰富、扩展知识库。在推理的过程中,往往需要关联规则的支持。由于实体、实体属性以及关系的多样性,人们很难穷举所有的推理规则,一些较为复杂的推理规则往往是手动总结的。对于推理规则的挖掘,主要还是依赖于实体以及关系间的丰富情况。知识推理的对象可以是实体、实体的属性、实体间的关系、本体库中概念的层次结构等。

知识推理方法主要可分为基于逻辑的推理与基于图的推理两种类别。

NEO4j创建知识图谱

Cypher 命令

CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;

作用是创建一个 Person,幷包含属性名字和职称。

enter image description here

创建一个 Person 对象,属性中只是名字和职称不一样。

CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;

进行两个 Person 的关系匹配:

match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)-[r:Friend]->(m) return r;

match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)<-[r:Friend]-(m) return r;

查看数据库中的图形:

match(n) return n;

如下图,返回两个 Person 节点,以及其关系网,两个 Person 之间组成 Friend 关系:

enter image description here

Neo4j 的 Python 操作

pip install py2neo

简单的图关系构建

from py2neo.data import Node, Relationship
a = Node("Person", name="Alice")
b = Node("Person", name="Bob")
ab = Relationship(a, "KNOWS", b)

首先引入 Node 和 Relationship 对象,紧接着,创建 a 和 b 节点对象,最后一行匹配 a 和 b 之间的工作雇佣关系。

ab 对象的内容:

print(ab)

通过 print 打印出 ab 的内容:

(Alice)-[:KNOWS {}]->(Bob)

用 Neo4j 构建一个简单的农业知识图谱

语料是已经处理好的数据,包含6个 csv 文件,文件内容和描述如下。

  • attributes.csv:文件大小 2M,内容是通过互动百科页面得到的部分实体的属性,包含字段:Entity、AttributeName、Attribute,分别表示实体、属性名称、属性值。文件前5行结构如下:
Entity,AttributeName,Attribute
密度板,别名,纤维板
葡萄蔓枯病,主要为害部位,枝蔓
坎德拉,性别,男
坎德拉,国籍,法国
坎德拉,场上位置,后卫
  • hudong_pedia.csv:文件大小 94.6M,内容是已经爬好的农业实体的百科页面的结构化数据,包含字段:title、url、image、openTypeList、detail、baseInfoKeyList、baseInfoValueList,分别表示名称、百科 URL 地址、图片、分类类型、详情、关键字、依据来源。文件前2行结构如下:
"title","url","image","openTypeList","detail","baseInfoKeyList","baseInfoValueList"
"菊糖","http://www.baike.com/wiki/菊糖","http://a0.att.hudong.com/72/85/20200000013920144736851207227_s.jpg","健康科学##分子生物学##化学品##有机物##科学##自然科学##药品##药学名词##药物中文名称列表","[药理作用] 诊断试剂 人体内不含菊糖,静注后,不被机体分解、结合、利用和破坏,经肾小球滤过,通过测定血中和尿中的菊糖含量,可以准确计算肾小球的滤过率。菊糖广泛存在于植物组织中,约有3.6万种植物中含有菊糖,尤其是菊芋、菊苣块根中含有丰富的菊糖[6,8]。菊芋(Jerusalem artichoke)又名洋姜,多年生草本植物,在我国栽种广泛,其适应性广、耐贫瘠、产量高、易种植,一般亩产菊芋块茎为2 000~4 000 kg,菊芋块茎除水分外,还含有15%~20%的菊糖,是加工生产菊糖及其制品的良好原料。","中文名:","菊糖"
"密度板","http://www.baike.com/wiki/密度板","http://a0.att.hudong.com/64/31/20200000013920144728317993941_s.jpg","居家##巧克力包装##应用科学##建筑材料##珠宝盒##礼品盒##科学##糖果盒##红酒盒##装修##装饰材料##隔断##首饰盒","密度板(英文:Medium Density Fiberboard (MDF))也称纤维板,是以木质纤维或其他植物纤维为原料,施加脲醛树脂或其他适用的胶粘剂制成的人造板材。按其密度的不同,分为高密度板、中密度板、低密度板。密度板由于质软耐冲击,也容易再加工,在国外是制作家私的一种良好材料,但由于国家关于高密度板的标准比国际标准低数倍,所以,密度板在中国的使用质量还有待提高。","中文名:##全称:##别名:##主要材料:##分类:##优点:","密度板##中密度板纤维板##纤维板##以木质纤维或其他植物纤维##高密度板、中密度板、低密度板##表面光滑平整、材质细密性能稳定"
  • hudong_pedia2.csv:文件大小 41M,内容结构和 hudong_pedia.csv 文件保持一致,只是增加数据量,作为 hudong_pedia.csv 数据的补充。

  • new_node.csv:文件大小 2.28M,内容是节点名称和标签,包含字段:title、lable,分别表示节点名称、标签,文件前5行结构如下:

title,lable
药物治疗,newNode
膳食纤维,newNode
Boven Merwede,newNode
亚美尼亚苏维埃百科全书,newNode
  • wikidata_relation.csv:文件大小 1.83M,内容是实体和关系,包含字段 HudongItem1、relation、HudongItem2,分别表示实体1、关系、实体2,文件前5行结构如下:
HudongItem1,relation,HudongItem2
菊糖,instance of,化合物
菊糖,instance of,多糖
瓦尔,instance of,河流
菊糖,subclass of,食物
瓦尔,origin of the watercourse,莱茵河
  • wikidata_relation2.csv:大小 7.18M,内容结构和 wikidata_relation.csv 一致,作为 wikidata_relation.csv 数据的补充。

语料加载。

语料加载,利用 Neo4j 的 LOAD CSV WITH HEADERS FROM... 功能进行加载,具体操作过程如下。

首先,依次执行以下命令:

// 将hudong_pedia.csv 导入
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})

执行成功之后,控制台显示成功:

enter image description here

上面这张图,表示数据加载成功,并显示加载的数据条数和耗费的时间。

// 新增了hudong_pedia2.csv
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia2.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})

// 创建索引
CREATE CONSTRAINT ON (c:HudongItem)
ASSERT c.title IS UNIQUE

以上命令的意思是,将 hudong_pedia.csv 和 hudong_pedia2.csv 导入 Neo4j 作为结点,然后对 titile 属性添加 UNIQUE(唯一约束/索引)。

数据导入命令:

// 导入新的节点
LOAD CSV WITH HEADERS FROM "file:///new_node.csv" AS line
CREATE (:NewNode { title: line.title })

//添加索引
CREATE CONSTRAINT ON (c:NewNode)
ASSERT c.title IS UNIQUE

//导入hudongItem和新加入节点之间的关系
LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation2.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem}) , (entity2:NewNode{title:line.NewNode})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem1}) , (entity2:HudongItem{title:line.HudongItem2})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

导入 new_node.csv 新节点,并对 titile 属性添加 UNIQUE(唯一约束/索引),导入 wikidata_relation.csv 和 wikidata_relation2.csv,并给节点之间创建关系。

导入实体属性,并创建实体之间的关系:

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2)  

知识图谱查询展示

最后通过 cypher 语句查询来看看农业图谱展示。

首先,展示 HudongItem 实体,执行如下命令:

MATCH (n:HudongItem) RETURN n LIMIT 25

对 HudongItem 实体进行查询,返回结果的25条数据,结果如下图:

enter image description here

接着,展示 NewNode 实体,执行如下命令:

MATCH (n:NewNode) RETURN n LIMIT 25

对 NewNode 实体进行查询,返回结果的25条数据,结果如下图:

enter image description here

之后,展示 RELATION 直接的关系,执行如下命令:

MATCH p=()-[r:RELATION]->() RETURN p LIMIT 25

展示实体属性关系,结果如下图:

enter image description here

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章