什么是本体模型呢?本体模型也就是英文中的Ontology,大家很难从字面上准确地去理解这个词在信息技术领域的含义,百度上也没有特别易懂的中文资料来解释这个词汇,这就是为什么我写这篇文章的原因。希望你读完这篇文章后,能对本体模型有一个初步的了解。
本体模型到底是什么?
本体模型用简单的话来说就是一个阐述概念与概念之间关系的模型。如果我们要用一个本体模型来描述整个宇宙中的所有概念,那这个本体模型将会是及其巨大的。所以常常我们会将某一个本体模型的范围规定在一个研究领域,根据这个研究领域之中所含的一些概念来构建相关的本体模型。说了这么多我们来看一个摘自维基百科的本体模型的实例
上面这个图片就是本体模型的一个简单实例,我们可以观察到这个本体模型所含的词汇是被限制在了动物
这个研究领域内。这个模型中的每一个箭头代表了概念词汇间的关系,例如熊是
哺乳动物,熊有
毛。当然这仅仅是一个及其简化了的本体模型,在真正的能够投入研究的本体模型中,每一个概念词汇代表的就不仅仅是一个字符串这么简单。
本体模型有什么用?
本体模型的最大作用就是能让计算机“听懂”人类到底在讲什么话。为什么我在听懂这个词上加了引号呢?因为计算机的这种“听懂”的过程其实上就是在本体模型中对一个概念词汇的搜索,当它搜索到它需要理解的概念词汇时,它可以获取这个概念词汇的详细信息,了解哪些词汇是与这个词有关系的,这种词汇间的关系又是什么关系…
当计算机有了本体模型这本人类词汇的字典后,它就能理解与回答人类的一些问题了。还是拿上图的本体模型作为例子,如果此刻计算机拥有了这样的一个本体模型,我们问它“熊是哺乳动物吗?” 那么计算机可以在这个本体模型中搜索到关键词汇熊
,并在与熊
关系为是
的词汇中找到了目标词汇哺乳动物
,这样计算机就可以精准地回答用户的提问了。现在你可能对苹果Siri的问答环节是如何实现的有一些头绪了吧,但请留意本体模型也仅仅是Siri回答问题参考的一部分资料,Siri会整合不同途径获得的答案,然后挑选出可信度最高的一个作为最终回答。当然本体模型的功能不仅仅限于此,我们拥有了一个针对特定领域的本体模型,就等同于拥有了一本关于这个领域的百科全书,其他领域的研究者也可以参阅,更新,甚至拓展这本书。这让知识的复用性,时效性与延展性达到了一个全新的高度。可以看出来,创建本体模型的作用并不仅仅在于本体模型本身,它好比是一个强大的知识数据库,它的价值需要依靠使用者的想法与目的来实现。
如何创建一个本体模型?
本体模型的创建方法有多种多样,在这里我介绍一个使用斯坦福大学开发的protege应用创建本体模型的方法。当然在创建这样一个模型之前,我们可能得先搞清楚几个基本的问题。第一,这个本体模型是针对哪一个研究领域的;第二,我们为什么要建立这样一个本体模型;第三,这个本体模型是用来回答什么样的问题的;第四,谁会来使用和维护这个本体模型。当你搞清楚了这样四个问题之后,我们就可以来着手使用protege来定义一个本体模型了。要了解如何使用protege,我们必须先了解三个基本概念,类(Class),对象属性(Object Properties),与数据属性 (Data Properties)。
类(Class)
类在protege中就好比是研究领域内每一个概念词汇,举个例子我们创建了人
这个类,在人
类的子类中创建导演
,演员
,作家
三种不同的职业概念。这种创建类的模式就叫做从上往下
,我们先创建父类再细分子类。与这种创建方式相反的模式叫做从下往上
,在这种模式中,我们会先创建最细分的子类,再慢慢将这些子类归入相应的父类中。当然我们还可以混合这两种创建模式,先将最明显的类罗列出来,再慢慢理清类之间的关系。通过这几种方法,我们就可以创建出一个完整的,描述特定研究领域的类的集合。
对象属性(Object Properties)
对象属性在protege中主要用来定义类与类之间的关系,在这里我们要引入两个新的概念范围(range)
和域(domain)
。范围
也就是一个特定对象属性的目的地类,而域
就是这个对象属性的起始类。通俗地说,对象属性可以被理解作是一个含有关系的箭头,而范围
就是箭头所指的那些类,域
则是箭头出发的那些类。在下面的例子中,你应该可以更好地理解这两个概念。
数据属性 (Data Properties)
数据属性也是属性的一种,它往往被用来描述一个类。举个例子作家
这个类中会含有一个数据属性名字
,我们可以使用这个数据属性来描述作家
的姓名。同样的,数据属性也会含有范围
和域
,只是这里的概念可能会与对象属性稍稍有些差异。这里的范围
指代的是数据属性的允许值类型,而域
指代的拥有这个数据属性的类。下面我们就会使用protege创建一个针对书籍与电影的本体模型
本体模型实例
类
上图就是我们所创建的类,可以看到在大类Thing
下,我们创建了人
,电影
与书
三个子类,在人
这个子类下,我们又创建了演员
,导演
与作家
这三个子类。这就是这个本体模型定义的所有的类了,下面我们来看一下对象属性。
对象属性
上图就是我们定义的一些对象属性来描述类之间的关系,可以看到我们有改编为
,撰写
,出演
,执导
四种对象属性。细心观察的读者可能已经注意到了在改编为
中我们定义了它的域为书
,而它的范围为电影
,通过规定域和范围我们成功描述了书改编为电影
这个关系。对于撰写
,出演
,执导
我们也规定了相应的域和范围来明确类之间的相互关系。
数据属性
上图就是我们定义的数据属性了,可以看到我们只在此定义了唯一的一个数据属性名字
,但名字却可以被应用于所有的类中。在名字
的域中我们包含了电影
,演员
,书
,作家
,导演
5个类,很明显这5个类都需要名字去描述它们。而在名字
的范围中我们规定了数据的种类为字符串。接下来我们从全局看一下我们刚刚创建的本体模型
模型预览
这就是我们刚刚创建的本体模型的全貌了,我们可以明确地看到类与类之间的关系:导演执导电影,演员出演电影,作家撰写书,书改编为电影…这就是一个简单的本体模型的创建过程了,接下来我们就可以往这个本体模型中倒入相应的导演
,演员
,作家
,电影
,书
的真实数据,那么这个本体模型就可以被用来回答一些简单的问题例如:哪些电影是由书改编来的,哪些演员出演过某部电影,哪些电影是由某位导演执导的等等。
总结
这就是本体模型的概念与其创建过程了。本体模型有着其广泛的应用面与适应面,尤其是对最近十分流行的人工智能与自然语言处理都有着举足轻重的作用。我相信国内的大企业也早已开始部署他们的本体模型,也已经将模型投入到生产应用中了,但是国内还是欠缺面向普通开发者的中文本体模型。如果想要更进一步了解本体模型,请参考斯坦福大学的相关课程,也可以参看与学习一下比较完善的英文本体模型库dbpedia。