第一:找出分类(分析出类)
第二:找出类的特征(分析类的相关属性)
第三:找出类的行为(分析类的方法)
第一:找出分类(分析出类)
第二:找出类的特征(分析类的相关属性)
第三:找出类的行为(分析类的方法)
转载于:https://www.cnblogs.com/liumeilin/p/7018110.html
在计算机科学中,抽象化(英语:Abstraction)是将数据与程序,以它的语义来呈现出它的外观,但是隐藏起它的实现细节。抽象化是用来减少程序的复杂度,使得程序员可以专注在处理少数重要的部分。一个电脑系统可以分区成几个抽象层(Abstraction layer),使得程序员可以将它们分开处理。
抽象与抽象层
抽象就是把一个问题或模型,以不同规则或方法所得出的不同的解(求解方法和解本身即抽象层),这些不同的解可以组合并还原成问题或模型的本身。
抽象的意义是可以忽略不是求解过程中必需的解。例如要用计算机程序去模拟“人”,在描述了人的动作(饮食、思考、移动等)匹配设计要求后(如可完整表达“人”在坐下时候的动作),其他“人”的细节(躯干、器官、细胞活动乃至人际关系)都可以忽略,以集中设计需要的功能,并减低程序的复杂度。
为了使抽象的成品(算法)不会出现问题,要注意抽象时是否漏掉重要特征。
编程语言
在程序设计中,高级语言是对机器指令序列的抽象。高级语言的出现,使得程序的编写得以简化,极大提高了程序的编写效率。随着软件技术的发展,组件技术进一步提升了程序抽象的级别。
另一种可取的替代方法是设计一种语言机制,允许程序师在需要的时候构建自己的抽象方法。一个通用的机制是使用过程(procedure)。通过分离过程的定义和规则,编程语言包含了两种重要的抽象方法:参数化抽象(abstraction by parameterization)和规格化抽象(abstraction by specification)。其中:
参数化抽象是用参数替换数据特征来进行抽象。这样能够归纳出模块,从而使其可以用于更多的情况。例如,可以定义一个排序抽象,既能够实现对实数数组的排序,又能够实现对整型数组的排序,或者甚至对数组类型这类一般结构都有用。
规格化抽象是将运行细节(即模块如何实现)抽象为用户所需求的行为(即模块做什么)。这是从具体实现中抽象出模块,需要的仅仅是模块的实现能够匹配我们所依赖的表述形式。每当将一个过程与一个注释(这个注释提供了充分的信息,是其他人不用看过程主体就能使用该过程)关系起来,我们就会使用规格化抽象。
程序设计中,抽象类别包括下列4类:
1:过程抽象:能够引入一些新的操作;
2:数据抽象:能够引入新的数据对象类型;
3:反复运算抽象:能够反复运算遍历在集合中的元素,而不必显示如何获得元素的细节;
4:类型层次:能够从多个单独的数据类型中抽象成几组相关的类型。
引用文献Barbara Liskov, John Guttag著,裘健译.程序开发原理:抽象、规格与面向对象设计.北京:电子工业出版社,2006年10月:第3-5页。
**1**、抽象类怎么定义?
在class前面加abstract关键字就行了
**2**、抽象类是无法实例化的,无法创建对象,所以抽象类天生就是被用来继承的(生来就是当爹的)
**3**、final和abstract不能联合使用,这两个关键字是对立的
**4**、抽象类的子类也可以是抽象类,也可以是非抽象类
**5**、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是可以被子类继承的,但是如果子类是非abstract类型的,则一定要进行实例化对象
**6**、抽象类中不一定有抽象方法,但是抽象方法必须出现在抽象类中。
**7**、抽象方法怎么定义?
public abstract void xxx();
**8**、一个非抽象的类,继承抽象的类,必须将抽象类中的抽象方法进行重写/覆盖/实现
public void xxx() { }
//写代码时,能用多态就用多态
到目前为止,只是学习了抽象类的基础语法,一个类到底声明为抽象类还是非抽象类,写的代码多了,自然就理解了
**
object类中就有很多方法没有方法体,都是以“;”结尾的,但他们都不是抽象方法,例如:
public native int hashCode();
这个方法底层调用的C++写的动态链接库程序
前面修饰符列表中没有abstrct,有一个native,表示调用JVM本地程序。
//抽象类里面含有抽象方法
// 接口:
public class Abstract {
public static void main(String[] args) {
Animal a=new bird() ;//向上转型(自动类型转换)
Animal b=new cat(); ///这就是面向抽象编程
///以后你就是调用a.xxx
///a的类型Animal是抽象的
///面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力
///这就是编程思想符合OCP原则
a.move();//在编译的时候move方法是父类的
b.move(); //在运行的时候move方法是子类的
}
}
abstract class Animal{
public abstract void move();
}
class bird extends Animal{
//需要将父类中继承过来的抽象方法进行覆盖/重写
//这样才可以把抽象方法实现
public void move(){
System.out.println("鸟儿在飞翔");
}
//如果bird是抽象类的话,那么从Animal中继承过来的就不用重写/覆盖/实现
//抽象方法必须出现在抽象类中
}
class cat extends Animal{
public void move(){
System.out.println("猫在床上走");
}
}
.
AbstractKnowledgeGraph, a systematic knowledge graph that concentrate on abstract thing including abstract entity and action. 抽象知识图谱,目前规模50万,支持名词性实体、状态性描述、事件性动作进行抽象。目标于抽象知识,包括抽象实体,抽象动作,抽象事件。基于该知识图谱,可以进行不同层级的实体抽象和动作抽象,这与人类真实高度概括的认知是一致的。
抽象知识图谱,集中于对知识图谱和事件图谱中的实例事实进行抽象,包括实体抽象、动作抽象以及事件抽象,从而达到对人类真实认知的模拟。本项目目标有三个:
1)论述抽象图谱。对抽象图谱的现实需求进行论述。
2)介绍抽象图谱的相关工作。目前,关于抽象知识图谱的工作已经有一定的积累,如英文中的ConceptNet,MINDNET,verbnet;中文的CN-Probase,Hownet,大词林,百度百科Schema等。
3)提出抽象知识图谱的实施路线并给出抽象接口实践。一个可用的抽象知识图谱构建路线,是对以上两个内容的实践说明。
1、抽象知识图谱的现实基础与需求
1)语言的语法特性。定语+主语+状语+谓语+补语+宾语是目前中文成句的重要形式,这种成分的占位与填充为了以词性标注、实体识别、句法分析已经语义角色标注的自然语言处理提供了基础。
2)语言抽象的层级特性。语义三角(包括符号,语义以及语境况三者构成的三角),对人类社会认知进行了很好的刻画。语言形成的过程,是人类对认知(物体,动作,思想)概括和总结的过程。形式化是概括的手段,语言符号及符号体系是概括的结果。层次性是符号体系的一个重要特征,概念之间的上下位,概念之间的总括与构成等,形成构成了语言抽象层级性的物质基础。
3)抽象能力是认知能力的基础。认知的过程,是对现实世界火活动的交互过程,包括内在和外在两个组成部分,内在负责自身知识的总结,抽象,体系的构建过程,即学习过程。外在负责对内在部分形成的知识体系应用的过程,应用包括验证和补充两个部分,验证在于对内在知识形成的证伪,补充在于对新抽象知识的形成与抽象规则的修正两个方面。孩子从出生的一无所知到逐步认知能力的过程,就是对知识不断总结、概括以及应用的过程。
4)抽象数据与抽象规则的获取挑战。让机器能够达到小孩的智力,根本上需要具备抽象能力以及抽象数据基础两个条件。这是解决认知智能的一个方向之一,而目前现有的技术手段,还难以快速满足这两个条件。一方面,健全的抽象数据较难获取,抽象与概括的类型众多,既有对动作的抽象,也有对名词实体的抽象,也有对性状的抽象,抽象的角度以及抽象的粒度很难把握。另一方面,基于这类抽象数据,学习或总结出内在的抽象规则和抽象层级,是难以攻克的一点。
2、抽象知识图谱的构成
1)抽象知识图谱体系架构
抽象知识图谱包括抽象实体知识图谱和抽象事件图谱两个组成部分,抽象实体知识图谱主要关注静态的实体性知识,抽象事件图谱则关注事件自身的抽象以及事件与事件之间(事理)的知识。抽象事件图谱需要抽象实体图谱作为有效载体,并加以支配;抽象实体图谱以抽象事件图谱作为有效承载,并为其所利用;抽象知识图谱是不同抽象层级的实体事件库,核心在于对事实实例的抽取以及抽象层级的概括两个方面,层级知识体系以及明确的事实实例是抽象的两个重要基础。基于事实实例的抽象是人脑对知识总结概括的过程。
2)抽象知识图谱的抽象角度
a) 名词性实体的抽象
名词性实体的抽象是知识抽象中最为基础也作为宽泛的一种,名词性实体丰富多样,并随着社会的发展以及新事物的产生而增加。苹果是一个公司,也是一种水果,水果又是一种植物,植物又是一种生物,这类层级性的名词性成分能够支持实体聚类、实体泛化等一系列应用。
b) 性状性修饰的抽象
性状性修饰的抽象,指对形容词性状态成分进行抽象,可用于对描述性知识的层级抽象。如美丽一词,属于美好这一层级,美好这一层级又可以归为友好积极的一类;又如悲伤这一词,通过悲伤自身的语义属性,又可以扩展成不同层级的修饰性成分。
c) 动作性事件的抽象
动作性的抽象,是除名词性实体抽象之外语义更为丰富但构建难度更大的一种抽象工作,动作是事件的重要组成部分,动作的层级反映了人类的事件归类和分类的印象。例如,睡觉是一种停止工作的动作,停止这一动作是从动态到静态的状态改变。杀人是犯罪,动刀子是杀人的一个可能步骤,这些动作之间构成的层级性语义网络能够配合名词性和性状性词语的抽象而生成更具有通用性的事件模式,即推动事件演化模式(event logic schema)的构建工作。
目前中文抽象图谱的工作主要还集中于在实体层级的概念上下位知识库,典型的有CN-Probase, BigCilin,BaikeSchema等四个
CN-probase
CN-probase是由复旦大学基于百科知识库构建起来的一个大规模实体型概念知识库,该知识库对百度词条的义项进行挖掘,并基于此进行上下位的挖掘。该项目目前不公开数据集,只提供API的调用。地址:http://kw.fudan.edu.cn/apis/cnprobase
HowNet
HowNet是董振东与董强两个老师研制出来的一款中文版的wordnet,该知识库构建起了具有层级体系的几百个概念,并基于此对超过6万个汉语词语进行了义项的刻画和组织。以HowNet为体系架构的基本组件,在配合词汇挖掘方法,可以形成一个较大规模的抽象知识库。Hownet与其他几个不同,该知识库还关注动词的抽象层级。该项目目前提供源文件的下载,已开源,关于这个的数据资源,可以参考我之前的一个工作,即句子相似度计算项目,地址:https://github.com/liuhuanyong/SentenceSimilarity
BigCilin
大词林是由哈工大秦兵老师团队基于搜索引擎结果、百科类知识以及结合同义词词林进行概念上下位挖掘的所形成的一个抽象知识库。该知识库关注实体性的知识,在动词性的知识上还暂未涉及,对于大词林的技术细节以及使用样例,可以搜索大词林,查阅其相关文档。该项目目前仅提供demo展示,无法开源调用。地址:https://www.bigcilin.com
BaikeSchema
基于众包方式形成的百科知识库中包含着大量的社会常识知识,这种知识以Taxonomy的方式进行组织。百科类知识库,包括以百度百科、互动百科以及维基百科为首的三大百科,在知识抽象上包括两个方面,一个是百科分类体系树,另一个是百科词条页面中的标签以及义项体系,集成这两个百科的知识体系,可以得到准确率适当的层级效果。不过,在构建过程中,不同的百科中有不同的百科分类体系,往往需要进行对应以及融合。该项目数据分布在百科平台上,需要整理形成使用。关于这方面的工作,可以参考我之前做的一个工作:
1,百科schema收集项目,地址:https://github.com/liuhuanyong/BaikeKnowledgeSchema
2,基于百科知识的上下位概念项目,地址:https://github.com/liuhuanyong/HyponymyExtraction
图谱的构建最忌讳从零开始,因此,可以踩在巨人的肩膀上进行处理。利用howet中的概念层级体系为基础,同时对百科类知识体系进行融合,并使用同义词词林等知识库进行拓展和泛化,并在知识更新上,基于百科概念事实以及模式挖掘提升抽象图谱的数量和质量。下图展示了该技术路线图。
目前知识的抽象,本项目从词性的角度出发(词性与知识的类型比较强相关)进行处理,以下分别展示了名词性、状态性、动作性的抽象路径初步结果,文件说明如下:
1)dict/concept_total.txt,词汇与概念文件,存储词语的概念义项。
2)dict/hiearchy.txt,基础概念体系文件,存储基础概念体系。
3)search_concept.py,概念抽象文件,python3.6环境,直接运行即可。效果如下:
1,名词抽象路径
2,状态词抽象路径
3,动作抽象路径
1,本项目提出了一个抽象知识图谱的项目,目的是对知识抽象与泛化提供一个思路并初步实践。
2,本项目介绍了抽象知识图谱,对抽象图谱的现实需求进行论述。
3,本项目介绍了中文抽象图谱的相关工作。摆阔CN-Probase,Hownet,大词林,百度百科Schema等,并给出了之前关联的项目地址。
4,本项目提出了一个可用的抽象知识图谱构建路线,提出抽象知识图谱的实施路线并给出抽象接口实践。基于hownet,同义词词林,从名词性实体抽象、形容词性性状描述抽象以及事件性动词抽象三个角度出发,形成了一个规模约50万的抽象接口。
5,知识图谱体系的再认识。知识图谱包括知识词汇表的挖掘,知识体系的挖掘,知识事实的挖掘三个部分内容,三个部分内容按照先后顺序排序。知识词汇表挖掘负责对知识中的短语名称、组合名称进行挖掘,形成符号基础。知识体系的挖掘,指知识概念层级的挖掘,更多的集中在抽象层级的挖掘;知识事实的挖掘,是目前的实体抽取与实体关系抽取,这也是目前知识图谱所处的阶段。
6,本项目提出了一个较为理想的目标,但技术实现起来仍然还需要一个体系更为健全、技术更为先进的方法来处理。后续这个项目可以长期维护。
If any question about the project or me ,see https://liuhuanyong.github.io/
如有自然语言处理、[知识图谱、事理图谱]、社会计算、语言资源建设等问题或合作,如果对事件知识库有兴趣的落地或者研究,可联系我:
1、我的github项目介绍:https://liuhuanyong.github.io
2、我的csdn博客:https://blog.csdn.net/lhy2014
3、about me:刘焕勇,中国科学院软件研究所,lhy_in_blcu@126.com
4、懂预言者得天下,得语言者分天下,得知识逻辑者,游得天下。