news 2026/10/3 2:01:31

AI-For-Beginners 第 2 课实践:使用 Protégé 构建你自己的领域本体(Ontology)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI-For-Beginners 第 2 课实践:使用 Protégé 构建你自己的领域本体(Ontology)
  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

本指南围绕 AI-For-Beginners 课程第 2 课《Knowledge Representation and Expert Systems》(知识表示与专家系统)的课后作业展开:选择一个主题(人、地点或事物),运用本课讲授的建模策略,用 Protégé 亲手构建一个领域本体。你将掌握知识表示的核心手段(对象-属性-值三元组、框架层次、产生式规则、描述逻辑),理解本体在语义网(RDF/OWL)中的表达方式,并能在仓库现成的家族本体与动物专家系统示例之上,独立完成一个可推理、可查询的本体工程。

图片出处:lessons/2-Symbolic/images/protege.png,即第 2 课 README 中展示的 Protégé 编辑器截图。

一、任务概览:从“知识库”到“本体”

lessons/2-Symbolic/assignment.md 给出的作业核心是一句话:构建一个本体(Ontology)。所谓构建知识库,本质是对"描述某个主题事实的模型"进行分类。具体要求可以拆解为四步:

  1. 选题:选择一个主题——可以是人、地点或事物;
  2. 建模:为该主题建立一个模型,覆盖它的关键事实与分类;
  3. 套用技法:使用本课讲解的知识表示技术(三元组、框架、层次结构、产生式规则等)与建模策略;
  4. 工具落地:使用 Protégé(斯坦福大学开源本体编辑器)把模型落地成可编辑、可推理的本体文件。

作业给出的示例是"构建一个客厅的本体":包含家具、灯具等个体(individuals)。但真正的难点在作业中连续抛出的三个问题——客厅与厨房有何区别?与浴室有何区别?你怎么知道它是客厅而不是餐厅?这三个问题本质上是在追问:本体中"类(Class)"的界定依据是什么,你用什么属性(property)与约束(restriction)来区分不同类。这正对应本课 README 中反复出现的核心概念:知识表示不是把数据堆进电脑,而是"找到某种有效方式,把知识以数据形式表示在计算机中,使其可被自动使用"(见 lessons/2-Symbolic/README.md)。

二、动手前的知识储备:本课的四种建模策略

在打开 Protégé 之前,先明确你要用哪些"表示法"来建模。第 2 课 README 把计算机知识表示归纳为四大类,它们都是你本体里的"原材料":

1. 网络表示:对象-属性-值三元组(OAV Triplets)

语义网络可以用三元组<对象, 属性, 值>的列表来表示,这也是语义网一切表示的基础。README 以编程语言为例:

对象(Object)属性(Attribute)值(Value)
PythonisUntyped-Language
Pythoninvented-byGuido van Rossum
Pythonblock-syntaxindentation
Untyped-Languagedoesn't havetype definitions

在你的本体里:客厅中的"沙发"就是一个对象,hasColor是属性,"米色"是值;hasFunction属性可以把客厅与厨房区分开。

2. 层次表示:框架(Frame)与场景(Scenario)

层次表示强调人脑中"对象层级"这一事实。框架表示把每个对象或对象类表示为一个带槽(slot)的框架,槽可以有默认值、取值限制,甚至存储可调用的过程;所有框架形成类似面向对象继承的层次。README 用"Python"这一框架举例:

槽(Slot)值(Value)默认值(Default)区间(Interval)
NamePython
Is-AUntyped-Language
Variable CaseCamelCase
Program Length5-5000 lines
Block SyntaxIndent

场景(Scenario)则是特殊的框架,表示随时间展开的复杂情境。在你的本体里:"客厅"框架的槽可以有hasFloorCovering(默认值carpet)、hasLighting(默认值overhead_light),并规定hasNumberOfSeats的最小基数约束。

3. 过程表示:产生式规则(Production Rules)

产生式规则是"IF 条件 THEN 结论"形式的 if-then 语句。README 给出的动物判定例子:

IF 动物吃肉类 OR (动物有锋利牙齿 AND 动物有爪子 AND 动物眼睛朝前看 ) THEN 该动物是食肉动物

规则左端的每个条件与右端的结论,本质上都是 OAV 三元组。在你的本体里,可以用规则表达:"IF 房间有沙发 AND 房间有茶几 AND 房间有电视 THEN 房间是客厅"——这正是作业第三个问题的自动化答案。

4. 逻辑表示:谓词逻辑与描述逻辑

亚里士多德最早把逻辑视为表示普遍人类知识的方式。由于完整谓词逻辑不可计算,实际使用其子集(如 Prolog 中的 Horn 子句);而描述逻辑(Description Logic, DL)是专门用于表示和推理"对象层次"的逻辑体系,正是语义网本体的理论基石。Protégé 中你添加的每一个类、属性和约束,最终都会映射为描述逻辑公理。

