首页> 中国专利> 一种基于最大熵模型的代码摘要生成方法

一种基于最大熵模型的代码摘要生成方法

摘要

本发明提供一种基于最大熵模型的代码摘要生成方法,根据限定的样本模板采集训练样本;根据训练样本构建基于最大熵模型的代码元素分类器;将待分析的源代码输入到分类器,以识别其中的代码元素,并获取各代码元素所包含的词项;将获取到的词项进行降噪;根据词项所属的代码元素类型,并指定各个词项的权重;根据权重和出现次数,评估词项的重要性;根据重要性评估结果以及用户指定的摘要约束,生成代码摘要,使得得到的代码摘要更加的准确。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-07-06

    授权

    授权

  • 2015-07-29

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20150323

    实质审查的生效

  • 2015-07-01

    公开

    公开

说明书

技术领域

本发明涉及一种基于最大熵模型的代码摘要生成方法。

背景技术

在软件生命周期的各个阶段,开发人员需要花费大量的时间阅读程序代 码。在此期间,开发人员倾向于避免去理解整个系统,而选择仅关注代码中 与任务相关的某个片断。为了实现这一目标,开发人员通常会略读代码(例 如仅阅读方法签名)。当通过略读获取的知识不足于理解代码片断时,他们 就不得不花费精力去阅读代码的具体信息(例如方法体中的内容)。前一种 方式的效率虽高,但容易丢失代码中的有效信息,而后一种方式则过于耗时, 并且,通过略读代码获得的知识难于与其他开发人员共享。

作为略读的一种常见替代方案,开发人员往往还会通过阅读代码摘要以 理解代码,代码摘要包含一些能够描述代码特性或功能的关键词或简短的语 句,例如“draw blue rectangle”或“modify config file”。

现有绝大多数的代码摘要都是手工创建,不仅创建摘要时需要占用开发 人员的大量精力而且其维护成本非常高昂,虽然学术界和工业界也提出了一 些基于词频的代码摘要生成技术,但是这些技术往往仅考虑了不同词项出现 的次数和频率,而忽略了词所处的位置。大量的研究表明,代码中不同词的 重要性与其所属代码元素的类型(类、方法、变量等)密切相关;例如:相 对于出现在注释中的词项,那些位于类名的词项的重要性往往要高得多;并 且,在现有的技术方案中,开发人员无法指定某些他们需要着重关注或忽略 的词项,例如:在一些年代较久的遗留代码中,代码中的注释有可能早已失 去了与代码的一致性,而现有的技术仍然会将注释视为与代码一样重要,并 可能将从注释中抽取过时的词而成为代码摘要的一部份。最近似的实现方案 是美国韦恩州立大学的Haiduc等学者提出的基于词频的代码摘要技术,但 是该技术方案只关注词出现的次数与频率,而忽略了词所处位置所产生的影 响,导致其代码摘要不准确。

发明内容

本发明要解决的技术问题,在于提供一种基于最大熵模型的代码摘要生 成方法,得到更加准确的代码摘要。

本发明是这样实现的:一种基于最大熵模型的代码摘要生成方法,包括 如下步骤:

步骤1、根据限定的样本模板,采集训练样本;

步骤2、根据训练样本构建基于最大熵模型的代码元素分类器;

步骤3、将源代码输入到分类器,识别其中的代码元素,并获取各代码 元素所包含的词项,以及各个词项的出现次数;

步骤4、将获取到的词项进行降噪;

步骤5、根据降噪后的词项所属的代码元素类型,分配其权重;

步骤6、根据降噪后的词项的权重和出现次数,评估词项的重要性;

步骤7、根据重要性评估结果以及用户限定的摘要约束,生成代码摘要。

进一步地,所述步骤1进一步具体为:根据限定的样本模板,用抽象语 法树解析代码,根据限定的模板采集训练样本。

进一步地,步骤2进一步具体为:根据训练样本,用广义迭代缩放算法 来构建代码元素分类器。

进一步地,所述步骤4进一步具体为:去除获取到的词项中的保留字, 并对剩余的词项进行分词和词干化处理。

进一步地,所述步骤6进一步具体为:根据降噪后的词项的权重和出现 次数,用TF-IDF算法对降噪后的词项进行重要性评估。

进一步地,所述步骤7进一步具体为:根据指定代码摘要中包含的最大 词项数、重要性评估以及限定的排序方式,生成代码摘要。

