文章首发于博客du_ok’s Notes,本文链接为知识图谱入门——知识融合
本文介绍了知识融合相关的技术和典型的知识融合工具。
相关的术语:
上面的术语的基本问题都是将来自多个来源的关于同一个实体或概念的描述信息融合起来。
本体对齐和本体匹配可认为是等价的,它们包含了概念层的融合
后面三个多指数据层的融合
知识融合目标是融合各个层面(概念层、数据层?)的知识,在合并两个知识图谱(本体)时,需要确认:
数据层的融合:
上图是将猫王从YAGO和ElvisPedia进行融合的例子,在融合最主要的工作是实体的对齐,也就是找出等价实例,图中的sameAs就是融合的关键步骤。
知识图谱的构建中经常需要融合多种不同来源的数据:
概念层的融合:
知识融合还包括概念层的融合(包括跨语言的融合:如将中文医疗知识图谱与UMLS融合)
- 知识融合需要:
① 确定哪些会对齐在一起;
② 从不同地方抽取出来的数据的置信度是多少;
③ 这些置信度如何随着融合而合理的聚合。- 知识融合并不是合并两个知识图谱,而是发现两个知识图谱之间的等价实例、等价或为包含关系等概念或属性
知识融合的主要技术挑战:
知识融合一般分为两步,本体对齐和实体匹配,它们的基本流程相似,如下:
数据预处理阶段,原始数据的质量会直接影响到最终链接的结果,不同的数据集对同一实体的描述方式往往是不相同的,对这些数据进行归一化处理是提高后续链接精确度的重要步骤。
假设两个实体的记录x和y,x和y在第i个属性上的值是xi
,yi,那么通过如下
两步进行记录链接:
属性相似度的计算可以使用编辑距离(基于字符)、集合相似度计算和基于向量的相似度计算。
1.Levenshtein distance (最小编辑距离):
目的是用最少的编辑操作将一个字符串转换成另一个,给出一个例子如下:
上述将‘Lvensshtain’ 转换成‘Levenshtein’,总共的操作3 次,编辑距离也就是3。
Levenshtein distance是一个典型的动态规划问题,可以使用动态规划算法计算:
{ D ( 0 , 0 ) = 0 D ( i , 0 ) = D ( i − 1 , 0 ) + 1 1 < i ≤ N D ( 0 , j ) = D ( 0 , j − 1 ) + 1 1 < j ≤ M \left\{ \begin{aligned} D(0, 0) = & 0 & \\ D(i, 0) = & D(i-1, 0) + 1 & ~~~1 < i \le N \\ D(0, j) = & D(0, j-1) + 1 & ~~~ 1 < j \le M \end{aligned} \right. ⎩⎪⎨⎪⎧D(0,0)=D(i,0)=D(0,j)=0D(i−1,0)+1D(0,j−1)+1 1<i≤N 1<j≤M
D ( i , j ) = m i n { D ( i − 1 , j ) + 1 D ( i , j − 1 ) + 1 D ( i − 1. j − 1 ) + 1 D(i, j) = min\left\{ \begin{aligned} &D(i-1, j) + 1 \\ &D(i, j-1) + 1 \\ &D(i-1. j-1) + 1 \end{aligned} \right. D(i,j)=min⎩⎪⎨⎪⎧D(i−1,j)+1D(i,j−1)+1D(i−1.j−1)+1
其中,+1表示的是插入,删除和替换的代价。
Wagner and Fisher distance:
这是Levenshtein 的一个扩展,将这个模型中编辑操作的代价赋予了不同的权重,如下:
{ D ( 0 , 0 ) = 0 D ( i , 0 ) = D ( i − 1 , 0 ) + d e l [ x ( i ) ] 1 < i ≤ N D ( 0 , j ) = D ( 0 , j − 1 ) + d e l [ y ( j ) ] 1 < j ≤ M \left\{ \begin{aligned} D(0, 0) = & 0 & \\ D(i, 0) = & D(i-1, 0) + del[x(i)] & ~~~ 1 < i \le N \\ D(0, j) = & D(0, j-1) + del[y(j)] & ~~~ 1 < j \le M \end{aligned} \right. ⎩⎪⎨⎪⎧D(0,0)=D(i,0)=D(0,j)=0D(i−1,0)+del[x(i)]D(0,j−1)+del[y(j)] 1<i≤N 1<j≤M
D ( i , j ) = m i n { D ( i − 1 , j ) + d e l [ x ( i ) ] D ( i , j − 1 ) + i n s [ y ( j ) ] D ( i − 1. j − 1 ) + s u n [ x ( i ) , y ( j ) ] D(i, j) = min\left\{ \begin{aligned} & D(i-1, j) + del[x(i)] \\ & D(i, j-1) + ins[y(j)] \\ & D(i-1. j-1) + sun[x(i), y(j)] \end{aligned} \right. D(i,j)=min⎩⎪⎨⎪⎧D(i−1,j)+del[x(i)]D(i,j−1)+ins[y(j)]D(i−1.j−1)+sun[x(i),y(j)]
其中, del 和 ins 以及 sub 分别是删除和插入以及替换的代价。
Edit Distance with affine gaps:
在上面两种算法的基础上,引入了gap penalty的概念,将上述的插入,删除和替换操作用用gap opening和gap extension代替,编辑操作的代价也就表示为:
C o s t ( g ) = s + e ∗ l Cost(g) = s + e * l Cost(g)=s+e∗l
其中, s是open gap的代价, e是extend gap的代价, l是gap的长度。
关于gap penalty可以参考:
en.wikipedia.org/wiki/Gap_penalty
www.cs.cmu.edu/~ckingsf/bioinfo-lectures/gaps.pdf
结合前面‘Lvensshtain’转换的例子:
首先将首尾对其,然后将需要添加和修改的位置变成Gap。
其中, E \mathcal{E} E代表一个gap,结合上述代价公式,若设置s = 2,e = 1上述编辑操作代价为(2 + 1 ∗ 1) ∗ 4 = 12。
Dice 系数:
用于度量两个集合的相似性,因为可以把字符串理解为一种集合,因此Dice距离也会用于度量字符串的相似性,Dice系数定义如下:
s i m D i c e ( s , t ) = 2 ∣ S ∩ T ∣ ∣ S ∣ + ∣ T ∣ sim_{Dice}(s, t) = \frac{2|S \cap T|}{|S|+|T|} simDice(s,t)=∣S∣+∣T∣2∣S∩T∣
以 ‘Lvensshtain’ 和‘Levenshtein’为例,两者相似度为 2*9/ (11+11)= 0.82。
Jaccard 系数:
适合处理短文本的相似度,定义如下:
s i m J a c c a r d ( s , t ) = ∣ S ∩ T ∣ ∣ S ∪ T ∣ sim_{Jaccard}(s, t) = \frac{|S \cap T|}{|S \cup T|} simJaccard(s,t)=∣S∪T∣∣S∩T∣
文本转换为集合:
TF-IDF:
主要用来评估某个字或者用某个词对一个文档的重要程度。
t f i , j = n i , j Σ k n k , j {tf}_{i, j} = \frac{n_{i, j}}{\Sigma_{k}n_{k, j}} tfi,j=Σknk,jni,j
i d f i = log ∣ D ∣ 1 + ∣ j : t i ∈ d j ∣ idf_{i} = \log\frac{|D|}{1 + |{j:t_{i}\in d_{j}}|} idfi=log1+∣j:ti∈dj∣∣D∣
s i m T F − I D F = t f i , j ∗ i d f i sim_{TF-IDF}=tf_{i,j} * idf_{i} simTF−IDF=tfi,j∗idfi
TF-IDF用来过滤常见词、保留重要词:
TF:词频(term frequency)指的是某一个给定的词语在该文件中出现的频率,衡量了一个词在一个文档中的重要程度;
IDF:逆向文件频率(inverse document frequency)是一个词语普遍重要性的度量,如冠词a、an、the等。
比如某个语料库中有5万篇文章,含有“健康”的有2万篇,现有一篇文章,共1000个词,‘健康’出现30次,则 s i m T F − I D F = 30 / 1000 ∗ l o g ( 50000 / ( 20000 + 1 ) ) = 0.012 sim_{TF-IDF}=30/1000 * log(50000/(20000+1)) = 0.012 simTF−IDF=30/1000∗log(50000/(20000+1))=0.012。
方法:聚合(加权平均、手动制定规则、分类器);聚类(层次聚类、相关性聚类、Canopy + K-means);表示学习。
基于聚合方法存在的一些问题:(最关键的问题是需要生成训练集合)
一些解决方案:
层次聚类 (Hierarchical Clustering) :
通过计算不同类别数据点之间的相似度对在不同的层次的数据进行划分,最终形成树状(二叉树)的聚类结构。
底层的原始数据可以通过相似度函数计算,类之间的相似度有如下三种算法:
给出一个层次聚类的例子,由左图的数据,用欧氏距离和SL进行层次聚类:
可以计算出B,C之间的欧氏距离为 ( B − C ) 2 = ( 38.5 − 39.5 ) 2 = 1 \sqrt{(B-C)^2}=\sqrt{(38.5-39.5)^2}=1 (B−C)2=(38.5−39.5)2=1
接着将B和C组合,再次计算距离为:
其中单个数据与之间的距离计算如: D = ( B − A ) 2 + ( C − A ) 2 2 = 21.6 + 22.6 2 D=\frac{\sqrt{(B-A)^2}+\sqrt{(C-A)^2}}{2}=\frac{21.6+22.6}{2} D=2(B−A)2+(C−A)2=221.6+22.6
之后计算类与类之间的距离,如计算(A,F)和(B,C)之间的距离:
D = ( A − B ) 2 + ( A − C ) 2 + ( F − B ) 2 + ( F − C ) 2 4 D=\frac{\sqrt{(A-B)^2} + \sqrt{(A-C)^2} + \sqrt{(F-B)^2} + \sqrt{(F-C)^2}}{4} D=4(A−B)2+(A−C)2+(F−B)2+(F−C)2
最终得到如下两个类:
前面的每一步的计算结果以树状图的形式展现出来就是层次聚类树:
相关性聚类:
r x y r_{xy} rxy表示 x , y x,y x,y被分配在同一类中, P x y P_{xy} Pxy代表 x , y x,y x,y是同一类的概率(x,y之间的相似度), w + x y {w^+}_{xy} w+xy( = P x y =P_{xy} =Pxy)和 w − x y {w^-}_{xy} w−xy( = 1 − P x y = 1-P_{xy} =1−Pxy)分别是切断x,y之间的边的代价和保留边的代价。相关性聚类的目标就是使用最小的代价找到一个聚类方案:
min Σ r x y w − x y + ( 1 − r x y ) w + x y \min\Sigma r_{xy} {w^-}_{xy} + (1-r_{xy}){w^+}_{xy} minΣrxyw−xy+(1−rxy)w+xy
此处的最优化是一个NP-Hard问题,可以使用贪婪算法近似求解。
给出一个例子:下图中,实线表示两数据点有关系,将其归为一类,会给最终结果贡献 w − x y {w^-}_{xy} w−xy;虚线表示两数据点没有关系,将其归为一类,给最终结果贡献 w + x y {w^+}_{xy} w+xy。
从图中可以看出相关性聚类和最大流最小割类似;
相似度较高的,被切断的概率较低;
相似度较低的,被保留的概率较低。
Canopy + K-means:
Canopy聚类最大的特点是不需要事先指定k值 (即clustering的个数),经常将Canopy和K-means配合使用。
Canopy+K均值的流程图如下:
原始数据使用List来存储,也就是图中的小圆点。在算法的一开始,选定两个阈值T1(the loose distance)>T2(the tight distance)。
初始时,List中的每一个点都是一个Canopy类。
在基于知识表示学习的方法中,我们可以进行知识嵌入。将知识图谱中的实体和关系都映射低维空间向量,直接用数学表达式来计算各个实体之间相似度。这类方法不依赖任何的文本信息,获取到的都是数据的深度特征。知识嵌入可以使用前面介绍的TransE模型
在使用TransE模型之后我们可以得到实体与向量之间的关系来判断两个实体的关系,如:
在基于知识表示学习的实体相似度计算中,我们要考虑如何将两个知识图谱嵌入到同一个空间。其桥梁是预链接的实体对(训练数据,如使用一些开放知识图谱中的sameAS数据)。
主要的方法有两种:
在嵌入到同一个空间之后需要对实体进行连接,KG向量训练达到稳定状态之后,对于KG1每一个没有找到链接的实体,在KG2中找到与之距离最近的实体向量进行链接,距离计算方法可采用任何向量之间的距离计算,例如欧式距离或Cosine距离。
分块 (Blocking)是从给定的知识库中的所有实体对中,选出潜在匹配的记录对作为候选项,并将候选项的大小尽可能的缩小。
**动机:**为了使数据可以分而治之,使每一块较小的同时要保证覆盖率,让显然不需要链接的、不相关的实体排除在block外。为了在保证覆盖率的情况下来减少精确匹配的必要性。(有点难理解)
分块的方法:
负载均衡 (Load Balance)来保证所有块中的实体数目相当,从而保证分块对性能的提升程度。最简单的方法是多次Map-Reduce操作。
Falcon-AO是一个基于Java的自动本体匹配系统,已经成为RDF(S)和OWL所表达的Web本体相匹配的一种实用和流行的选择。其系统架构如下:
此处使用了四种匹配算法,V-Doc算法基于虚拟文档的语言学匹配,将实体及其周围的实体、文本等信息作为一个集合形成虚拟文档,然后可以使用如TF-IDF等算法进行操作。I-Sub算法是基于编辑距离的字符串匹配。GMO算法是基于本体RDF图结构的匹配。PMO算法是基于分而治之的大本体匹配。
Falcon-AO系统采用了相似度组合策略,如下所示,首先使用PMO进行分而治之,然后使用语言学算法(V-Doc、I-Sub)进行处理,然后使用结构学算法(GMO)接收前两者结果再做处理,最后连通前面两者的输出使用贪心算法进行选取。
A python library for accurate and scaleable fuzzy matching, record deduplication and entity-resolution
Limes是一个基于度量空间的实体匹配发现框架,适合于大规模数据链接,编程语言是Java。其整体框架如下:
接下来给出流程中的技术细节,首先给定源数据集S,目标数据集T,阈值θ。
从T中选取样本点E来代表T中数据。所谓样本点,也就是能代表距离空间的点。应该
在距离空间上均匀分布,各个样本之间距离尽可能大。
计算s ∈S与e ∈E之间的距离m(s, e),利用三角不等式进行过滤。
三角不等式过滤:
给定 ( A , m ) (A, m) (A,m), m m m是度量标准,相当于相似性函数, A A A中的点 x , y x,y x,y和 z z z相当于三条记录,根据三角不等式有:
m ( x , y ) ≤ m ( x , z ) + m ( z , y ) m(x, y) \le m(x, z) + m(z, y) m(x,y)≤m(x,z)+m(z,y)
上式通过推理可以得到:
m ( x , y ) − m ( y , z ) > θ → m ( x , z ) > θ m(x, y) - m(y, z) > \theta \rightarrow m(x, z) > \theta m(x,y)−m(y,z)>θ→m(x,z)>θ
y相当于样本点。因为样本点E的数量是远小于目标数据集T的数量,所以过滤这一步会急剧减少后续相似性比较的次数,因而对大规模的web数据,这是非常高效的算法。
推理式说明 m ( x , z ) > θ m(x, z) > \theta m(x,z)>θ的计算可以省去。
相似度计算见上
序列化: 存储为用户指定格式