week3 LiTianyi - XLab-Tongji/AIOpsConceptualModeling GitHub Wiki

Ontology 101学习笔记

本文使用Protégé-2000作为例子。

人工智能文献包含许多本体论的定义;其中许多是相互矛盾的。对于本指南来说,本体是对一个论述领域中的概念的一个正式的准确描述(类classes(有时称为概念concepts)),每个概念的属性描述概念的各种特性和属性(插槽slots(有时称为角色roles或属性properties)),和对插槽的限制restrictions on slots(方面facets(有时也称为角色限制role restrictions))。本体与一组类的单独实例一起构成知识库。实际上,本体论的终点和知识库的起点是有明确界限的。

在实践中,开发一个本体包括: 在本体中定义类, 在一个分类(子类-超类)的层次结构中安排(arrange)类, 定义槽slots并描述这些槽的允许值, 为实例填充槽的值。

进行本体设计时的一些基本原则:

1)没有一种正确的方法来建模一个领域——总是有可行的替代方法。最好的解决方案几乎总是取决于您心中的应用程序和预期的扩展。 2)本体的开发是一个迭代的过程。 3)本体中的概念应该接近你感兴趣领域中的对象(物理的或逻辑的)和关系。这些最有可能是描述你的领域的句子中的名词(对象)或动词(关系)。

Step 1:确定本体的领域和范围

我们建议通过定义本体的领域和范围来开始本体的开发。也就是说,回答几个基本问题: 本体论将涵盖哪些领域? 我们要用本体论做什么? 本体中的信息应该为哪些类型的问题提供答案?谁将使用和维护本体?

考虑一下我们前面介绍的酒和食物的本体。食品酒的表征是本体论的领域。我们计划将这个本体用于建议葡萄酒和食物的良好组合的应用程序。 自然,描述不同类型的酒、主要食物类型的概念、酒和食物的好结合和坏结合的概念将被描绘进我们的本体论。与此同时,本体不太可能包含管理酒庄库存或餐厅员工的概念,尽管这些概念与酒和食物的概念有些关联。 如果我们正在设计的本体将用于协助葡萄酒杂志文章的自然语言处理,那么包含本体中概念的同义词和词性信息可能很重要。如果本体将用于帮助餐馆客户决定订购哪款葡萄酒,我们需要包含零售价格信息。如果它是为葡萄酒买家在库存酒窖,批发价格和供应可能是必要的。如果维护本体的人用一种与本体用户的语言不同的语言描述领域,我们可能需要提供语言之间的映射。

确定本体范围的一种方法是绘制一个问题列表,这些问题是基于本体的知识库应该能够回答的能力问题(Gruninger和Fox 1995)。这些问题将作为以后的试金石:本体是否包含足够的信息来回答这些类型的问题?答案是否需要特定的细节或特定区域的表现?这些能力(competency)问题只是一个概述,不需要是详尽的。

在葡萄酒和食品领域,以下是可能的能力(competency)问题: 在选择葡萄酒时,我应该考虑哪些酒的特性?波尔多是红葡萄酒还是白葡萄酒? 赤霞珠配海鲜好吃吗? 烤肉用什么酒最好? 葡萄酒的哪些特性会影响它是否适合一道菜?一种特定葡萄酒的酒香或酒体是否会随着年份而变化?纳帕仙粉黛的好年份有哪些? 根据这些问题列表,本体论将包括各种葡萄酒特征和葡萄酒类型、年份——好年份和坏年份——对选择合适葡萄酒的食物进行分类,推荐葡萄酒和食物的搭配。

Step 2:考虑重用现有的本体

考虑其他人做了什么,并检查我们是否可以针对我们的特定领域和任务改进和扩展现有的源几乎总是值得的。如果我们的系统需要与已经提交给特定本体或受控词汇表的其他应用程序交互,那么重用现有的本体可能是一个需求。许多本体已经以电子形式(electronic form)存在,并且可以导入到您正在使用的本体开发环境中。表示本体的形式通常无关紧要,因为许多知识表示系统可以导入和导出本体。即使知识表示系统不能直接处理特定的形式,将本体从一种形式转换为另一种形式的任务通常也并不困难。