本发明具有如下优点:本发明一种基于最大熵模型的代码摘要生成方 法,能够根据用户指定的训练样本生成基于最大熵模型的代码元素类型分类 器,以识别用户所关注的代码元素,并从中抽取最可能刻画代码功能和特性 的关键词,以自动生成代码摘要,从而极大地减少开发人员创建和维护代码 摘要的工作量,有效地利用代码中的代码元素类型信息,从而有效地识别代 码中的关键词,而不再仅关注代码中不同词出现的频次,提供良好的扩展性, 开发人员可以根据具体的需要生成不同的代码元素识别模型,从而能够有针 对性地识别出不同软件系统所关注的关键词,从而最终得到更加个性化和更 符合具体要求的代码摘要。

附图说明

下面参照附图结合实施例对本发明作进一步的说明。

图1为本发明方法执行流程图。

具体实施方式

如图1所示,本发明基于最大熵模型的代码摘要生成方法,包括如下步 骤:

步骤1、根据限定的样本模板,用抽象语法树解析代码,采集训练样本;

步骤2、根据训练样本,用通用迭代算法来构建代码元素分类器;

对于分类问题,用A表示所有可能的代码元素类型,B是代码元素所 在上下文信息构成的集合,则可定义一个{0,1}域上的一个二值函数来表示 特征:f(a,b)=10---(1)

其中如果(a,b)∈(A,B),且满足限定条件,则f(a,b)=1;否则,f(a,b)=0;

若将判定代码元素的类型a∈A看为一个事件,该代码元素的上下文信息 看作该事件发生的条件b∈B,那么建立最大熵模型的目的就是计算判定代 码元素类型a的条件概率p(a|b),即利用最大熵模型选择条件概率p(a|b)最 大的候选结果作为最终判定结果:

p^(a|b)=argmaxpPH(p)---(2)

式中,P是指所建模型中所有与已知样本中的概率分布相吻合的概率分布集 合。因为所建模型的概率分布p(b)必须符合已知训练样本中的概率分布 即所以可将式(2)写为:

p^(a|b)=argmaxpPH(p)=argmaxpPH(A|B)=argmaxpPΣbBp(b)H(A|B=b)=argmaxpP(-Σa,bp^(b)p(a|b)logp(a|b))---(3)

如果存在某个特征fj(a,b),它在训练样本中关于经验概率分布的数 学期望为:

Ep^(fj)=ΣA,Bp^(a,b)fj(a,b)---(4)

假设存在k个特征fj(j=1,2,3...,k),则一个合理的概率分布模型p属于约 束所产生的如下模型集P:

P={p|Ep(fj)=Ep^(fj),1jk}---(5)

式中,是特征fj在样本中的期望值,Ep(fj)是特征fj概率分布p下的期望 值。由此,代码元素的分类问题就变成了满足式(5)表示的约束条件下求 解目标函数(3)的最优解。可证,满足上述条件的最优解具有如下形式:

p^(a|b)=1Z(b)exp(Σj=1lλj·fj(a,b))---(6)

式中,Z(b)=ΣAexp(Σj=1lλj·fj(a,b))---(7)

为归一化因子,使l=k+1,λj为特征fj的权重。

为了构建基于最大熵模型的代码元素分类器,步骤2还可进一步具体为:

[1]初始化:λ[1...l]=0;

[2]根据公式(4)计算每个特征函数fj的训练样本期望值:

[3]执行如下循环,迭代计算特征函数的模型期望值Ep(fj);

[4]利用公式(6)和公式(7)计算概率

[5]若满足终止条件,则结束迭代;否则修正λ:

λ(n+1)=λ(n)+1Cln(Ep^(fj)Ep(n)(fj))

其中,n为循环迭代次数,迭代终止条件可以是事先设定的迭代次数 (如100),也可以是变化值小于某个事先设定阈值ε(如0.0001)。。

[6]确定λ,计算每个

步骤3、将源代码输入到分类器,获取源代码中的词项,以及各个词项 的出现次数;

步骤4、除去获取到的词项中的保留字,并对剩余的词项进行分词和词 干化处理;

步骤5、根据词项所属的代码元素类型,分配各个词项的权重;

步骤6、根据降噪后的词项的权重和出现次数,用TF-IDF算法对降噪 后的词项进行重要性评估;其中,方法调用语句的权重<方法名的权重<类 名的权重<包名的权重;

步骤7、根据指定代码摘要中包含的最大词项数、重要性评估以及限定 的排序方式,生成代码摘要。

其中一种具体实施方式如下所示:

