文章首发于博客du_ok’s Notes,本文链接为知识图谱入门——知识融合
本文介绍了知识融合相关的技术和典型的知识融合工具。
知识融合相关概念
相关的术语:
- 知识融合 (Knowledge Fusion)
- 本体对齐 (Ontology Alignment)
- 本体匹配 (Ontology Matching)
- Record Linkage (传统数据库领域)
- Entity Resolution (传统数据库领域)
- 实体对齐 (Entity Alignment)
上面的术语的基本问题都是将来自多个来源的关于同一个实体或概念的描述信息融合起来。
本体对齐和本体匹配可认为是等价的,它们包含了概念层的融合
后面三个多指数据层的融合
知识融合目标是融合各个层面(概念层、数据层?)的知识,在合并两个知识图谱(本体)时,需要确认:
- 等价实例(数据层面)
- 等价类/子类
- 等啊几属性/子属性
数据层的融合:
上图是将猫王从YAGO和ElvisPedia进行融合的例子,在融合最主要的工作是实体的对齐,也就是找出等价实例,图中的sameAs就是融合的关键步骤。
知识图谱的构建中经常需要融合多种不同来源的数据:
概念层的融合:
知识融合还包括概念层的融合(包括跨语言的融合:如将中文医疗知识图谱与UMLS融合)
知识在线融合:
- 知识融合需要:
① 确定哪些会对齐在一起;
② 从不同地方抽取出来的数据的置信度是多少;
③ 这些置信度如何随着融合而合理的聚合。- 知识融合并不是合并两个知识图谱,而是发现两个知识图谱之间的等价实例、等价或为包含关系等概念或属性
知识融合的主要技术挑战:
- 数据质量的挑战
命名模糊,数据输入错误,数据丢失,数据格式不一致,缩写等 - 数据规模的挑战:
数据量大 (并行计算),数据种类多样性,不再仅仅通过名字匹配,多种关系,更多链接等
知识融合的基本技术流程
知识融合一般分为两步,本体对齐和实体匹配,它们的基本流程相似,如下:
数据预处理
数据预处理阶段,原始数据的质量会直接影响到最终链接的结果,不同的数据集对同一实体的描述方式往往是不相同的,对这些数据进行归一化处理是提高后续链接精确度的重要步骤。
- 语法正规化
- 语法匹配:联系电话的表示方法
- 综合属性: 家庭地址的表达方式
- 数据正规化
- 移除空格,《》,“”,-,等符号
- 输入错误类的拓扑错误
- 用正式名字替换昵称和缩写等
记录链接
假设两个实体的记录x和y,x和y在第i个属性上的值是xi
,yi,那么通过如下
两步进行记录链接:
- 属性相似度:
综合单个属性相似度得到属性相似度向量
[???(?1, ?1), ???(?2, ?2), … , ???(??, ??)] - 实体相似度:
根据属性相似度向量得到一个实体的相似度
属性相似度的计算
属性相似度的计算可以使用编辑距离(基于字符)、集合相似度计算和基于向量的相似度计算。
基于编辑距离
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∣
文本转换为集合:
- 使用符号分隔单词
- 使用n-gram分割单词,用n-gram分割句子来构建集合(如将Lvensshtain分割为{Lv}、{ve}…{in})
基于向量的相似度
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);表示学习。
基于聚合的方法
- 加权平均: w 1 ∗ s i m ( x 1 , y 1 ) + … + w N ∗ s i m ( x N , y N ) w_1 \ast sim(x_1, y_1) + \ldots + w_N \ast sim(x_N, y_N) w1∗sim(x1,y1)+…+wN∗sim(xN,yN)
- 手动制定规则: s i m ( x 1 , y 1 ) > T 1 a n d ( o r ) … s i m ( x i , y i ) > T i sim(x_1, y_1)>T1 \ \ and(or) \ \ldots \ sim(x_i, y_i) > T_i sim(x1,y1)>T1 and(or) … sim(xi,yi)>Ti
- 分类器:逻辑回归,决策树,SVM和条件随机场等
基于聚合方法存在的一些问题:(最关键的问题是需要生成训练集合)
- 训练集的生成
- 分类不均衡 (更多不匹配的记录对)
- 误分类
一些解决方案:
- 无监督/半监督 (EM,生成模型等)
- 主动学习 (众包等)
基于聚类的方法
层次聚类 (Hierarchical Clustering) :
通过计算不同类别数据点之间的相似度对在不同的层次的数据进行划分,最终形成树状(二叉树)的聚类结构。
底层的原始数据可以通过相似度函数计算,类之间的相似度有如下三种算法:
- SL(Single Linkage)算法
SL算法又称为最邻近算法 (nearest-neighbor),是用两个类数据点中距离最近的两个数据点间的相似度作为这两个类的距离。 - CL (Complete Linkage)算法
与SL不同的是取两个类中距离最远的两个点的相似度作为两个类的相似度。 - AL (Average Linkage)算法
用两个类中所有点之间相似度的均值作为类间相似度。
给出一个层次聚类的例子,由左图的数据,用欧氏距离和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类。
- 首先从集合选出一个点P,将其做第一个类的中心,并将这个点从List中删除,称其为Canopy1。(后续产生第i个类成为Canopyi)
- 接着对剩下集合的所有点计算到点P的distance。
- 将所有distance<T2的点都从集合List中删除,说明这些点离Canopy1已经足够近,避免重复加入到其他Canopy。
- 将所有distance<T1的点都对到以P为中心的Canopy1中,若点i的distance>T1,则将其作为第i个类Canopyi;
- 对List重复步骤1-4知道List为空,则可以形成多个Canopy类。
基于知识表示学习
在基于知识表示学习的方法中,我们可以进行知识嵌入。将知识图谱中的实体和关系都映射低维空间向量,直接用数学表达式来计算各个实体之间相似度。这类方法不依赖任何的文本信息,获取到的都是数据的深度特征。知识嵌入可以使用前面介绍的TransE模型
在使用TransE模型之后我们可以得到实体与向量之间的关系来判断两个实体的关系,如:
在基于知识表示学习的实体相似度计算中,我们要考虑如何将两个知识图谱嵌入到同一个空间。其桥梁是预链接的实体对(训练数据,如使用一些开放知识图谱中的sameAS数据)。
主要的方法有两种:
- 联合知识嵌入:将两个KG的三元组糅合在一起共同训练,并将预链接实体对视为具有SameAS关系的三元组,从而对两个KG的空间进行约束。(实现:Hao Zhu et al. Iterative Entity Alignment via Knowledge Embeddings, IJCAI 2017)
- 双向监督训练:两个KG单独进行训练,使用预链接数据交替进行监督。
在嵌入到同一个空间之后需要对实体进行连接,KG向量训练达到稳定状态之后,对于KG1每一个没有找到链接的实体,在KG2中找到与之距离最近的实体向量进行链接,距离计算方法可采用任何向量之间的距离计算,例如欧式距离或Cosine距离。
分块
分块 (Blocking)是从给定的知识库中的所有实体对中,选出潜在匹配的记录对作为候选项,并将候选项的大小尽可能的缩小。
**动机:**为了使数据可以分而治之,使每一块较小的同时要保证覆盖率,让显然不需要链接的、不相关的实体排除在block外。为了在保证覆盖率的情况下来减少精确匹配的必要性。(有点难理解)
分块的方法:
- 对于记录x,有
h
a
s
h
(
x
)
=
h
i
hash(x)=h_i
hash(x)=hi,则x映射到与关键字
h
i
h_i
hi绑定的块
C
i
C_i
Ci上。
常见的hash函数:字符串的前n个字;n-grams;结合多个简单的hash函数等 - 邻近分类:Canopy聚类;排序邻居算法;Red-Blue Set Cover
负载均衡
负载均衡 (Load Balance)来保证所有块中的实体数目相当,从而保证分块对性能的提升程度。最简单的方法是多次Map-Reduce操作。
结果评估
- 准确率,召回率,F值
- 整个算法的运行时间
典型知识融合的工具
本体匹配(本体对齐)工具——Falcon-AO
Falcon-AO是一个基于Java的自动本体匹配系统,已经成为RDF(S)和OWL所表达的Web本体相匹配的一种实用和流行的选择。其系统架构如下:
此处使用了四种匹配算法,V-Doc算法基于虚拟文档的语言学匹配,将实体及其周围的实体、文本等信息作为一个集合形成虚拟文档,然后可以使用如TF-IDF等算法进行操作。I-Sub算法是基于编辑距离的字符串匹配。GMO算法是基于本体RDF图结构的匹配。PMO算法是基于分而治之的大本体匹配。
Falcon-AO系统采用了相似度组合策略,如下所示,首先使用PMO进行分而治之,然后使用语言学算法(V-Doc、I-Sub)进行处理,然后使用结构学算法(GMO)接收前两者结果再做处理,最后连通前面两者的输出使用贪心算法进行选取。
- 语言学可比性
- 语言学算法找到的映射单元数目对比本体概念数目
- 结构可比性
- 本体间使用的原语的数目对比
- 映射单元集成
- 语言学可比性和结构可比性分别分为高、中、低档
- 映射单元选取算法
- 贪心选取
实体匹配工具——Dedupe
A python library for accurate and scaleable fuzzy matching, record deduplication and entity-resolution
- 指定谓词集合&相似度函数(这一部主要是属性的定义)
Dedupe的输入需要指定属性的类型,在内部为给每个属性类型指定一个谓词集合以及相似度计算方法。
下图是对 ‘比尔盖茨’的’name’属性的简单描述,将每个属性都映射上去,会形成一个大的谓词集合。
- 训练Blocking :通过 Red-Blue set cover 找到最优谓词集合来分块。
最优谓词集合至少能覆盖95% (可以指定)的正样本对,负样本对被误分到同一个block中越少越好。
- 训练逻辑回归 (LR)模型
使用用户标记的正负样本对训练LR模型,来进行分类。LR不能确定的会返回给用户进行标注(Active Learning)。
实体匹配工具——Limes
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)>θ的计算可以省去。
相似度计算和序列化
相似度计算见上
序列化: 存储为用户指定格式
实体匹配工具——Silk
- 预处理: 会将索引的结果排名前N的记录下来进行作为候选对,进行下一步更精准的匹配 (损失精度)。
- 相似度计算: 里面包含了很多相似度计算的方法。
- 过滤: 过滤掉相似度小于给定阈值的记录对。