最近读了这本书,在思路上很有启发,对知识图谱有了初步的认识,以下是原书后半部分的内容,可以购买实体书获取更多内容。
结合已有规则,推出新的事实,例如持有股份就能控制一家公司,孙宏斌持有融创的股份,那么可以推导出孙宏斌控制融创
逻辑编程RDFFox:
java实现,基于DataLog,依靠逻辑编程进行推理,根据自定义的和已有的规则,从已知事实推新事实
例如,根据孙宏斌控制融创,并且只有自然人能控制公司,可以推导出孙宏斌是自然人
产生式推理Drools、Jena、GraphDB等:
由事实集合、产生式集合和推理引擎构成
事实集合:例如(student name:zhangsan age:23)表示有一个叫张三的人23岁
产生式集合:例如IF(student name:) then add(person name)表示如果有一个学生名为x,那么就添加一个名为x的人到person中
推理引擎中包含推理规则,将推理规则应用到事实集合和产生式集合中,能产生新的知识
例如规则为(type x y),(subClassOf y z)=>add(type x z),
事实集合和产生式集合分别为(type zhangsan student) (subClass student person)
那么可以推理出(type zhangsan person)
当执行规则有很多条时,可以随机选择其中一条、选择最近没有被用的一条、最复杂的一条进行之星,知道没有新规则可以被执行
从图中高频出现的一些结构,可以推断出一些隐形的知识,
例如a--妻子--b--孩子--c,并且存在a--孩子--c,那么就可以推断出这两个关系是等价的。
使用以下两种算法,能够发现一些概率很高的关系路径,通过分析,可以确定出这些关系路径的共同模式,并将其总结为新知识
例如已知运动员h位于北京市t,并且其他很多实体中都存在类似于下面路规则的路径,就可以推出一条新的规则:
(运动员h)==效力于==》(国安队)==位于==》(北京市t)
当对新运动员进行分析时,如果仅知道运动员效力于申花队和申花队位于上海两个知识,
那么就可以应用上面的规则,推断出该运动员位于上海市
PRA(path ranking algorithm)算法:
可以用来预测给定头实体h和关系r,预测尾实体t的概率分别是多少(或者反过来给定t和r,预测头实体h)
可以使用前向算法计算k跳之内到达每一个节点的概率(),然后再logistics平滑处理
CoR-PRA算法:
是一种改进,从h和t出发,分别计算特定步数内到达各个节点的概率。当发现h-》x且t-》x时,就可以认为h和t之间存在关系
可以用h和t之间的覆盖度和精确度,来衡量h和t的关系。
SFE是进一步的算法,考虑了二元路径,剪枝(假设h对应到关系r连接着很多不同的节点,就忽略r),以及两个节点是否有共同的属性等
参考论文:
Learning relations features with backword random wallks,ni lao,acl 2015
Efficient and expressive knowledge base cmpletion using subgraph feature extraction,matt gardner,emnlp 2015
工具库:
github.com/noon99jaki/pra
类似于离散数学的推导 rule:head<–body,例如:
ifFatherOf(X,Z)-
评价标准:
support(rule)表示同时满足head(rule)和body(rule)的实例个数
置信度=support(rule)/body(rule)
头覆盖度=support(rule)/head(rule)
pca置信度(部分完全假设)=support(rule)/ (body(rule) and r(x,y^)),
分母中过滤了从X类出发但是没有到达Y类节点的情况
常用工具AMIE:
效率高,能挖掘出大量规则,改进版AMIE+
transE:最基础的方法
transH:能够表示1:n,n:n等关系,可以将不同向量投影到同一个平面,并使其投影相同
transR:区分实体向量和关系向量,每个关系都多了一个d * d的矩阵
transD:在transR的基础上,用两个向量代替上面提到的矩阵
DistMult:不需要向量加法,更简单
其他方法:NTN、ConvE等
随着信息在节点间的传播,来捕捉节点间的依赖关系,并进行推理,例如节点分类、边分类等
知识库补全:利用已存在的三元组和包含新实体的三元组,对新实体进行表示学习,
连接预测和实体发现:获取缺失节点embedding,预测两个节点之间是否存在一些边
工具库:
networkx可以参考:https://networkx.org/
dgl可以参考https://docs.dgl.ai/tutorials/blitz/4_link_predict.html#sphx-glr-tutorials-blitz-4-link-predict-py
互联网中大量数据,大量数据以rdf的形式存在,因此可以使用sparql语言进行查询,类似于sql和数据库之间的关系
查询时,可以查询是否存在某个节点,或者按照一定条件查询,或者描述一个节点的全部关系信息,或者为节点增加信息
有删除和插入某些关系功能,没有更新功能
可以借助索引来加速搜索,但是要合理利用缓存,并考虑索引的增量
可以直接用关键词来定位实体
也可以利用关键词所暗示的起点和终点来构造索引(例如1999-2003年的电影)
也可以利用包含结构化查询实体和关系类别的索引,例如比战狼票房高的电影
进行结构化查询时,例如吴京的配偶是谁,配偶一词对应的图谱的关系是“夫妻”,
因此需要构造关键词-》图谱中的实体和边的映射关系
有了映射关系后,能生成局部的子图,将其中的实体或边取出,就能完成排序了。
排序分为两部分,同一个关键词可能会生成多个子图,例如吴京真实的妻子、吴京在电视剧中的妻子,
需要对这些进行一次排序,再对每一个子图中的内容进行排序,例如吴京电视剧中有5个妻子,但是最热门的是刘涛等。
将实体投影到连续的向量空间中,一是方便计算两个不同实体之间的相似度,二是向量的语义更丰富
who play in Chicago and won an Oscar?
在传统语义搜索中,有以下三步:
1.首先将搜索词与知识图谱中的关系做对齐,who是所需检索实体1,Chicago是实体2,play in 是关系
然后用关键字检索的方式找出候选实体和边,可能有很多相关的
2.然后对这些边和实体进行消歧(play in Chicago and won Oscar,play有多种解释,但是在上下文中“出演”最合适,
Chicago也有很多解释,但这里“电影Chicago”更合适),
3.将消歧后的实体和边做组合(即,出演,电影),通过电影chicago和出演关系找到候选演员集合,
再去看谁拿了Ocasr奖,就能从对应的图谱中筛选出可能的演员。
而在表示学习中,可以直接利用向量省略消歧的过程,并进行近似查询。
首先判断搜索类型,是根据实体搜属性 还是根据属性搜实体
接下来识别知识库中是否包含所需实体,并通过映射,将搜索内容中的属性进行映射(例如用户问多大啦,几岁了,都是是在问年龄)
然后进行细化,例如用户问大于三十岁的篮球运动员,那么就去构造》30的条件,并用es去查询,
也就是说,可以给予每类问题的模板,填充解析时识别出的实体名和属性名,以及属性条件,最终进行es查询
事实问题:
实体的属性(西红柿原产地)、实体的基本定义(什么是西红柿)、
复杂图谱查询(北京2022年gdp、王菲和章子怡的关系)
主观问题:
“如何做蛋糕”、“如何治疗近视”等
知识库:
纯文本知识库、半结构化知识库(excel等)、图片视频;
分布式表示的知识库问答:
例如询问姚明老婆的出生地,首先将这个问句转化为向量a,然后看与姚明相关的实体向量中,哪个与a最相似。
基于符号的传统问答:
先确定逻辑表达式,例如问姚明老婆的出生地,需要先转化为sparql语言,然后再去知识库中查询,
需要将老婆映射到"配偶"这一关系中。
早期问答系统:
主要基于模式匹配或语法解析,前者类似识别关键词并填充,
后者利用语法解析发现实体并按照一定规则转化为数据库查询
例如问“中国哪个城市人口最多”,需要经历
1.问题处理,识别出过滤条件和答案所需类型,这里的条件是人口最多,答案需要是一个城市
2.段落检索与排序,基于关键词召回文档,切分段落
3.从段落中选出合适的答案
步骤有四个:
1.问题分析,利用词典、词性分析、分词、实体识别、语法树分析、句法依存分析等提取问题信息,
基于机器学习或规则提取,来判断问句的类型和所需答案的类型,
2.连接到知识库中,包括关系属性、描述属性、实体分类,例如将“姚明老婆是”映射到“配偶”这一图谱中存在的关系上
3.消歧,例如建国路可能指道路本身,也可能指建国路这个社区;
可以先生成关于社区和道路的两种查询,然后通过统计方法和机器学习进行筛选
4.构建查询,基于前面的问题解析结果,转化为sql或sparql查询。
也称CommunityQA,类似于百度知道,核心是计算语义相似性
面临的挑战有两点,一是词汇歧),二是语言表达的多样性(相同的语义有很多表达方式)
quora QA数据集和测试,主要就是评价问题的相似度
挑战:
知识库不完整、泛化语义理解(还活着吗,需要对应“死亡日期”这一属性)、
多样化映射机制(例如外孙应该映射成女儿的儿子这个条件,以及其他过滤、排序条件,例如产量最多的年份、1990年之前等)
计算语义相似度:语言模型、句子主题分析模型、句子结构相似度分析模型
可以参考cui的论文【1】,能够自动化生成问题模板,
例如有人问“请问江苏的人口是多少”,则可以把江苏换为“{省份}”,把人口换为“{地区属性}”,
即得到模板“{省份}{地区属性}”
并去知识图谱中找相关属性,这样就能识别“广东的面积有多大”,
处理简单的属性问题、比较问题或组合问题(把组合问题拆成简单问题),
例如“广东和江苏哪个面积大”,可以拆分为“{省份1}{省份2}{地区属性1}{比较符号}”,
这样就能识别“甘肃和河南哪个人口多”了
同样,例如“广东省会的经济总量是多少”,则可以拆分成“广东省会是哪里”和“省会经济总量是多少”,
其中第一个问题可以套用模板“{省份}{地区属性}”得到广东省会广州,然后可以套用其他末班。
可以把问题中的实体提取出来,并映射到不同的分类中,
然后再去找与每个分类中的实体相关模板的相似度,(例如槽位数量,槽位中词汇的类型以及非槽位词的文本相似度)
选择合适的模板并判断所需查询的具体属性。
例如问题“东风有限公司的法人是谁”,可以匹配模板“{公司}{公司属性}”,
但是东风公司对应东风汽车厂和东风导弹厂,因此需要分别查询他们的属性
参考文献:
【1】KBQA;Learning Question Answering over QA Corpora and knowledge Bases,CUI W,VLDB 2017
【2】Auto Template Generation for Question Answering over Knowledge Graphs,Abujabal A,WWW 2017
进行语法分析,将查询转化为逻辑表达式,然后利用知识库的语义信息将逻辑表达式转为知识查询。
资源映射【1】:
例如文本中可以找出大量的“r1={老婆是}{男性,女性}”、“r2={妻子是}{男性,女性}”,
并且通过统计发现,关系r1所对应的{男性,女性}实例对,与关系r2对应的{男性,女性}实例对高度重合
则可以判断r1和r2是等价的,可以进行资源映射(可以用jaccard距离来判断)
桥接操作【1】:
例如问句“which college did Obama go to”和“which college did obama graduate”,
在后一个句子中,可以直接根据obama和grduate两个词,从知识图谱中查询奥巴马的毕业院校(假设有相关数据)
但是前一个句子,只能识别出奥巴马,无法理解“go to”所代表的属性
因此可以利用其他信息,例如obama是人名,college是地名,并且“graduate”这一关系的首尾两端分别是人名和地名,
因此可以将go to理解为“毕业于”。
当知识库中还存在着“奥巴马访问了哈佛大学”的知识时,由于“访问”这一关系的首尾两端的属性是人名和地名,
因此可以将 go to 理解为“访问”。
参考文献:
【1】Semantic Parsing on Freebase from question-answer pairs,berant j,emnlp 2013
端到端:
文献【1】将问题,以及与问题中关键词相关的实体属性分别映射到低维向量,并做相似度运算,
例如问阿凡达在因果的上映时间,则直接把与阿凡达相关的属性分别送入一个双塔网络。
文献【2】同时训练语言词向量和知识库三元组,将问题与知识库映射到同一个空间,
分别得到主题词向量、上下文向量和答案向量,将这三种向量分别点积,将点积结果求和,得到每一个候选属性的分数。
例如询问阿凡达在英国的上映时间,则对应的主题词为阿凡达,上下文为英国,答案向量为一个日期
辅助选择:
可以应用于实体识别模块(bert或lstm+crf)、关系分类意图识别模块(文本分类模型)、
实体消歧(基于深度学习的排序,判断一组概念的语义融洽度)
语义解析方面,文献【3】可以将一个问句(例如“谁在武林外传中为佟湘玉配音”)Q1,
和一个图谱中的多跳关系进行融合和扩展的结果R1(例如武林外传=》配音演员=》王伟,和王伟=》饰演佟湘玉,两个关系路径进行融合)
,将Q1和R1分别映射到300维向量,并计算相似度
参考文献:
【1】 Question Answering with subgraph embedding,bordes A,2014
【2】Question Answer over freebase with multi-column convolutional neural network,Dong L,acl 2015
【3】Semantic parsing via staged query graph generation:question answering with knowledge base[J] 2015
S表示主语,P表示谓语,O表示宾语,OP表示运算符
则属性检索可表达为S:P(例如姚明的身高),
多跳查询表达为S:P1:P2(例如姚明妻子的籍贯),
多属性查询表达为P1 OP O1 and P2 OP (O2 or O3),例如身高大于180,并且国籍是中国或美国
分词词典:
可以先将知识库中的实体名和属性名作为分词词典,之后再分词;
属性值的匹配:
在汉语中,也可以尝试在分词后使用n-gram或elasticsearch,或模糊搜索
例如搜索中包含“国展”,那么“中国展览馆”(n-gram)或者“中国艺术展”(模糊搜索)都能完成映射
有一些属性值没有明确提到属性名,例如“(国籍)中国的运动员”,
没有提到属性名为中国,那么可以尝试使用该值(中国)出现最频繁的属性名(国籍)作为补全
查询类型确定:
在识别出问题中的实体名、属性名、属性值之后,依据他们的数量和位置,
就可以去匹配不同的模板并执行查询了(每一个模板对应着特定的查询)
如果有实体名和多个属性名,那就是多跳检索
如果有一个属性名和一个实体名,并且实体名在前,那么就是查询属性值(张译的身高是多少),
反之则是根据属性值查实体(儿子是金正日的人是谁)
如果没有实体名,则是利用属性查实体,
如果有属性值但是没有属性名,则要补全属性名;
如果只有属性名但没有属性值,则需要用正则去匹配属性值,例如“身高大于180cm”,则需要匹配出“>180”
gAnswer
实用系统
在构造数据时,可以参考gAnswer的数据格式,定义出原始的知识表示,
进而识别出所有的实体(主语和宾语)、谓语、以及每一个主语的类型,并将其处理为编号(方便存储)
针对一词多义,可以构建倒排索引,针对每一个实体,计算其属于每一个类型的置信度(或在该类型中常出现的上下文词汇)
例如“倒数”一词,可能属于邓紫棋的歌曲,也可能是一个动词,
当其上下文出现“专辑、音乐、演唱”等词汇时,更有可能属于邓紫棋的歌曲
自顶向下:从顶层概念出发,逐步细化
自底向上:先对实体进行归纳,然后逐步抽象,需要考入如何描述复杂知识(匿名节点还是边节点)、
是否支持扩展、变更以及调整,
单一式存储:利用三元组、属性表或垂直分割等方式
混合式:综合利用多种单一式存储
原生数据库:neo4j、allegroGraph,针对复杂节点不灵活
结构数据库:mysql、mongo等,较为灵活,可以构建索引、an数据特点进行划分
结构化数据:mysql数据库等,或者yago、freebase
半结构化数据:百科网页、垂类网站等,可以使用包装器进行抽取,包装器是针对数据源的抽取规则
需要考虑数据更新、网页变动等
包装器有STALKER\Wargo等
非结构化数据:文本,文档,数据视频等,分为OpenIE和CloseIE两种,工具分别有Reverb/TextRunner、DeepDive等
数据模式层:概念合并(例如在图谱A中有坦克这个概念,在图谱B中有tank这个概念,二者等价)、
概念上下位(例如主战坦克是坦克的下级概念)、
概念的属性合并(例如发动机马力、发动机功率是一个概念)
数据层:实体合并、实体属性融合、属性融合中的冲突检测等
知识推理:发现新的知识规则,分为基于本体的推理和基于规则的推理。
知识图谱挖掘:图遍历、最短路径、权威节点分析(图排序算法)、族群发现最大流、社区发现、相似节点、路径分析、关联分析、节点聚类等
语义搜索:解决传统搜索中关键字多义歧义,通过实体链接实现知识与文档的混合检索,
智能问答:准确的语义解析的,获得意图,并确定答案的优先级排序。
可视化:提供决策支撑,辅助发现业务模式