- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
本指南围绕 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)。所谓构建知识库,本质是对"描述某个主题事实的模型"进行分类。具体要求可以拆解为四步:
- 选题:选择一个主题——可以是人、地点或事物;
- 建模:为该主题建立一个模型,覆盖它的关键事实与分类;
- 套用技法:使用本课讲解的知识表示技术(三元组、框架、层次结构、产生式规则等)与建模策略;
- 工具落地:使用 Protégé(斯坦福大学开源本体编辑器)把模型落地成可编辑、可推理的本体文件。
作业给出的示例是"构建一个客厅的本体":包含家具、灯具等个体(individuals)。但真正的难点在作业中连续抛出的三个问题——客厅与厨房有何区别?与浴室有何区别?你怎么知道它是客厅而不是餐厅?这三个问题本质上是在追问:本体中"类(Class)"的界定依据是什么,你用什么属性(property)与约束(restriction)来区分不同类。这正对应本课 README 中反复出现的核心概念:知识表示不是把数据堆进电脑,而是"找到某种有效方式,把知识以数据形式表示在计算机中,使其可被自动使用"(见 lessons/2-Symbolic/README.md)。
二、动手前的知识储备:本课的四种建模策略
在打开 Protégé 之前,先明确你要用哪些"表示法"来建模。第 2 课 README 把计算机知识表示归纳为四大类,它们都是你本体里的"原材料":
1. 网络表示:对象-属性-值三元组(OAV Triplets)
语义网络可以用三元组<对象, 属性, 值>的列表来表示,这也是语义网一切表示的基础。README 以编程语言为例:
| 对象(Object) | 属性(Attribute) | 值(Value) |
|---|---|---|
| Python | is | Untyped-Language |
| Python | invented-by | Guido van Rossum |
| Python | block-syntax | indentation |
| Untyped-Language | doesn't have | type definitions |
在你的本体里:客厅中的"沙发"就是一个对象,hasColor是属性,"米色"是值;hasFunction属性可以把客厅与厨房区分开。
2. 层次表示:框架(Frame)与场景(Scenario)
层次表示强调人脑中"对象层级"这一事实。框架表示把每个对象或对象类表示为一个带槽(slot)的框架,槽可以有默认值、取值限制,甚至存储可调用的过程;所有框架形成类似面向对象继承的层次。README 用"Python"这一框架举例:
| 槽(Slot) | 值(Value) | 默认值(Default) | 区间(Interval) |
|---|---|---|---|
| Name | Python | ||
| Is-A | Untyped-Language | ||
| Variable Case | CamelCase | ||
| Program Length | 5-5000 lines | ||
| Block Syntax | Indent |
场景(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é 中构建本体的标准工作流:
- Active Ontology 面板:设置本体 IRI(国际资源标识符)与前缀;
- Classes 标签页:创建类层次,如
Thing → Room → LivingRoom; - Object Properties 标签页:定义对象属性(个体之间关系),可声明
inverseOf(逆属性)、TransitiveProperty(传递属性)、SymmetricProperty(对称属性); - Data Properties 标签页:定义数据属性(个体与字面量的关系);
- Individuals 标签页:创建具体个体并填写属性值;
- DL Query 标签页 / Reasoner 菜单:启用推理器(如 HermiT)验证一致性并执行自动分类。
五、完整实操:构建一个"客厅"本体(示例)
以下步骤可直接在 Protégé 中复现,同时与仓库中 data/onto.ttl 的写法(Turtle 语法)一一对应。
Step 1 — 建立类层次
owl:Thing ├── Room │ ├── LivingRoom │ ├── Kitchen │ ├── Bathroom │ └── DiningRoom ├── Furniture │ ├── SeatingFurniture │ └── Table └── Lighting ├── OverheadLight └── FloorLampStep 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!
相关推荐
AI-For-Beginners 实践课:使用 Protégé 构建一个领域本体(Ontology)的完整方法
AI For Beginners 实践课:使用 Protégé 构建一个领域本体(Ontology)的完整方法 导读 本篇文章是 AI For Beginner
教程人工智能机器学习深度学习AI-For-Beginners 实战作业:用 Protégé 从零构建领域本体(Ontology)
AI For Beginners 实战作业:用 Protégé 从零构建领域本体(Ontology) 导读 本文围绕 AI For Beginners http
教程人工智能机器学习深度学习用 Protégé 构建领域本体:从知识建模到语义网推理的完整实战(AI-For-Beginners 第 2 课作业指南)
用 Protégé 构建领域本体:从知识建模到语义网推理的完整实战(AI For Beginners 第 2 课作业指南) 本篇文章围绕 AI For Begi
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考