在该技术中,开发人员可以根据具体需求定制代码元素训练样本,通过 在训练集上进行学习,可以构建出基于最大熵模型的代码元素分类器。分类 器能够解析通过各种编程语言实现的源程序,并可从代码中识别用户所关注 的代码元素,进而能够抽取出组成各代码元素的词项。在得到代码元素中的 词项之后,词项预处理模块将会剔除其中可能包含的停用词和程序保留字, 并通过分词、词干化等操作压缩词项集合的规模并清除词项中的噪音。在此 之后,词项加权模块将会根据各词项所处的代码元素类型,对词项进行加权 进行,以将代码元素类型对词项的影响权重转换为词项在代码中出现的频 次。基于词项在代码中出现的频次,可以通过TF-IDF方法计算各词项的重 要性。最后,根据用户指定的摘要长度和词项排序依据,摘要生成模块将会 生成具有个性化且易于理解的代码摘要。

实现步骤1:为了自动生成代码摘要,首先需要识别出代码中最重要的 代码元素,例如类和方法等,从而可以不同词项在不同代码元素中出现的次 数来生成代码摘要。由于传统的语法树分析工具无法处理通过编程语言实现 的代码,以及用伪码编写的制品,本发明采用基于最大熵的代码元素分类器 来识别各种软件制品中的代码元素。基于最大熵的代码元素分类器的构建过 程包含训练阶段和识别阶段。在训练阶段将通过训练数据得到一个带权特征 库,在识别阶段利用这个特征库进行实体类型识别。可将源代码中的代码类 型识别视为一个分类问题,即针对源代码中不同词,根据其上下文标注其实 体类型。对于代码元素分类问题,一个代码元素分到某个类别可以视为一个 事件,代码元素的上下文可以看成这个事件发生的环境。以特征函数描述已 知的约束条件,特征函数一般可表示为一个二值函数f(a,b)→{0,1}。以特征 fi(a,b)为例,b对应词项上下文,主要包括出现在其前后的单词和符号,例 如用于识别属性名的上下文可以是“变量存在某个类中,且不在任何一个方 法中定义”;而a则是代码元素的类型标注。

通常而言,a的取值范围可以是{class,method,invocate,comment, param,normalText}。其中,“class”表示类声明,“method”表示方法声明, “invocate”表示方法调用,“comment”表示注释,“param”表示变量, “normalText”表示正常文本等。当用户不需要对代码进行特殊的处理时,可 以使用系统中已存在的基于最大熵的代码类型识别模型,从而减少该步骤的 工作量。而当用户需要扩展新的代码类型时,可以通过修改y的取值范围。 例如增加新的类型“mark”用于识别代码中用于标注的代码元素。 为了得到有效的命名实体识别模型,训练数据应至少要包含15000句如表1 所示的句子。以句子“public class<START:class>FieldWeightDialog<END> extends javax.swing.JDialog”为例,“<START”表示代码元素的开始位置, “<END>”表示代码元素的结束,“:class>”用于标注代码元素的类型。所有 的训练数据都可以通过类似的自定义类型模板,并利用抽象语法树(Abstract  SyntaxTree,AST)解析已有的软件项目,从而自动生成训练数据。

表1 训练样本模板

实现步骤2:

本步骤将利用训练样本构建一个能够对实际问题准确描述的分类器, 用于识别未知代码中的代码元素。对于分类问题,用A表示所有可能的代 码元素类型,B是代码元素所在上下文信息构成的集合,则可定义一个{0,1} 域上的一个二值函数来表示特征:

f(a,b)=10---(1)

其中如果(a,b)∈(A,B),且满足限定条件,则f(a,b)=1;否则,f(a,b)=0;若 将判定代码元素可能属于的类型a∈A看为一个事件,该代码元素所在上下 文信息看作该事件发生的条件b∈B,那么建立最大熵模型的目的就是计算 判定代码元素类型a的条件概率p(a|b),即利用最大熵模型选择条件概率 p(a|b)最大的候选结果作为最终的判定结果:

p^(a|b)=argmaxpPH(p)---(2)

式中,P是指所建模型中所有与已知样本中的概率分布相吻合的概率分布集 合。因为所建模型的概率分布p(b)必须符合已知训练样本中的概率分布即所以可将式(2)写为:

p^(a|b)=argmaxpPH(p)=argmaxpPH(A|B)=argmaxpPΣbBp(b)H(A|B=b)=argmaxpP(-Σa,bp^(b)p(a|b)logp(a|b))---(3)

如果存在某个特征fj(a,b),它在训练样本中关于经验概率分布的数 学期望为:

