知识图谱-基础概念梳理
计算机专业刚⼊坑知识图谱,我⼤概是这种状态:
这⾥主要是为了开发时看懂需求,所以不做深⼊了解。
不过没办法- -从概念开始慢慢来吧。。。
1. 什么是知识图谱:
知识图谱(Knowledge Graph),在图书情报界称为知识域可视化或知识领域映射地图,是显⽰知识发展进程与结构关系的⼀系列各种不同的图形,⽤可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显⽰知识及它们之间的相互联系。
个⼈理解就是展⽰复杂知识资源相互联系的⼀图形结构
2. RDF:资源描述框架(Resource Description Framework)(知识表⽰的⼀种⽅式)
知识图谱是展⽰资源相互联系的结构,所以⾸先要能描述资源,以及资源的联系。然后通过各种处理来发现其中的直接关系(我们⽤RDF已经存储的)和可能的隐藏关系(推导出来的)。
最简单的应⽤:你淘宝搜个卫⽣⼱,然后淘宝知识图谱⾥:卫⽣⼱是⼤姨妈的 “需要” 属性之⼀,⼤姨妈的其他 “需要” 属性还包含了:绿⾖汤,卫⽣棉,热⽔壶。。。然后你第⼆天就发现你的淘宝主页上各种暖⽔壶,卫⽣棉,绿⾖汤。。。
或者:特朗普是美国总统,特朗普是房地产商  -》美国总统是⼀个房地产商然后进⼀步推导出别的隐藏关系。
资源(Resource):所有以RDF表⽰法来描述的东西都叫做资源,它可能是⼀个⽹站,可能是⼀个⽹页,可能只是⽹页中的某个部分,甚⾄是不存在于⽹络的东西,如纸本⽂献、器物、⼈等。在RDF中,资源是以统⼀资源标识(URI,Uniform Resource Indentifiers)来命名,统⼀资源定位器(URL,Uniform Resource Locators)、统⼀资源名称(URN,Uniform Resource Names)都是URI的⼦集。
属性(Properties):属性是⽤来描述资源的特定特征或关系,每⼀个属性都有特定的意义,⽤来定义它的属性值(Value)和它所描述的资源形态,以及和其它属性的关系。RDF的(Property,Property value)在概念上和传统的(Attribute,Attribute value)是相同的。
陈述(Statements):特定的资源以⼀个被命名的属性与相应的属性值来描述,称为⼀个RDF陈述,其中资源是主词(Subject),属性是述词(Predicate),属性值则是受词(Object),陈述的受词除了可能是⼀个字符串,也可能是其它的资料形态或是⼀个资源。
先举⼀个例⼦:
⽤xml语法来描述⼀个东西:
e.g:
<Description about=/dlib/may98/miller>              <- /dlib/may98/miller  这个唯⼀标识了这个资源(统⼀资源标识)
<DC:title>                                        <-  属性标签
An introduction to the Resource Description Framework  <--属性的描述(陈述)
</DC:title>
<DC:creator>
Eric Miller
</DC:creator>
<DC:date>
1998-0501
</DC:date>
</Description>
这种描述⼀个东西的⽅式就是RDF(不等同于XML语法,只能说所有RDF可以⽤xml来描述, xml有固定格式,⽽rdf只是⼀种框架,感觉有点像jvm和hotspot,⼀个是⼀种规范,⼀个是这种规范的⼀种主要实现⽅式)
不过xml相对来说太过正规,所以现在不⽤这种⽅式,⽽是直接⽤三元组(“主谓宾”  的直接排列)(也可以理解为资源的xx属性是描述)
类似于这种:
</dlib/may98/miller> <DC:title> "An introduction to the Resource Description Framework".
</dlib/may98/miller> <DC:creator> "Eric Miller".高考报考专业
</dlib/may98/miller> <DC:date> "1998-0501".
或者⽤turtle⽅式来描述:
羽球规则
@prefix Description: <"/dlib/may98/miller/">.  //这⾥要注意。。。下⾯那些语句的主语是这个url,不是Description,相当于java⾥⾯声明了⼀个变量Description指向它。。。
Description :title "An introduction to the Resource Description Framework".
Description :creator "Eric Miller".    //或者表⽰成主谓宾:  Description :的creator是 "Eric Miller".
Description :date "1998-0501".
这样可以⽤更少的空间,更简洁的⽅式来存储⼀个资源了。
RDF的描述⽅式有很多。。。总之只要是⽤资源,属性,描述的⽅式来描述的⽅法就是RDF(不是这
⽅⾯专业的知道这个就差不多了- -)三元组的个⼈理解:这玩意类似于关系数据库中的关联查询。。。A中包含的属性B,然后B有描述C。((A,B),C)  --> 变成RDF就成了(A,B,C),只不过默认了ABC有着固定的关系。
3元组其实就是2元组基础上外⾯多套了⼀层关系,因此再套⼀层就会变成4元组。。。以此类推。
3. OWL, RDFS
RDF的扩展,加了⼀点新功能。
4. SPARQL
RDFS查询语句(Java中有SPARQL处理器:ARQ)
玄彬 河智苑貌似很常⽤,有需要的话准备单独写⼀篇。
基本语句:
select ?student where {
?student exp:studies exp:CS328
}
差不多等于:
1亩是多少平方米
select student from exp  where studies = CS328
5. 知识抽取:
想要完成知识图谱,第⼀步就是获取知识和知识之间的关系。
1. 命名实体识别:
出信息中的名字和实体(确定主语和宾语)
2. 术语抽取:
分辨并抽取信息中的专业术语
3. 关系抽取:
抽取资源之间的关系。(王健林之⼦王思聪 ->  王健林的⼉⼦是王思聪)
4.共指消解:
分辨合并同类项(“⽐如⼩明出去玩,他没去成”,要出:其中的“他”是指的⼩明)
如果还没有概念可以举个例⼦:
我们要处理⼀句话,并梳理成知识图谱:
王健林之⼦王思聪宣布破产
1. 我们数据库⾥存放了各种词组,可以先分词:王健林之⼦王思聪宣布破产
2,抽出其中的名词:王健林,王思聪(名词的确定可以是存储,也可能是某种算法:⽐如分词时,王xx + 之⼦可能是⼀个姓名 + 之⼦这种,基本上每种抽取算法都可以单独开课= =。)
3.抽取关系:名词之间⼀般是动词或者关系词。然后分析:之⼦不是动词,说明王建林的⼉⼦是王思聪(建⽴关系1)
4.抽取事件:到动词:宣布可以知道动词前后是主语和宾语
5.建⽴关系:王思聪宣布破产(建⽴关系2)
然后建⽴知识图谱:⽐如百度建⽴了这个图谱,当你搜王思聪的百科,百度根据关系查,然后就会显⽰相关词条:王健林,破产。
这只是举个例⼦,实际分析肯定不会这么简单,还要考虑很多东西。
6.确定关系的⽅法:
1. 模板:储存常⽤词的词性和上下⽂可能出现的词性,然后得到⼀个树形结构的模型(储存各种句⼦结构分⽀)进⾏分析。
这种⽅式查的准,但是可能不全。(因为你不可能列举出所有可能,但是基本准确)
⽐如王思聪是富豪(模型中“是” 肯定是表⽰⼀种 is 关系)所以直接可以得出王思聪是富豪这种关系
2. 监督学习:利⽤⼤量的数据对算法进⾏训练(俗称规律- -),然后得到⼀个树形结构的模型。(感觉这个和上⾯那个区别不⼤。。。)
Pipleline:先出实体,再分析关系。(先出名词,然后根据位置推测其他词的词性,确定两者之间的关系)
Joint Model:实体和关系⼀起分析。(⼀步到位进⾏分析,确定两者之间关系)
这种⽅式需要⼤量数据和标注来进⾏训练,⼯作量很⼤。(所以叫监督学习= =要有⼈给答案。。。机器才能学习)
先输⼊王思聪是富豪,然后输⼊结果:王思聪是富豪。
机器分析记住了“是”前后是名词时代表⼀种关系
输⼊王健林是富豪,机器可以得出王健林是富豪这种关系。
3. 半监督学习:
最开始知识图谱⾥⾯有:王思聪创⽴熊猫TV
知道  A 创⽴ B 可以抽取关系: B 的创始⼈是 A。
之后碰到句⼦:王思聪建⽴了熊猫TV
知识图谱查到王思聪,熊猫TV,根据已有结果确定:建⽴了 = 创⽴
然后加⼊图谱。
图谱增加: A 建⽴了 B 可以抽取关系: B 的创始⼈是 A
之后碰到句⼦:王健林建⽴了万达
图谱增加:王健林和万达之间有建⽴关系
之后碰到句⼦:王健林带领万达⾛向辉煌
图谱增加: A 带领 B ⾛向辉煌: B 的创始⼈是 A  (⼤部分时候带领⼈就是创始⼈,但是也有例外,这时候已经有可能出现分析错误了)
半监督算法就是这样不断迭代增加,但是也可以看出来:代多了可能就会出现分析准确率逐渐跑偏的可能。。。
所以新增时需要⼈⼯检测审查(因此是半监督,⼈不负责告诉答案了,但是仍然要责审查机器得到的答案)
4.⽆监督(纯⾃学)
⽬前基本不会⽤这种⽅式。。。因为很难保证正确性。
7. 知识存储
⼀般使⽤图形数据库:最常⽤的⽐如mongodb,nodejs等
8. 知识融合
知识融合是指对来⾃不同地⽅的相同实例进⾏合并(⽐如百度的特朗普和 wifi的Trump,或者百度中的唐僧和唐三藏)。
创建知识图谱,需要的数据资源往往来⾃于各种数据库,所以需要合并同类项。
主要有两种情况的融合:
主要是实体融合,也叫知识对齐(判断两个实体是不是同⼀个)
不同别称(唐僧唐三藏):
⽐如唐僧的关系中有:徒弟是孙悟空,是唐朝⼈,等等
然后唐三藏的关系也有:徒弟是孙悟空,是唐朝⼈,等等
党风廉正建设学习心得当重合性达到⼀定⽐率,就可以⼤概判断出这两个是同⼀个实体。(低于⼀定⽐率就说明不是)
不同语⾔(⽐如特朗普 Trump):主要是通过翻译,然后也可以翻译后进⾏补充。
当然,实际操作起来有很多步骤:
1. 预处理(语⾔,标点等正规化,去重去错等)
2. 分块
把⽬标对象体分组,⽬的很简单,减少每次需要处理的数据数量。
1. 根据hash算法(⽐如字符串前⼏个字母,或者算hashcode是不是⼀样)
2.⽣成某些关键字,然后排序等(⽐如动物根据纲,科这类的分组)
分组后为了多线操作可能要做负载均衡(数据多的,或者⽐较重要的数据占⽤更多资源来处理)。
尽量保证块中的数据数量相当
贝利亚3. 记录链接
主要是计算相似度:
属性相似度:属性有多少是⼀样的。
计算相似距离:⽤动态规划计算两个描述语句之间的差别⼤⼩等技术(字符串A变成字符串B需要最少需要修改多少个字符(类似于这种))
计算集合相似度:⽐如两个乐队,⽐较成员然后看相似度。两个单词,看做字母的集合,⽐较相似度。
向量相似度:实体A和B之间关系可以看做是个从A指向B的向量,⽐较两个向量的相似度。
4. 评估
根据相似度确定是不是同⼀个(设定⼀个标准)