三、如何选题并界定建模边界

选题本身就在训练"分类思维"。作业给的客厅示例,其实是一套完整的建模方法论,可以迁移到任何领域:

建模动作客厅示例可迁移到
定义核心类Room(房间)你的主题根类
定义子类LivingRoom,Kitchen,Bathroom,DiningRoom主题下的分类
定义个体客厅里的sofa_1,floor_lamp_1具体实例
定义对象属性containsFurniture,hasLighting个体间关系
定义数据属性hasArea(平方米)、hasSeatCount数值/文本特征
定义约束LivingRoom ⊑ hasSeatCount ≥ 3区分不同子类的判别依据

回答作业的三个问题:客厅与厨房的差异不在"有没有餐桌",而在属性约束——客厅hasPrimaryFunction = socializing且hasSeatCount ≥ 3,厨房hasPrimaryFunction = cooking且必须有hasSink = true;"客厅 vs 餐厅"的区分则取决于hasDiningTable是否为强制属性。这些约束写进本体后,推理机(reasoner)就能自动判定某个房间属于哪个类。

四、工具准备:Protégé 的获取与使用方式

作业明确要求使用 Protégé 构建本体。README 的说明是"下载它,或者在线使用",即两种方式均可:

  • 桌面版(Protégé Desktop):从官网下载安装包,支持全功能编辑、推理器(HermiT、Pellet 等)集成,适合离线工作与大型本体工程;
  • Web 版(Web Protégé):在线编辑器,无需安装,支持多人协作,适合快速实验。README 中那张编辑器截图(lessons/2-Symbolic/images/protege.png)正是 Web Protégé 打开 Romanov 家族本体的样子。

在 Protégé 中构建本体的标准工作流:

  1. Active Ontology 面板:设置本体 IRI(国际资源标识符)与前缀;
  2. Classes 标签页:创建类层次,如Thing → Room → LivingRoom;
  3. Object Properties 标签页:定义对象属性(个体之间关系),可声明inverseOf(逆属性)、TransitiveProperty(传递属性)、SymmetricProperty(对称属性);
  4. Data Properties 标签页:定义数据属性(个体与字面量的关系);
  5. Individuals 标签页:创建具体个体并填写属性值;
  6. DL Query 标签页 / Reasoner 菜单:启用推理器(如 HermiT)验证一致性并执行自动分类。

五、完整实操:构建一个"客厅"本体(示例)

以下步骤可直接在 Protégé 中复现,同时与仓库中 data/onto.ttl 的写法(Turtle 语法)一一对应。

Step 1 — 建立类层次

owl:Thing ├── Room │ ├── LivingRoom │ ├── Kitchen │ ├── Bathroom │ └── DiningRoom ├── Furniture │ ├── SeatingFurniture │ └── Table └── Lighting ├── OverheadLight └── FloorLamp

Step 2 — 定义对象属性与数据属性

  • 对象属性:contains(域Room,值域Furniture ∪ Lighting)、isLightedBy(域Room,值域Lighting);
  • 数据属性:hasArea(值域xsd:decimal)、hasSeatCount(值域xsd:nonNegativeInteger)、hasPrimaryFunction(值域xsd:string)。

Step 3 — 用约束(Restriction)界定子类

在 OWL 中,子类的判别依据是描述逻辑约束。仓库中的 onto.ttl 提供了绝佳模板——例如Man被定义为"Person 且 hasSex 取值为 Male"的交集(owl:intersectionOf):

fhkb:Man a owl:Class ; owl:equivalentClass [ a owl:Class ; owl:intersectionOf ( fhkb:Person [ a owl:Restriction ; owl:onProperty fhkb:hasSex ; owl:someValuesFrom fhkb:Male ] ) ] .

照此模式,你的"客厅"约束可写成:

: LivingRoom a owl:Class ; rdfs:subClassOf :Room ; rdfs:subClassOf [ a owl:Restriction ; owl:onProperty :hasSeatCount ; owl:minQualifiedCardinality "3"^^xsd:nonNegativeInteger ], [ a owl:Restriction ; owl:onProperty :hasPrimaryFunction ; owl:hasValue :socializing ] .

启用推理器后,任何一个hasSeatCount ≥ 3且hasPrimaryFunction = socializing的房间个体都会被自动归类为LivingRoom——"你怎么知道它是客厅而不是餐厅"就由推理机来回答了。

Step 4 — 创建个体并验证

创建个体my_living_room、sofa_1、floor_lamp_1,填写属性断言后运行推理器。如果某个个体同时满足多个类的约束,推理结果(Inferred Hierarchy)会揭示它的所有归属——这正是本体区别于普通分类表的价值所在。

六、从三元组到推理:本体的语义网表达