在Web上和文献中有可重用本体的库。例如,我们可以使用Ontolingua本体库(http://www.ksl.stanford.edu/software/ontolingua/)或DAML本体库(http://www.daml.org/ontologies/)。还有一些公开可用的商业本体(例如,UNSPSC (www.unspsc.org)、RosettaNet (www.rosettanet.org)、DMOZ (www.dmoz.org))。 例如,法国葡萄酒的知识库可能已经存在。如果我们能够导入这个知识库及其所基于的本体,我们不仅可以对法国葡萄酒进行分类,而且还可以通过对葡萄酒特征的分类来区分和描述葡萄酒。从www.wines.com等商业网站上,客户可能已经可以购买葡萄酒了。

Step 3:列举本体中的重要术语

将我们想要陈述或向用户解释的所有术语列出来是很有用的。我们想谈的对象(terms)是什么?这些terms有什么性质?关于这些terms,我们想说些什么呢?例如,与葡萄酒相关的重要术语包括葡萄酒、葡萄、酿酒厂、产地、葡萄酒的颜色、酒体、风味和含糖量;不同种类的食物,如鱼和红肉;葡萄酒的子类型,如白葡萄酒等等。首先,重要的是获得一个完整的术语列表,而不必担心它们所表示的概念之间的重叠、术语之间的关系或概念可能具有的任何属性,或者这些概念是类还是槽(slots)。

接下来的两个步骤——开发类层次结构和定义概念的属性(槽slots)——是紧密相连的。很难先做一个再做另一个。通常,我们在层次结构中创建一些概念的定义,然后继续描述这些概念的属性,等等。这两个步骤也是本体设计过程中最重要的步骤。我们将在这里简要地描述它们,然后用接下来的两部分讨论需要考虑的更复杂的问题、常见的陷阱、需要做出的决策等等。

Step 4:定义类和类层次结构

开发类层次结构有几种可能的方法:

自顶向下的开发过程从定义该领域中最一般的概念开始,然后对这些概念进行专门化。例如,我们可以从为葡萄酒和食物的一般概念创建类开始。然后我们通过创建一些子类来专门化Wine类:White Wine、Red Wine、Rose Wine。我们可以进一步将红酒分类,例如,西拉,勃艮第红,赤霞珠,等等。

自底向上的开发过程从定义最具体的类(层次结构的叶子)开始,然后将这些类分组成更一般的概念。例如,我们从定义波亚克和玛歌葡萄酒的类开始。然后我们为这两个类创建一个通用的超类medoc,它又是Bordeaux的一个子类。

组合开发过程是自顶向下和自底向上方法的组合:我们首先定义更突出的概念,然后适当地概括和专门化它们。我们可以从一些顶级概念(如葡萄酒)和一些特定概念(如Margaux)开始。然后我们可以将它们与一个中级概念联系起来,比如Medoc。然后,我们可能希望生成来自法国的所有区域葡萄酒类,从而生成许多中级概念。

这三种方法都不是天生就比其他任何一种好。采取的方法在很大程度上取决于个人对领域的看法。如果开发人员对领域有一个系统的自顶向下的视图,那么使用自顶向下的方法可能会更容易。对于许多本体开发人员来说,组合方法通常是最容易的,因为“中间”的概念往往是该领域中更具描述性的概念(Rosch 1978)。

如果你倾向于首先区分最一般的葡萄酒类别,那么自上而下的方法可能更适合你。如果您希望从具体的示例开始,自底向上的方法可能更合适。

无论选择哪种方法,我们通常都从定义类开始。从步骤3中创建的列表中,我们选择描述具有独立存在性的对象的术语,而不是描述这些对象的术语。这些术语将是本体中的类,并将成为类层次结构中的锚。通过询问作为一个类的实例的对象是否必然(即根据定义)是其他一些类的实例,我们将这些类组织成一个层次分类法。

如果类A是类B的超类,那么B的每个实例也是A的一个实例。

换句话说,类B代表了一种“某种A”的概念。

例如,每一瓶黑皮诺酒都是红葡萄酒。因此黑皮诺类是红酒类的一个子类。

Step 5:定义类的属性——槽slots

这些课程本身不会提供足够的信息来回答第1步中的能力问题。一旦我们定义了一些类,我们必须描述概念的内部结构。

我们已经从步骤3中创建的术语列表中选择了类。其余的大部分术语可能是这些类的属性。这些术语包括,例如,葡萄酒的颜色、酒体、风味、含糖量和酒厂的位置。

对于列表中的每个属性,我们必须确定它所描述的类。这些属性成为附加到类的插槽(slots)。因此,Wine类将有以下slots:颜色、酒体、风味和糖。而酒厂类将有一个slot位置。

一般来说,有几种类型的对象属性可以成为本体中的slots:

“内在”属性,如葡萄酒的味道;

“外在”属性,比如酒的名字和产地;

部件parts(如果对象是结构化的);这些可以是物理的和抽象的“部分”(例如,一顿饭的主菜)

与其他个体individuals的关系;这些是类的个体成员和其他事物items之间的关系(例如,葡萄酒的制造者,代表了葡萄酒和酿酒厂之间的关系,以及酿酒用的葡萄)。

因此,除了前面确定的属性外,还需要在Wine类中添加以下slots:name、area、maker、grape。

一个类的所有子类继承这个类的slot。例如,类Wine的所有slots将继承到所有Wine的子类,包括红酒和白葡萄酒。我们会在红酒的等级上增加一个slot——单宁水平(低、中、高)。单宁水平的slot将被代表红葡萄酒的所有类(如波尔多和博若莱)继承。

slot应该附加在可以有这个属性的最一般的类。例如,葡萄酒的body和颜色应该附加在类wine上,因为它是实例具有主体和颜色的最常见的类。

Step 6:定义槽slot的面facets

slot可以有不同的facets来描述值类型、允许的值、值的数量(基数)和slot可以接受的值的其他特性。例如,一个name slot的值(如“葡萄酒的名称”)是一个字符串。也就是说,name是一个值类型为String的slot。一个produces slot(如“一个酒厂生成这些葡萄酒”)可以有多个值,这些值是Wine这个类的实例。也就是说,produces是一个有着值类型的实例的slot,这些实例将Wine作为允许的类。

我们现在将描述几个常见的facets。

槽基数(slot cardinality) 槽基数定义一个槽可以有多少个值。有些系统只区分单个基数(最多允许一个值)和多个基数(允许任意数量的值)。葡萄酒的瓶身body将是单个基数插槽(葡萄酒只能有一个body)。由一个特定酒厂生产的葡萄酒填补了一个酒厂class的produces多基数slot。

一些系统允许指定最小和最大基数来更精确地描述槽值的数量。最小基数为N意味着一个slot必须至少有N个值。例如,葡萄酒的grape slot的最小基数为1:每个葡萄酒至少由一种葡萄制成。最大基数为M意味着一个slot最多可以有M个值。单品种葡萄酒的最大grape基数为1:这些葡萄酒仅由一种葡萄制成。有时,将最大基数设置为0可能很有用。此设置将指示槽不能具有某特定子类的任何值。

Slot-value type

一个value-type facet描述可以填充槽中的值的类型。下面是一些比较常见的值类型:

String是用于诸如name这样的槽的最简单的值类型:值是一个简单的字符串 Number(有时使用更特定的浮点和整数类型)用数值值描述槽。例如,葡萄酒的价格可以有一个值类型浮动 Boolean是简单的yes-no标志。例如,如果我们选择不把起泡葡萄酒作为一个单独的类,葡萄酒是否起泡可以表示成一个布尔值的slot:如果该值为“true”(“是的”)葡萄酒是起泡的,如果该值为“false”(“不”)葡萄酒不是一个起泡的。

Enumerated指定slot允许的特定值的列表。例如,我们可以指定口味slot可以接受以下三个可能值中的一个:strong,moderate, anddelicate。在Protégé-2000中, enumerated slots是type Symbol中的一种.

Instance-type slots允许定义个体之间的关系。具有值类型实例的slots还必须定义一个允许实例来自的类的列表。例如,类Winery的slot produces(生产商)可能具有类Wine的实例作为其值。

slot的领域和范围

被type Instances的slot允许的类通常称作一个slot的范围。比如,类Wine是produces slot的范围。有些系统允许在slot附加到特定类时,限制slot的范围。 Slot附加到的类或slot描述属性的类称为slot的域。Winery类是produces slot的域。在我们将slot附加attach到类的系统中,slot附加到的类通常构成该slot的域。不需要单独指定域。

确定一个域和一个槽的范围的基本规则是类似的: 在为slot定义域或范围时,查找可以分别作为该slot的域或范围的最通用的一个或多个类。 另一方面,不要定义过于通用的域和范围:slot中的所有类都应该由slot描述,slot范围内的所有类的实例应该是slot的潜在filler。不要为范围选择一个过于一般化的类(例如,某个人不会想要制定THING这个range),但是one会想要选择一个能够覆盖所有fillers的类。

不要列出Produces这个slot中所有Wine类的子类,只列出Wine。同时,我们不希望将slot的范围指定为THING——本体中最一般general的类。

具体来说: 如果一个类的表定义了一个范围,或者一个slot的领域包括一个类和它的子类,则删除该子类。 如果slot的范围包含葡萄酒类和红酒类,我们可以把红酒类从range中移除,因为它没有添加任何新的信息:红酒是葡萄酒的一个子类,因此这个slot的range的已经隐式地包含它以及所有其他葡萄酒类的子类。

如果一个定义范围或槽的域的类列表包含类a的所有子类,但不包含类a本身,那么范围应该只包含类a而不包含子类。

不用定义slot的范围来包括红酒、白葡萄酒和桃红葡萄酒(枚举Wine的所有直接子类),我们可以将范围限制为类Wine本身。

在将槽附加到类与将类添加到槽的域相同的系统中,同样的规则适用于槽附加:一方面,我们应该使它尽可能通用。另一方面,我们必须确保附加槽的每个类都确实具有槽所表示的属性。我们可以将单宁水平槽连接到代表红酒的每个等级(如波尔多、梅洛、博若莱等)。然而,既然所有的红酒都有单宁水平的特性,我们应该把这个位置附加到这个更一般的红酒类别上。进一步一般化单宁水平槽的域(通过将其附加到Wine类)将是不正确的,因为例如,我们不使用单宁水平来描述白葡萄酒。

Step 7:创建实例

最后一步是在层次结构中创建类的单个实例。定义一个类的单个实例需要(1)选择一个类,(2)创建该类的单个实例,(3)填充槽值。例如,我们可以创建一个单独的例子Chateau-Morgon-Beaujolais来代表一个特定类型的Beaujolais wine。Chateau-Morgon-Beaujolais是Beaujolais类中代表所有Beaujolais wines的一个例子。这个实例有如下定义了的slot值: Body: Light Color: Red Flavor: Delicate Tannin level: Low Grape: Gamay (instance of the Wine grape class) Maker: Chateau-Morgon (instance of the Winery class) Region: Beaujolais (instance of the Wine-Region class)