知识库构建:Freebase、Wikidata简介、如何构建领域知识库、知识库对齐技术

大家好,我是你们的老朋友。今天我们来聊聊关系抽取里一个绕不开的话题——知识库构建。

说实话,我刚入行那会儿,总觉得关系抽取就是调模型、刷榜单。后来在工业界做项目才发现,没有高质量的知识库,再牛的模型也是空中楼阁。你想想看,远程监督的核心假设是什么?就是利用已有知识库去自动标注文本。知识库要是歪了,标注出来的数据能靠谱吗?

一、通用知识库:Freebase 与 Wikidata

先说说两个最出名的通用知识库。我当年做实体链接时,跟它们打过不少交道。

1. Freebase

Freebase 曾经是知识图谱界的扛把子。它由 Metaweb 公司创建,后来被 Google 收购,最终在 2016 年正式关闭,数据迁移到了 Wikidata。

它的核心特点:

  • 三元组结构:(实体, 属性, 值) 或 (实体, 关系, 实体)
  • 类型系统:每个实体都有一个 /type/object/type 属性
  • 唯一标识:每个实体用 MID(Machine ID)标识,比如 /m/0c6m

我记得有一次做远程监督数据生成,直接拿 Freebase 的 dump 文件来用。结果发现一个问题——Freebase 的关系定义太细了。比如“出生地”这个关系,它分成了 /people/person/place_of_birth、/people/deceased_person/place_of_birth 等好几种。这导致标注时很多文本匹配不上。

我的经验:用 Freebase 做远程监督时,建议先做关系映射。把细粒度的关系合并成粗粒度关系,能显著提升召回率。

2. Wikidata

Wikidata 是 Freebase 的继承者,由 Wikimedia 基金会维护。它现在是最大的开放知识库之一。

它的核心特点:

  • Q 编号:实体用 Q 编号,比如 Q42 是 Douglas Adams
  • P 编号:属性用 P 编号,比如 P569 是出生日期
  • 多语言支持:天然支持多语言标签和描述
  • 版本控制:每次修改都有记录,可回溯

我个人更喜欢用 Wikidata。为什么?因为它有丰富的属性约束。比如“出生地”这个属性,它规定了值必须是“地点”类型的实体。这在做远程监督时能帮我们过滤掉很多噪声。

避坑指南:我曾经直接用 Wikidata 的 SPARQL 端点查询,结果被限流了。后来改用离线 dump 文件,本地建索引,速度快了不止一个量级。

二、如何构建领域知识库

通用知识库虽好,但很多场景下我们需要构建领域知识库。比如金融领域的公司关系、医疗领域的药物相互作用等。

构建领域知识库,我一般分三步走:

  1. 数据采集:从结构化数据源(数据库、Excel)和非结构化数据源(文档、网页)中提取
  2. 实体识别:用命名实体识别(NER)技术抽取出领域实体
  3. 关系抽取:用规则或模型抽取实体间的关系

这里我重点说说数据采集这一步。很多人一上来就爬网页,结果数据质量很差。我的习惯是:

  • 优先找结构化数据:比如行业数据库、政府公开数据、企业年报
  • 次选半结构化数据:比如维基百科的信息框(Infobox)、JSON 格式的 API 返回
  • 最后才考虑纯文本:需要做大量的清洗和标注

举个例子,我之前做金融知识库时,直接从证监会官网下载上市公司年报。年报里有结构化的“关联交易”表格,直接解析就能拿到“子公司-母公司”关系。这比从文本里抽要靠谱得多。

注意:领域知识库的构建一定要有领域专家参与。我见过太多工程师自己拍脑袋定义关系,结果做出来的知识库根本没法用。专家能帮你定义哪些关系是重要的,哪些是冗余的。

三、知识库对齐技术

知识库对齐,说白了就是把不同来源的知识库合并成一个。比如你有一个中文的金融知识库,还有一个英文的 Wikidata,怎么把它们对齐?

对齐的核心任务有两个:

  • 实体对齐:判断两个实体是否指向同一个真实世界对象
  • 关系对齐:判断两个关系是否语义等价

1. 实体对齐

实体对齐的方法,我总结为三代:

代际 方法 特点
第一代 基于字符串匹配 简单快速,但无法处理别名、缩写
第二代 基于属性相似度 利用属性值(如出生日期、国籍)做匹配
第三代 基于图嵌入 利用知识图谱的结构信息做匹配

我个人最常用的是混合方法。先用字符串匹配快速过滤,再用图嵌入做精细匹配。这样既保证了速度,又保证了准确率。

实战技巧:做实体对齐时,别忘了利用外部知识。比如对齐两个公司实体时,可以查工商注册号、统一社会信用代码。这些唯一标识符比任何算法都靠谱。

2. 关系对齐

关系对齐比实体对齐更难。为什么?因为同一个关系在不同知识库里可能有不同的名字。比如“出生地”在 Freebase 里叫 /people/person/place_of_birth,在 Wikidata 里叫 P19。

我的做法是:

  • 基于标签匹配:利用关系的标签(如“出生地”、“place of birth”)做字符串匹配
  • 基于属性约束:比较关系的定义域和值域。如果两个关系的定义域和值域都相似,那它们很可能等价
  • 基于实例验证:随机抽取一些实体对,看两个关系是否同时成立

嗯,这里要注意一点:关系对齐不是一次性的工作。随着知识库的更新,之前对齐的关系可能不再成立。我建议定期做重新对齐,比如每季度一次。

四、知识库构建的整体流程

说了这么多,我画了一张图来总结知识库构建的整体流程。这张图是我做项目时常用的框架,希望能帮你理清思路。

知识库构建整体流程 数据采集 结构化 / 半结构化 / 非结构化 实体识别 NER / 词典匹配 关系抽取 规则 / 模型 知识库对齐 实体对齐 + 关系对齐 知识库存储 图数据库 / 关系型数据库 应用:远程监督 / 问答 / 推荐

这张图展示了我做知识库构建时的标准流程。从数据采集开始,到实体识别、关系抽取,再到知识库对齐和存储,最后应用到远程监督等任务中。每一步都有坑,每一步也都有技巧。

我的建议:刚开始做知识库构建时,别追求大而全。先做一个小规模、高质量的知识库,验证流程没问题了,再考虑扩展。我见过太多人一上来就想做百万级知识库,结果数据质量一塌糊涂,后面全白干。

好了,关于知识库构建的内容就聊到这里。记住一句话:知识库是远程监督的基石。花时间把知识库做好,后面的工作会轻松很多。


专注资料整理