一定要用JAVA来实现这个专家库系统

  标题是哪个说的话,估计大家都能猜出来

  

  这一篇主要谈谈个人对专家库的一些理解,所以以下全属个人见解。

专家库大致由知识库,事实库,算法库,规则库,问题库和推理机组成。专家可以基于对解决某一领域的问题,建立一套知识库,算法库和规则库。知识的建立过程,其实就是专家在分析领域问题中抽象出所需的模型过程,算法可以对基于模型(知识)的特定计算或处理方法,事实对基于知识模型的数据存储。规则理论上应该通过对调用特定算法或查询事实的结果的流程控制,一般表现形式为 IF … THEN … ,推理机根据特定问题,从事实库中查询该问题已有解决方案,如果存在,则可以直接返回结果。如果不存在,则一一查询相关规则中前件,解析所有前件表达式,动态调用算法或查询事实,如果匹配,则返回后件结果(解析后件,执行后件,直到有结果)。当然,这个推理过程是属于正向推理的过程。还有反向推理过程,这里先不展开讨论。总之推理机最起码的功能应该包含解析和执行。

  下面通过一个简单的例子,关于人口统计的问题。我们先设定几个问题:一、统计某个地区男性人口总量。二、统计某个地区小学生的人口问题。三、统计某个地区程序员的平均年收入。

  我们先假设自己是砖家,来分析这个人口统计的问题。首先,我们需要一些人口的信息,这些人口的信息最起码要包含所在地区,性别,职业,年收入。这个分析过程,其实就是根据业务需求抽象建模。对应程序员来说,这个过程我们其实总在做,所以应该很好理解。

  回到我们自己程序猿的角色,我们需要将专家的模型保存起来,如果把专家的模型直接叫知识,感觉有点不合适,我暂时将这模型部分叫做元知识,信息就叫元知识属性吧。

  继续砖家,现在我知道我需要人的哪些信息了,那么每个信息可能需要的类型会有不同,这个必须要区分,首先看性别,一般来说,性别应该只有两种,对于这个我们可以用0,1数值型来区分(如果还有其它性别,可以加一个,应该不可能再有多的了)。对于职业和所属地区,如果简单的用字符来记录,在录入信息和查询的时候,除非有非常明确的约定,否则统计时可能会不准确,录数据的人可能不和统计查询的人在一个部门,又可能录入时会出现偏差。这时候,砖家就会想着,需要再抽象出两个模型,地区信息和职业信息。那么在人口信息登记时或查询时,地区和职业应该类型应该是对应模型,而不是简单的字符了。

  再次回来当程序猿,从刚才当砖家的过程中,考虑到对模型里每条信息的类型必须也要记录保存起来。所以我们必须要对元知识属性的类型作各种可能性的枚举,让专家选择,以方便后期的查询解析,当然某个信息是否必须存在数据也需要专家告知。

  站在程序员的角度来分析目前示例中的问题,做的事情其实就是帮用户建模,用户在录入以上信息后,其实是可以生成任意数据库的数据表结构的,也可以生成任意面向对象语言的POJO类型的。用户只需要有面向对象的思维,不需要会数据库建模或会面向对象语言。那么我们现在已经抽象出了几个基本对象模型了:元知识对象,元知识属性对象。当然元知识对象之间是可以有继承关系的,子类会继承父类所有属性并有自己的属性。比如学生对象或程序员对象,理论上都可以有人口的属性,而学生又可以有独特的所在学校属性。

  所以现阶段我们可以建模元知识对象:唯一标识、名称代码、中文名称、知识描述、父知识对象;元知识属性对象:唯一标识、所属元知识、属性名称代码、中文名称、属性类型(字符,数值,是否、元数据、元知识)、属性描述。

  接下来我们换个轻松的角色当:数据录入员。在专家建好了模型后,基于这些模型去录入数据存储到数据库中。这些数据在专家系统中,通常被称为事实。一批事实的录入必须是基于元知识的,并且每条信息要符合元知识属性的规范。不知不觉跳回了程序猿了。由些,我们又可以建模事实对象:唯一标识、元数据标识、属性和对应的值(这个可以灵活规范,目前考虑以键值的形式保存)。对于事实有一部分是录入,还有一部分应该是通过解决特定问题后产生的事实,这部分事实我们其实也可以保存起来,当下次遇到相同的问题,可以直接取得问题的结果。目前对于这部分事实的保存还在考虑中。因为它也是事实,但是又区别于录入的事实,它关联的是具体的某个问题,有可能是某个元知识对象,也有可能直接是一个任意结果。所以如果要跟录入的实现分别建模,性能要可能会更好。这个目前还没有考虑全。

  继续来当砖家。模型建好后,下面就是解决具体问题了。对各种问题的解决方案,我们统称为算法。分析一个算法的特征,它可能会有返回结果,它可能会需要参数。例子中,统计某个地区男性人口总量的算法,可以给算法取个名称,它返回的是一个数值的结果,它需要的参数是地区,前面我们已经将地区作为一个元知识对象了。所以这个算法可以表示为:

  算法名称(RETURN:O_NUMBER,PARAMS:[M_DIQU]) 括号里RETURN表示该算法的返回值,:后面代表返回值类型,其中O_代表类型是基本类型中的一种,O_NUMBER代表基本类型中的数值型,若返回值是一个组数或集合,则可以用[O_NUMBER]表示。PARAMS是对参数的描述,参数通常会有一个到多个,所以直接用[]来表示,如果没有[]就空着,多个以,号分隔。M_DIQU中M_代表为元知识对象,DIQU是元知识对象地区的名称代码。这些规范目前未定,只是差不多用这种形式就可以很好的描述一个算法了。

  算法描述可以很好解决,但是算法的内容就很不好让用户来录入了。目前暂行的方案是由懂java语言的人,通过交流,理解后编写或者通过导入jar包方式。再进行描述存库。

  由些可以建模算法描述:唯一标识、全类名(由于算法体是java编写,需根据算法所在类进行反射执行)、jar包所在目录(对于外部引用的jar需动态加载执行)、算法名称代码、算法中文名、返回值描述、参数描述、算法描述。

  至此,完整的知识库才算是完成,所以个人感觉知识库应包含元知识、元知识属性、事实(录入事实)、算法描述。专家库的实现,就是将用户看作是一个不懂开发语言的程序员,帮其以面向对象的思维,解决任意领域的问题。知识库部分可以看作是编程的实现。规则,问题和推理机部分,可以看作是对用户编程的逻辑调用和执行部分,相当于解释器和执行器。所以整个专家库可以看作是一个完整的基于没有语言的开发平台。

         所以如果这次个人见解差不多可行,将在下篇开始着手实施知识库部分。知识库部分如果理解没问题,实施应该问题不大。

题外话:之前接触过SPSS,虽然没有深入了解。个人有个感觉,如果这套完善了,有特定的java算法包,应该是可以完成SPSS的功能,并且是B/S结构的,数据结构可以用户自定义。

猜你喜欢

转载自www.cnblogs.com/yuzeyong/p/8912046.html