本体不是孤立文件,它隶属于语义网(Semantic Web)技术栈。README 指出,语义网建立在三个概念之上:基于描述逻辑的知识表示、用全局 URI 标识所有概念与关系的分布式表示,以及RDF / RDFS / OWL这一族 XML 系知识描述语言。

在语义网中一切表示皆三元组,对象和关系都由 URI 唯一标识。README 给出的例子是:

http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date "Jan 1, 2022" http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com

其中http://www.example.com/terms/creation-date与http://purl.org/dc/elements/1.1/creator是表达"创建日期"和"创建者"的公认 URI。用 Protégé 保存本体时,你实际上就是在生成这样一组三元组(Turtle / RDF/XML / OWL 格式)。

仓库里的完整范例:FamilyOntology.ipynb 演示了一条龙流程——用python-gedcom解析罗曼诺夫皇室的 GEDCOM 家谱,把 onto.ttl 中定义的家庭关系本体与个体事实合并,再用rdflib读取、用OWL-RL做演绎闭包推理,最后用 SPARQL 查询亲属关系。几个关键数据点:

  • 本体文件初始含669个三元组,经DeductiveClosure(OWLRL_Extension).expand(g)推理后膨胀到4246个三元组;
  • 属性链公理(owl:propertyChainAxiom)是本体的"规则"来源,例如阿姨的定义——isAuntOf是isSisterOf与isParentOf的复合(阿姨 = 父母的姐妹):
fhkb:isAuntOf a owl:ObjectProperty ; rdfs:domain fhkb:Woman ; rdfs:range fhkb:Person ; owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .
  • 推理后即可用 SPARQL 查询,如找出所有"舅舅":
SELECT DISTINCT ?aname ?bname WHERE { ?a fhkb:isUncleOf ?b . ?a rdfs:label ?aname . ?b rdfs:label ?bname . }

这给你的启示:作业中的客厅本体同样可以这样升级——定义isInSameRoomAs的传递/对称属性、用属性链定义"相邻房间"等复合关系,再借助推理机自动发现隐含关系。

七、仓库中的配套参考实现

完成作业前,建议先运行仓库里的两个配套 notebook,它们分别是产生式规则和语义网本体的最小可运行示范:

文件内容对你作业的帮助
Animals.ipynb用 Python 自写"专家系统外壳"实现反向推理(KnowledgeBase.get/eval遍历 AND-OR 树),再用 Experta 库(CLIPS 风格)实现正向推理(@Rule注解 +declare事实)理解"知识库 + 推理引擎"如何分离,规则如何书写与触发
FamilyOntology.ipynb从 GEDCOM 家谱生成 OWL 个体,结合 onto.ttl 做 OWL-RL 推理 + SPARQL 查询理解"类、属性、约束、个体"如何组织成可推理本体
MSConceptGraph.ipynb用微软概念图谱(Microsoft Concept Graph)把新闻聚类了解本体也可从非结构化文本中挖掘,不必全手工

其中 Animals.ipynb 的规则库定义展示了"产生式规则"在代码中的真实形态——工作记忆(working memory)存 OAV 事实,规则按条件匹配并不断插入新事实,例如'carnivor': If(OR([AND(['sharp teeth','claws','forward-looking eyes']),'eats meat']))。README 还特别提醒:规则量达到200 条以上后系统才会显现"智能"行为,而知识型系统的最大优点是——任何决策都可以精确解释,这正是本体与专家系统在现代 AI 中仍不可替代的原因。

八、验收清单与扩展方向

完成本体后,用下面的清单自检你的作业是否达标:

  • 主题明确(人/地点/事物任选),根类与至少 3 个有区分度的子类;
  • 定义了对象属性(含逆属性、传递/对称属性)与数据属性;
  • 至少用一个描述逻辑约束(基数限制 / hasValue / someValuesFrom)区分两个易混淆子类(如客厅 vs 餐厅);
  • 创建了若干个体并填写属性断言;
  • 在 Protégé 中启用推理器后,个体被自动归类到你预期的类,且本体一致性检查通过;
  • 能用 SPARQL(或 Protégé 的 DL Query)回答至少一个关于你本体的查询。

扩展方向(来自 README 的 🚀 Challenge 与 Review & Self Study):在家族本体 notebook 中试验更多亲属关系(如isAncestorOf);思考 Bloom 分类学、林奈生物分类法、门捷列夫元素周期表这类"人类量化知识的经典尝试"如何映射为本体设计。若能把自己的本体导出为 OWL 文件并与 onto.ttl 对照,你就完整走完了"知识表示 → 本体建模 → 自动推理"的符号主义 AI 全链路。

  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

相关推荐

上一篇:PaddleSeg Python API 体系指南:transforms、datasets、models、backbones、core 与 cvlibs 六大模块详解
下一篇:Quill C++日志库:高性能异步低延迟日志解决方案终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 1:56:19

DRV8818+PIC18F86J50工业步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华