📑 查看全课大纲(第 20 / 26 节)
- 1.知识图谱和语音技术概述
- 2.典型知识库项目简介
- 3.知识图谱技术概览
- 4.典型应用案例
- 5.早期知识表示简介
- 6.基于语义网的知识表示框架
- 7.典型知识库项目的知识表示
- 8.基于本体工具的知识建模实践
- 9.面向非结构化数据的知识抽取
- 10.面向结构化数据的知识抽取
- 11.面向半结构化数据的知识抽取
- 12.实践:基于百科数据的知识抽取
- 13.面向文本的知识抽取
- 14.知识挖掘
- 15.从一个例子开始
- 16.图数据库介绍
- 17.什么是知识融合
- 18.知识融合的基本技术流程
- 19.典型知识融合工具简介
- 20.典型案例简介
- 21.LIMES实战演练
- 22.知识推理
- 23.语义搜索
- 24.知识问答
- 25.IBM watson Lite
- 26.行业知识图谱应用
典型案例简介
约 14 分钟
知识融合典型案例:Zhishi.me与OpenKG
小象实战讲义 · 知识图谱
在掌握了知识融合的基本概念与技术流程后,本节将通过两个典型项目案例,深入理解实体对齐在实际大规模知识图谱构建中的应用。我们将剖析Zhishi.me如何利用半监督方法自动发现跨百科的实体匹配规则,并了解OpenKG如何将多个中文百科知识库进行链接,形成更丰富的关联数据网络。
💡 核心导读
- Zhishi.me 的实体对齐:学习如何通过半监督的EM算法,从少量种子匹配对中自动学习判别性规则,并迭代生成更多高置信度的实体对齐结果。
- 关联规则挖掘的应用:了解如何将知识挖掘中的频繁项集挖掘(如Apriori算法)应用于发现等价属性对,从而构建匹配规则。
- OpenKG 链接百科:认识中文开放知识图谱社区如何将Zhishi.me、CN-DBpedia、PKUBase、Belief Engine等多个百科类知识库进行链接,形成大规模关联数据。
- 融合的挑战与持续性:理解知识融合并非一劳永逸,实体对齐后仍会面临属性值冲突等问题,需要持续迭代与人工审核。
Zhishi.me:基于半监督学习的跨百科实体对齐
Zhishi.me是国内首个大规模中文语义数据集,旨在将百度百科、互动百科和中文维基百科的数据进行关联,形成中文链接开放数据(CLOD)。其核心挑战在于解决跨数据源的实体对齐问题。
问题定义:等价实体的识别
不同百科对同一实体的描述方式存在差异。例如,对于“大熊猫”这一实体:
- 百度百科使用属性
baidu:标签存储“大熊猫”,baidu:拉丁学名存储“Ailuropoda melanoleuca”。 - 互动百科使用属性
hudong:中文学名存储“大熊猫”,hudong:二名法存储“Ailuropoda melanoleuca”。
虽然人类可以轻易判断它们是同一实体,但计算机需要通过学习来识别 baidu:标签 与 hudong:中文学名 是等价属性,baidu:拉丁学名 与 hudong:二名法 是等价属性。
# 示例:不同知识库对同一实体的描述差异(RDF 数据示意)
# RDF 三元组示意:同一实体在不同百科中的描述
# 百度百科中的“大熊猫”实体
<http://zhishi.me/baidubaike/resource/大熊猫>
<http://zhishi.me/baidubaike/property/标签> "大熊猫" ;
<http://zhishi.me/baidubaike/property/拉丁学名> "Ailuropoda melanoleuca" ;
<http://zhishi.me/baidubaike/property/纲> <http://zhishi.me/baidubaike/resource/哺乳纲> .
# 互动百科中的“大熊猫”实体
<http://zhishi.me/hudongbaike/resource/大熊猫>
<http://zhishi.me/hudongbaike/property/中文学名> "大熊猫" ;
<http://zhishi.me/hudongbaike/property/二名法> "Ailuropoda melanoleuca" ;
<http://zhishi.me/hudongbaike/property/纲> <http://zhishi.me/hudongbaike/resource/哺乳纲> .
# 目标:发现等价关系
@prefix owl: <http://www.w3.org/2002/07/owl#> .
<http://zhishi.me/baidubaike/resource/大熊猫> owl:sameAs <http://zhishi.me/hudongbaike/resource/大熊猫> .解决方案:迭代式规则学习与EM算法
Zhishi.me采用一种半监督的包装器(Wrapper)算法,其核心思想是通过迭代方式自动发现并修正匹配规则。流程如下图所示:
初始化种子匹配对 (Seeds)
↓
挖掘等价属性 (通过关联规则挖掘)
↓
生成匹配规则 (如: IF A.p1=B.p1 AND A.p2=B.p2 THEN A≈B)
↓
应用规则生成候选匹配对
↓
计算候选对的置信度 (Combiner)
↓
EM迭代优化 (E-step: 估计缺失数据; M-step: 最大化似然)
↓
输出高置信度匹配对1. 挖掘等价属性(关联规则挖掘)
首先,从已知的种子匹配对中,提取所有属性值相同的属性对,形成事务表(Transaction Table)。
# 模拟从种子匹配对中提取等价属性对的过程
import itertools
# 假设已有3个已知的匹配实体对及其属性值
seed_matches = [
{
'baidu': {'标签': '大熊猫', '拉丁学名': 'Ailuropoda melanoleuca', '纲': '哺乳纲'},
'hudong': {'中文学名': '大熊猫', '二名法': 'Ailuropoda melanoleuca', '纲': '哺乳纲'}
},
{
'baidu': {'标签': '白鳍豚', '拉丁学名': 'Lipotes vexillifer', '纲': '哺乳纲'},
'hudong': {'中文学名': '白鳍豚', '二名法': 'Lipotes vexillifer', '纲': '哺乳纲'}
},
{
'baidu': {'标签': '桂花', '拉丁学名': 'Osmanthus fragrans', '纲': '双子叶植物纲'},
'hudong': {'中文学名': '桂花', '二名法': 'Osmanthus fragrans', '纲': '双子叶植物纲'}
}
]
# 找出所有值相同的属性对
equivalent_pairs = []
for match in seed_matches:
baidu_props = match['baidu']
hudong_props = match['hudong']
# 遍历所有属性组合,找出值相同的对
for b_prop, b_value in baidu_props.items():
for h_prop, h_value in hudong_props.items():
if b_value == h_value:
equivalent_pairs.append((f'baidu:{b_prop}', f'hudong:{h_prop}'))
# 统计频繁出现的属性对(简化版,实际使用Apriori等算法)
from collections import Counter
pair_counts = Counter(equivalent_pairs)
print("频繁属性对统计:")
for pair, count in pair_counts.most_common():
print(f" {pair[0]} ↔ {pair[1]}: {count}次")2. 生成匹配规则(频繁项集挖掘)
基于频繁出现的属性对,可以形成匹配规则。例如,如果发现以下属性对经常同时出现:
baidu:标签=hudong:中文学名baidu:拉丁学名=hudong:二名法baidu:纲=hudong:纲
则可以生成规则:如果实体A和实体B在这三个属性上的值都相等,那么它们很可能是等价实体。
3. EM算法迭代优化
整个流程封装在EM(期望最大化)算法框架中:
- E-step(期望步):使用当前估计的匹配规则和参数,评估未标记数据(未匹配实体对)成为匹配对的可能性。
- M-step(最大化步):基于当前对缺失数据的估计,通过最大化似然函数来更新匹配规则的参数(如置信度)。
似然函数设计的关键洞见:假设每个知识库内部没有重复实体(通过URI唯一标识),那么一个实体在另一个知识库中最多有一个等价实体。因此,错误的匹配会导致“一对多”的映射,这与假设矛盾。据此定义似然比 P = 连通分量数 / 匹配边数:正确的一对一匹配中每条边各自成一个连通分量,P = 4/4 = 1;一旦出现一对多(一个实体连到多个等价实体),多条边挤进同一个连通分量,P 就降到 2/4 = 0.5。最大化 P,理想值接近 1;P 越低于 1,说明一对多的错误映射越多。
# 简化版EM算法思想演示(非完整实现)
def likelihood_ratio(matches, entities_a, entities_b):
"""
计算匹配结果的似然比
理想情况:连通分量数/边数 ≈ 1(一对一=1,一对多<1)
"""
# 构建二部图(简化表示)
edges = len(matches)
# 计算连通分量(简化:假设没有一对多映射)
# 实际算法需要处理复杂的图结构
connected_components = min(len(set([m[0] for m in matches])),
len(set([m[1] for m in matches])))
if connected_components == 0:
return 0
# P = 连通分量数 / 边数:最大化它(一对一=1,一对多<1),与课件 P96 的 P=4/4=1、P=2/4=0.5 一致
return connected_components / edges
# 示例:好的匹配 vs 差的匹配
good_matches = [('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')] # 一对一映射
bad_matches = [('A1', 'B1'), ('A1', 'B2'), ('A2', 'B1'), ('A2', 'B2')] # 多对多映射
print(f"好匹配的似然比: {likelihood_ratio(good_matches, ['A1','A2','A3'], ['B1','B2','B3']):.2f}")
print(f"差匹配的似然比: {likelihood_ratio(bad_matches, ['A1','A2'], ['B1','B2']):.2f}")评估结果与实际效果
Zhishi.me的实验表明:
- 高准确率:只需少量种子数据(少量已知匹配对),就能达到很高的准确率(约97%)。
- 发现新匹配:算法能够发现大量未在种子数据中出现的新匹配对,与人工标注的匹配对有较好的互补性。
- 可扩展性:方法适用于大规模知识库的实体对齐。
OpenKG链接百科:多源中文知识库融合实践
OpenKG(开放知识图谱)社区致力于构建和链接中文知识图谱。其“链接百科”项目将多个百科类知识库进行实体对齐,包括:
- Zhishi.me:融合百度百科、互动百科、中文维基百科
- CN-DBpedia:复旦大学知识工场构建,主要基于百度百科
- PKUBase(PKU-PIE):北京大学构建的百科知识库
- Belief Engine:中国科学院基于互动百科构建
链接规模与重叠分析
根据OpenKG发布的数据,各知识库间的链接数量如下表所示:
| 知识库 | 实体数 | 与CN-DBpedia链接数 | 与Zhishi.me链接数 | 与PKUBase链接数 | 与Belief Engine链接数 |
|---|---|---|---|---|---|
| CN-DBpedia | 16,546,273 | - | 5,393,835 | 6,347,721 | 1,538,865 |
| Zhishi.me | 10,337,505 | 5,393,835 | - | 5,687,428 | 697,123 |
| PKUBase | 11,554,258 | 6,347,721 | 5,687,428 | - | 552,066 |
| Belief Engine | 1,423,828 | 1,538,865 | 697,123 | 552,066 | - |
从数据可以看出:
- CN-DBpedia与PKUBase的重叠度最高(约23.5%的CN-DBpedia实体被链接到PKUBase),因为它们都主要基于百度百科。
- Belief Engine与其他知识库的重叠度相对较低,因为它主要基于互动百科,且数据规模较小。
- Zhishi.me作为跨百科融合项目,与各个知识库都有较高的链接数。
链接方法的技术细节
不同知识库对之间采用了不同的链接策略:
基础方法:实体名严格匹配
- 对中文维基百科进行繁简转换后,进行实体名严格匹配
- 利用Wikidata扩展别名,提高匹配召回率
CN-DBpedia与Zhishi.me的链接
- 使用CN-DBpedia中具有别名含义的属性(如
alternativeName)扩充实体别名 - 进行繁简转换与别名扩充后的严格匹配(把别名集合一并纳入后仍用精确相等判断,并非模糊匹配)
- 使用CN-DBpedia中具有别名含义的属性(如
PKUBase的链接
- 由于PKUBase没有可用的别名属性,主要依赖实体名严格匹配
- 受严格匹配所限,自动链接的召回并不充分(约23.5%的CN-DBpedia实体被链接到PKUBase);但因二者名称重合度高,这一对仍是链接规模最大的(见上“重叠度最高”)
Belief Engine的链接
- 使用互动百科的唯一”article title”与Zhishi.me中的互动百科实体进行直接链接
- 这种方法简单直接,但仅限于与互动百科相关的实体
# 模拟不同链接策略的简单实现
def strict_name_match(entity_a, entity_b):
"""实体名严格匹配"""
return entity_a['name'].lower() == entity_b['name'].lower()
def alias_match(entity_a, entity_b, alias_prop='aliases'):
"""考虑别名的匹配"""
if strict_name_match(entity_a, entity_b):
return True
# 检查别名是否匹配
aliases_a = entity_a.get(alias_prop, [])
aliases_b = entity_b.get(alias_prop, [])
# 双向检查:A的别名是否匹配B的本名,或B的别名是否匹配A的本名
if any(alias.lower() == entity_b['name'].lower() for alias in aliases_a):
return True
if any(alias.lower() == entity_a['name'].lower() for alias in aliases_b):
return True
# 检查别名之间是否匹配
for alias_a in aliases_a:
for alias_b in aliases_b:
if alias_a.lower() == alias_b.lower():
return True
return False
# 示例实体
entity_cn = {'name': '北京大学', 'aliases': ['北大', '燕园']}
entity_pku = {'name': '北大', 'aliases': ['北京大学']}
entity_zhishi = {'name': '北京大学', 'aliases': ['PKU']}
print(f"CN-DBpedia与PKUBase严格匹配: {strict_name_match(entity_cn, entity_pku)}")
print(f"CN-DBpedia与PKUBase别名匹配: {alias_match(entity_cn, entity_pku)}")
print(f"CN-DBpedia与Zhishi.me严格匹配: {strict_name_match(entity_cn, entity_zhishi)}")知识融合的持续挑战
即使完成了实体对齐,知识融合的工作远未结束:
- 属性值冲突:不同知识库对同一属性的值可能不同。例如,一个城市的”市花”属性,不同百科可能有不同记载。
- 数据质量差异:各知识库的数据完整性、准确性不一致,需要冲突检测与解决策略。
- 动态更新:知识库不断更新,需要持续同步与重新对齐。
# 示例:属性值冲突检测
def detect_conflicts(entity_a, entity_b, functional_properties):
"""检测功能属性(functional property)的冲突"""
conflicts = []
for prop in functional_properties:
if prop in entity_a and prop in entity_b:
if entity_a[prop] != entity_b[prop]:
conflicts.append({
'property': prop,
'value_a': entity_a[prop],
'value_b': entity_b[prop]
})
return conflicts
# 功能属性示例:一个城市只能有一个市花
city_a = {'name': '北京市', '市花': '月季'}
city_b = {'name': '北京', '市花': '菊花'}
functional_props = ['市花'] # 功能属性:值应唯一
conflicts = detect_conflicts(city_a, city_b, functional_props)
print("检测到的冲突:")
for conflict in conflicts:
print(f" 属性'{conflict['property']}': {conflict['value_a']} vs {conflict['value_b']}")📝 动手练一练
概念辨析:Zhishi.me使用的EM算法与传统的监督学习实体对齐方法相比,主要优势是什么?在什么场景下更适合使用这种半监督方法?
实践思考:假设你需要将两个电影知识库进行实体对齐,一个包含IMDb数据,另一个包含豆瓣电影数据。你会设计哪些匹配规则?考虑哪些属性可能具有判别性?
👉 点击查看参考答案
1. 概念辨析参考答案:
- 传统监督学习需要大量标注数据,成本高,且标注数据可能无法覆盖所有实体类型。
- EM算法的优势:只需要少量种子匹配对,通过迭代可以自动发现更多匹配规则和匹配对,适合标注数据稀缺的场景。特别适用于大规模知识库,其中人工标注所有匹配对是不现实的。
- 适用场景:数据规模大、标注成本高、但数据本身存在一定规律性(如百科数据的结构化属性)的场景。
2. 实践思考参考答案: 可能的匹配规则和判别性属性:
- 核心属性:电影名称(需处理翻译差异)、上映年份、导演、主要演员
- 辅助属性:片长、制片国家/地区、IMDb编号(如果一方有)
- 匹配规则示例:
# 伪代码规则
IF (电影名称相似度 > 0.9)
AND (上映年份差值 ≤ 1)
AND (导演姓名匹配 OR 至少2名主要演员匹配)
THEN 认为是同一部电影- 挑战:中文译名差异(如”The Shawshank Redemption” vs “肖申克的救赎” vs “刺激1995”)、演员名字格式差异等。
本章小结
本节通过Zhishi.me和OpenKG链接百科两个典型案例,深入探讨了知识融合在实际项目中的应用:
Zhishi.me展示了半监督实体对齐的完整流程:从少量种子匹配出发,通过关联规则挖掘发现等价属性,构建匹配规则,再利用EM算法迭代优化,最终实现高准确率的跨百科实体对齐。
OpenKG链接百科体现了社区协作的价值:通过将多个中文百科知识库进行链接,形成了更丰富、更完整的知识网络,为中文语义Web应用提供了基础数据支持。
知识融合是持续过程:实体对齐只是第一步,后续还需要处理属性值冲突、数据质量不一致等问题,需要结合冲突检测、众包审核、主动学习等技术持续优化。
📋 行动清单
学完本节后,你可以立即:
- 访问OpenKG数据集:浏览 http://openkg.cn/dataset/links-encyclopedia,了解实际链接数据的具体格式和规模。
- 尝试简单实体匹配:使用Python的
difflib或jellyfish库,对两组电影/书籍名称进行简单的字符串相似度匹配实验。 - 思考你所在领域的融合问题:如果你正在处理某个垂直领域的数据,思考如何设计该领域的实体对齐规则,哪些属性最具判别性。
—— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问