📑 查看全课大纲(第 20 / 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的实验表明:

  1. 高准确率:只需少量种子数据(少量已知匹配对),就能达到很高的准确率(约97%)。
  2. 发现新匹配:算法能够发现大量未在种子数据中出现的新匹配对,与人工标注的匹配对有较好的互补性。
  3. 可扩展性:方法适用于大规模知识库的实体对齐。

OpenKG链接百科:多源中文知识库融合实践

OpenKG(开放知识图谱)社区致力于构建和链接中文知识图谱。其“链接百科”项目将多个百科类知识库进行实体对齐,包括:

  • Zhishi.me:融合百度百科、互动百科、中文维基百科
  • CN-DBpedia:复旦大学知识工场构建,主要基于百度百科
  • PKUBase(PKU-PIE):北京大学构建的百科知识库
  • Belief Engine:中国科学院基于互动百科构建

链接规模与重叠分析

根据OpenKG发布的数据,各知识库间的链接数量如下表所示:

知识库实体数与CN-DBpedia链接数与Zhishi.me链接数与PKUBase链接数与Belief Engine链接数
CN-DBpedia16,546,273-5,393,8356,347,7211,538,865
Zhishi.me10,337,5055,393,835-5,687,428697,123
PKUBase11,554,2586,347,7215,687,428-552,066
Belief Engine1,423,8281,538,865697,123552,066-

从数据可以看出:

  1. CN-DBpedia与PKUBase的重叠度最高(约23.5%的CN-DBpedia实体被链接到PKUBase),因为它们都主要基于百度百科。
  2. Belief Engine与其他知识库的重叠度相对较低,因为它主要基于互动百科,且数据规模较小。
  3. Zhishi.me作为跨百科融合项目,与各个知识库都有较高的链接数。

链接方法的技术细节

不同知识库对之间采用了不同的链接策略:

  1. 基础方法:实体名严格匹配

    • 对中文维基百科进行繁简转换后,进行实体名严格匹配
    • 利用Wikidata扩展别名,提高匹配召回率
  2. CN-DBpedia与Zhishi.me的链接

    • 使用CN-DBpedia中具有别名含义的属性(如alternativeName)扩充实体别名
    • 进行繁简转换与别名扩充后的严格匹配(把别名集合一并纳入后仍用精确相等判断,并非模糊匹配)
  3. PKUBase的链接

    • 由于PKUBase没有可用的别名属性,主要依赖实体名严格匹配
    • 受严格匹配所限,自动链接的召回并不充分(约23.5%的CN-DBpedia实体被链接到PKUBase);但因二者名称重合度高,这一对仍是链接规模最大的(见上“重叠度最高”)
  4. 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)}")

知识融合的持续挑战

即使完成了实体对齐,知识融合的工作远未结束:

  1. 属性值冲突:不同知识库对同一属性的值可能不同。例如,一个城市的”市花”属性,不同百科可能有不同记载。
  2. 数据质量差异:各知识库的数据完整性、准确性不一致,需要冲突检测与解决策略。
  3. 动态更新:知识库不断更新,需要持续同步与重新对齐。
# 示例:属性值冲突检测
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']}")

📝 动手练一练

  1. 概念辨析:Zhishi.me使用的EM算法与传统的监督学习实体对齐方法相比,主要优势是什么?在什么场景下更适合使用这种半监督方法?

  2. 实践思考:假设你需要将两个电影知识库进行实体对齐,一个包含IMDb数据,另一个包含豆瓣电影数据。你会设计哪些匹配规则?考虑哪些属性可能具有判别性?

👉 点击查看参考答案

1. 概念辨析参考答案:

  • 传统监督学习需要大量标注数据,成本高,且标注数据可能无法覆盖所有实体类型。
  • EM算法的优势:只需要少量种子匹配对,通过迭代可以自动发现更多匹配规则和匹配对,适合标注数据稀缺的场景。特别适用于大规模知识库,其中人工标注所有匹配对是不现实的。
  • 适用场景:数据规模大、标注成本高、但数据本身存在一定规律性(如百科数据的结构化属性)的场景。

2. 实践思考参考答案: 可能的匹配规则和判别性属性:

  • 核心属性:电影名称(需处理翻译差异)、上映年份、导演、主要演员
  • 辅助属性:片长、制片国家/地区、IMDb编号(如果一方有)
  • 匹配规则示例
  # 伪代码规则
  IF (电影名称相似度 > 0.9) 
     AND (上映年份差值 ≤ 1)
     AND (导演姓名匹配 OR 至少2名主要演员匹配)
  THEN 认为是同一部电影
  • 挑战:中文译名差异(如”The Shawshank Redemption” vs “肖申克的救赎” vs “刺激1995”)、演员名字格式差异等。

本章小结

本节通过Zhishi.me和OpenKG链接百科两个典型案例,深入探讨了知识融合在实际项目中的应用:

  1. Zhishi.me展示了半监督实体对齐的完整流程:从少量种子匹配出发,通过关联规则挖掘发现等价属性,构建匹配规则,再利用EM算法迭代优化,最终实现高准确率的跨百科实体对齐。

  2. OpenKG链接百科体现了社区协作的价值:通过将多个中文百科知识库进行链接,形成了更丰富、更完整的知识网络,为中文语义Web应用提供了基础数据支持。

  3. 知识融合是持续过程:实体对齐只是第一步,后续还需要处理属性值冲突、数据质量不一致等问题,需要结合冲突检测、众包审核、主动学习等技术持续优化。

📋 行动清单

学完本节后,你可以立即:

—— 小象教研组

配套学习资源与课件
  • 第6章课件:知识融合
    下载
  • 知识图谱课程思维导图(KG_Centralized.xmind 全课程结构图)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问