本发明涉及程序理解、神经网络技术领域,尤其涉及一种基于神经网络模型的代码注释分类方法。
背景技术:
近年来,随着软件产业的发展,软件的规模和复杂性在不断提高,软件的生命周期也越来越长。软件系统中的大量源代码包含注释,记录了程序员的实现,并帮助开发人员了解代码。代码注释在软件维护和程序理解中扮演了重要的角色,有研究表明,质量良好的代码注释可以显著提高开发和维护人员对程序理解的效率。因此,提高代码注释的质量将有效提高软件的可维护性,进而提高软件的质量。
目前分析软件质量的方法基本都忽略了注释,或者只计算源代码中注释和代码的比例的定量的计算。然而,这种衡量方法远远不够,因为很多注释往往都跟源代码没有关系,比如版本信息等,这些注释在衡量软件质量的时候应该排除。而且,不同注释的作用并不完全相同的。有的注释是提供实现理由,有的则是程序员给自己添加提醒,还有的是编程工具自动生成的等等。所以,对代码注释自动进行分类将对软件质量评估有很大帮助。
常见的注释自动分类方法,主要分为以下两类:基于注释在代码中的位置信息进行分类和基于传统机器学习的分类方法。基于注释在代码中的位置进行分类的方法比较局限,只能对特定的注释进行分类,会遗漏其他位置信息比较特殊的注释。基于传统的机器学习的分类可以处理不同类型和不同格式的注释,但其比较依赖于模型的特征选择,且容易对训练数据过拟合,对训练数据的噪声比较敏感,对其他新的数据没有很好的泛化能力。
基于注释位置信息的分类方法比较局限,通常只能将注释分成类注释和方法注释等,其对他注释没有进行分类。基于传统的机器学习的代码注释分类方法可以对不同的注释进行分类,但其分类的准确率太过依赖于分类器中特征的选择,而这些特征选择往往过于依赖人的主观判断,或者过于依赖训练集的特征抽取。现有的基于传统的机器学习的代码注释分类方法只考虑到了代码注释的文本特征,而没有考虑注释的语义信息等,分类的准确率会受到一定的局限。而且基于传统的机器学习,比如随机森林,训练集一般比较小,对训练集中的噪声会过于敏感,常常会导致一定程度的过拟合,对新的注释的泛化能力不强。
技术实现要素:
本发明的目的在于克服现有技术的不足,本发明提供了一种基于神经网络模型的代码注释分类方法,在本发明实施例,通过既考虑了注释的上下文特征,又考虑了注释的语义特征,把注意力按单词重要性权重进行分配,能够更好得表征文本,分类也更准确。相比于其他技术的实现,更适用于各种类型的注释的分类。
为了解决上述技术问题,本发明提供了一种基于神经网络模型的代码注释分类方法,所述方法包括:
构建一个注释的语料库,给每个注释单词生成一个词向量表示;
对注释进行分类,并人工定义类别;
对注释进行预处理和词嵌入处理,获得每个单词的250维词向量;
将每个单词的250维词向量输入分类模型进行分类处理,获得分类结果。
优选地,所述的构建一个注释的语料库,给每个注释单词生成一个词向量表示步骤包括:
从开源项目中抽取出注释,并进行分词;
将每个注释构成一个文档,构建一个注释的语料库;
对语料库进行训练,给每个注释单词生成一个词向量表示,其公式表示为:
其中,wi+j表示在一个长度为2k+1的上下文窗口里的单词,n表示文本总长度,logp(wi+j|wi)是给定wi预测wi+j的概率。
优选地,在对语料库进行训练时,将k设置为2,学习速率初始化为0.001,词向量维数设为250。训练完该词向量模型后,得到每个单词的向量表示。
优选地,所述对注释进行分类,并人工定义类别,包括:
描述性注释:描述所对应代码段的功能或行为的注释。
建议性注释:给使用者或读者提供建议的注释;
警告性注释:给使用者或读者显式警告的注释;
异常类注释:解释抛出异常的原因的注释;
开发性注释:开发阶段的注释;
含代码的注释:被注释掉的代码,将代码封装在注释中,以便尝试隐藏的功能或某些正在进行的工作;
格式类注释:用来分隔代码,格式化代码的注释;
元数据类注释:定义元数据的注释;
自动生成的注释:由集成开发环境工具自动生成的注释;
其他注释:不属于以上九种注释的注释,基本上是一些难以理解的符号。
优选地,所述对注释进行预处理和词嵌入处理的步骤,包括:
对每条注释进行分词处理,获得分词注释;
对分词注释进行停用词过滤处理,获得过滤后的分词注释;
对过滤后的分词注释进行词性转换处理,获得转换后的单词;
将转换后的单词进行词嵌入处理,获得每个单词的250维词向量。
优选地,进行所述对注释进行预处理和词嵌入处理的步骤的同时还构建训练集、验证集和测试集。
优选地,进行所述将每个单词的250维词向量输入分类模型进行分类处理的步骤之前还需要对分类模型进行训练,包括:
使用输入词和过去隐层状态利用双向长短时记忆网络来产生新的记忆,包括了新词;
根据输入词和过去隐层状态利用输入门共同判定输入值是否值得保留,是则对新的记忆一个约束,否则结束;
通过遗忘门对过去记忆单元是否对当前记忆数据的计算有用做出评估,是则再根据输入门的作用结果,产生新记忆;否则忘记部分过去的记忆;
根据两种结果加融合起来产生最终的记忆;
通过输出门从隐层状态分离最终的记忆,然后在此基础上,引入一个注意力机制,最终获得一个最优的分类模型。
在本发明实施例中,通过既考虑了注释的上下文特征,又考虑了注释的语义特征,把注意力按单词重要性权重进行分配,能够更好得表征文本,分类也更准确。相比于其他技术的实现,更适用于各种类型的注释的分类。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明实施例中的一种基于神经网络模型的代码注释分类方法流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明实施例的一种基于神经网络模型的代码注释分类方法流程示意图。如图1所示,所述方法包括:
s1,构建一个注释的语料库,给每个注释单词生成一个词向量表示;
s2,对注释进行分类,并人工定义类别;
s3,对注释进行预处理和词嵌入处理,获得每个单词的250维词向量;
s4,将每个单词的250维词向量输入分类模型进行分类处理,获得分类结果。
在具体实施例中,我们事先从开源版本库中提取海量注释,获得注释数据集。
进一步地,s1中所述的构建一个注释的语料库,给每个注释单词生成一个词向量表示步骤包括:
s11,从开源项目中抽取出注释,并进行分词;
s12,将每个注释构成一个文档,构建一个注释的语料库;
s13,对语料库进行训练,给每个注释单词生成一个词向量表示,其公式表示为:
其中,wi+j表示在一个长度为2k+1的上下文窗口里的单词,n表示文本总长度,logp(wi+j|wi)是给定wi预测wi+j的概率。
在对语料库进行训练时,我们将k设置为2,学习速率初始化为0.001,词向量维数设为250。训练完该词向量模型后,我们得到每个单词的向量表示。
s2中,我们人工定义了十种注释类别,包括:
描述性注释:描述所对应代码段的功能或行为的注释。这类注释通常是描述该段代码的目的,或者提供代码实现的细节,比如变量声明的细节,或者是用来描述代码实现的原因,来解释某些选择,模式或选项背后的基本原理等。一般注释全文使用自然语言表达。
建议性注释:给使用者或读者提供建议的注释。这类注释通常为使用注释对应代码的开发人员提供一些可行性建议,通常夹杂一些代码片段等,或者有一些标注,比如@usage,@return等。
警告性注释:给使用者或读者显式警告的注释。这类注释通常出现在可选的函数或类之前。
异常类注释:解释抛出异常的原因的注释。这类注释通常有@throw或者@exception字样,解释异常原因或避免该异常出现的建议。
开发性注释:开发阶段的注释。这类注释涵盖当前或未来开发的内容,包含错误分析和解决方案,或已经处理和修复的笔记,还有明确未来要完成的工作,比如todo注释。
含代码的注释:被注释掉的代码,将代码封装在注释中,以便尝试隐藏的功能或某些正在进行的工作。通常,这种类型的注释代表测试中的功能或临时删除的代码。
格式类注释:用来分隔代码,格式化代码的注释。
元数据类注释:定义元数据的注释。这类注释提供代码作者信息,版本信息等。
自动生成的注释:由集成开发环境工具自动生成的注释,比如javaeclipse中的“auto-generatedmethodstub”等。
其他注释:不属于以上九种注释的注释。基本上是一些难以理解的符号。
进一步地,s3包括:
s31,对每条注释进行分词处理,获得分词注释;
s32,对分词注释进行停用词过滤处理,获得过滤后的分词注释;
s33,对过滤后的分词注释进行词性转换处理,获得转换后的单词;
s34,将转换后的单词进行词嵌入处理,获得每个单词的250维词向量。
进一步地,s3还构建训练集、验证集和测试集。
具体地,进行s4之前还需要构建分类模型并进行训练,包括:
使用输入词和过去隐层状态利用双向长短时记忆网络来产生新的记忆,包括了新词;
根据输入词和过去隐层状态利用输入门共同判定输入值是否值得保留,是则对新的记忆一个约束,否则结束;
通过遗忘门对过去记忆单元是否对当前记忆数据的计算有用做出评估,是则再根据输入门的作用结果,产生新记忆;否则忘记部分过去的记忆;
根据两种结果加融合起来产生最终的记忆;
通过输出门从隐层状态分离最终的记忆,然后在此基础上,引入一个注意力机制,最终获得一个最优的分类模型。
该模型的主要参数设置为:双向长短时记忆网络的输入层数为24,隐藏层数为48,使用adam优化器,学习速率为0.001。
在本发明实施例中,通过既考虑了注释的上下文特征,又考虑了注释的语义特征,把注意力按单词重要性权重进行分配,能够更好得表征文本,分类也更准确。相比于其他技术的实现,更适用于各种类型的注释的分类。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取存储器(ram,randomaccessmemory)、磁盘或光盘等。
另外,以上对本发明实施例所提供的一种基于神经网络模型的代码注释分类方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。