知识图谱泛谈

最近做项目,接触到知识图谱,开始觉得很高大上,其实更多是一个概念和很多细枝末节的实践。引用书上的一种定义:


知识图谱包含了一堆互相关联的实体和属性。
说新不新,本质上就是一种大型的语义网络。简单理解,就是构造现实中的一个个实体,每个实体可以有一些属性,实体之间也可以关联起来。其实属性也可以作为实体,属性和实体的界限似乎没那么分明。

有了知识图谱后,就可以做很多事情,智能问答、反欺诈、搜索等。比如搜索,传统的搜索引擎就是字面上的索引,没有类人的理解。而我们想知道:刘邦的老婆的哥哥。如果传统搜索可能就会用关键词刘邦、老婆、哥哥去搜索,可能找到的只是含有这几个词的文章。而如果有了历史人物关系图的知识图谱,经过加工后就变成查询刘邦->(关系:老婆)->(关系:哥哥),就能顺着图顺利地找到正确答案。

怎么表示知识图谱呢?一般学术界常用RDF,其本质是一个数据模型,它提供了一个统一的标准,用于描述实体和资源。三元组是知识图谱中知识表示的基本单位,被用来表示实体与实体的关系,以及实体的某个属性值是什么。

常用的序列化方式有RDF/XML,N-triples,Turtle,RDFa,JSON-LD等,也就是不同的格式来表示。
工业界往往用图数据库,因为图数据库做了很多优化,操作效率高。e.g.Neo4j。比如在Python中,可以建一个简单的图:

from py2neo import Node, Relationship, Graph

graph = Graph(password="123")
a = Node("Person", name="aa", age=20)
b = Node("Person", name="bb", age=21)
c = Node("Person", name="cc", age=16)
d = Node("Person", name="dd", age=15)
e = Node("Pet", name="ee")

r1 = Relationship(a, "KNOWS", b)
r2 = Relationship(a, "KNOWS", c)
r3 = Relationship(a, "KNOWS", d)
r5 = Relationship(b, "HAS", e)

s = a | b | c | d | e | r1 | r2 | r3 | r5
graph.create(s)

可以很直观看到图的结构如下。


表示有aa, bb, cc, dd4个人的认识关系,以及bb有一个宠物ee。
用Cypher语句能很方便对图进行操作。
如我们想知道:谁认识有宠物的人?



知识图谱的构建是一项耗时的工作,主要流程如下。

首先要收集数据,一方面从结构化数据(比如公司数据库)中直接提取,一般是应用于垂直特定领域;一方面可以爬取网页并解析,从非结构化数据中心提取内容。

这里就用到实体抽取等技术,比如NER的方式,属性和关系抽取在技术上类似,针对实体-实体/实体-属性,可以预设关系类型作为一个分类问题,也可以看做一个开放性三元组提取。

知识融合是指不同来源的同一东西进行融合,如Apple和苹果公司指代同一个实体,应该进行融合,一个实体有唯一id。知识消歧是说比如苹果,在有的地方是指水果的苹果,有的地方指的是苹果公司,有的地方是指苹果手机,这里就需要对苹果消除歧义。

从不同途径解析的实体属性和关系数据,最终整合到一起。概念构建可以理解为抽象类,实体作为这个抽象类的Instance。这里就分自顶向下--先定义好本体与数据模式,再将实体加入到知识库;和自底向上--先提取实体这些,再来构建本体模式,这种一般常见于通用搜索、从开放式数据中提取的项目中。

知识推理是指从已有的知识库中,进一步推导,说个简单的例子,比如我们知道A是B的爸爸,那我们就推导出B是A的儿子。当然实际的推导可能更复杂,推导过程中也可能出现矛盾,从而回过头检验已有知识的正确性。

你可能感兴趣的:(知识图谱泛谈)