Ep^(fj)=ΣA,Bp^(a,b)fj(a,b)---(4)

假设存在k个特征fj(j=1,2,3...,k),则一个合理的概率分布模型p属于约 束所产生的如下模型集P:

P={p|Ep(fj)=Ep^(fj),1jk}---(5)

式中,是特征fj在样本中的期望值,Ep(fj)是特征fj概率分布p下的期望 值。由此,代码元素的分类问题就变成了满足式(5)表示的约束条件下求 解目标函数(3)的最优解。可证,满足上述条件的最优解具有如下形式:

p^(a|b)=1Z(b)exp(Σj=1lλj·fj(a,b))---(6)

式中,Z(b)=ΣAexp(Σj=1lλj·fj(a,b))---(7)

为归一化因子,使l=k+1,λj为特征fj的权重。

为了构建基于最大熵模型的分类器,本步骤可进一步具体为:

[1]初始化:λ[1…l]=0;

[2]根据公式(4)计算每个特征函数fj的训练样本期望值:

[3]执行如下循环,迭代计算特征函数的模型期望值Ep(fj);

[4]利用公式(6)和公式(7)计算概率若满足终止条件,则 结束迭代;否则修正λ:

其中,n为循环迭代次数,迭代终止条 件可以是事先设定的迭代次数(如100),也可以是变化值小于某个 事先设定阈值ε(如0.0001)。

[5]确定λ,计算每个

实现步骤3:

得到基于最大熵模型的分类器之后,便可将待分析系统的源代码作为输 入,通过分类器识别系统中的代码元素。为了简化后续的分析操作,可将分 类器输出的词项保存到数据库中,并记录各词项所属的代码元素类型,出现 的次数等。当词项出现在不同的代码元素时(例如同时出现在类名和注释 中),数据库将对其分别记录。通过这种方式便可为后续的词项处理提供一 个统一的数据访问接口。

步骤4:

与一般的文本不同的是,程序中包含了大量的短字符(例如经常在循环 词句中经常出现的i和j)。同时,为了提高程序的可读性,开发人员常用 多个词为方法命名,例如将“deleteFile”作为方法名。对于前者,本技术通过 删除过短字符达到目标。而对于后者,则利用业界提供的各种分词工具将一 个由多个词组合起来的词项进行切分。除了一般文本中包含的停用词之外, 代码中还包含着一系列已定义,且含有特殊意义的程序保留字(或称关键 字)。因此,除了去除停用字之外,还需要删除程序保留字。对于多数的程 序而言,其中包含大量的英文词项。而英文单词常由前缀、词根和后台缀等 部分组成具体到句子中,单词还有性、数、格以及时态引起的词形变化。但 实际上,一个单词的不同词形往往可以认为是在表达同一个意思。因此,有 必要通过词干化处理进一步减少待处理的关键词集合的数量。

步骤5:

在降噪之后需要根据词项所属的代码元素类型对其进行加权。考虑到方 法调用语句通常是代码的主体,可取位于该类型的词项权重为基准权重(例 如1),其他代码元素类型的权重取相对值。得到不同代码元素类型的权重 值之后,加权处理模块将依据权重值对词项集合进行更新,以通过词项出现 频次直观地展现词项的重要性(例如在类名中出现1次的词项标记为10次), 进而方便后续的词项重要性分析。

以类名的权重为方法调用的10倍为例,在如下代码

其中,reload和Languages出现在方法调用语名中,因此标注它们出现 的次数为1;而Buddi和Translator出现在类名中,因此虽然它们只出现了1 次,但加权处理模块会认为这两个词项在代码中出现的次数为10。

步骤6:

本技术采用TF-IDF(term frequency-inverse document frequency)来评估 源程序中各个方法体内不同单词的重要程度。在TF-IDF中,单词的重要性 随着它在方法体中出现的次数成正比,但同时会随着它在源程序中不同方法 内出现的频率成反比。可通过公式计算方法中某一词项的重要性。 其中,m表示单词在该方法体中出现的次数,∑kmk表示该单词在所有方法体 中出现的频率。

步骤7:

开发人员在为代码作摘要时,往往只会使用少量的单词。特别是对于一 些代码行数较多的方法而言,在经过上述多个步骤的分析之后,仍有可能存 在较多的词项。因此,本技术提供了一个摘要生成模块以生成规模适中的代 码摘要。在该模块中,用户可以指定代码摘要中包含的最大词项数,以及偏 好的排序方式(例如按字母顺序或按重要性),生成更加友好和易读的代码 摘要。

虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人 员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发 明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的 修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号