一种基于深度学习的代码提交自动分类方法技术

技术编号:39434350 阅读:16 留言:0更新日期:2023-11-19 16:17
本发明专利技术涉及一种基于深度学习方法的代码提交自动分类方法,属于自动化软件工程技术领域。该方法使用双向的Transformer编码器表示从代码提交的变更描述中提取文本特征,并从代码提交的代码变更中提取其修改模块的细粒度代码行变化特征。通过多模态适应门机制等方法将文本特征与代码特征进行融合,对融合后的代码特征使用多层感知机进行分类。本发明专利技术在相同数据集下,分类性能(准确率和宏观均值F1)均高于现有方法;能够跨不同编程语言工作,也可以在复杂的多语言项目中工作。在复杂的多语言项目中工作。在复杂的多语言项目中工作。

【技术实现步骤摘要】
一种基于深度学习的代码提交自动分类方法


[0001]本专利技术涉及一种基于深度学习的代码提交分类方法,属于自动化软件工程


技术介绍

[0002]代码提交(commit)是指在使用版本控制系统(如Git)时,软件开发者将当前工作目录的修改进行保存,向版本控制系统提交以形成一个新的项目版本的过程。这是软件开发者对软件项目进行开发和维护的一个基本过程,一个软件项目正是由一个个代码提交不断演化,以适应外界各种需求的变化。
[0003]理解软件迭代的动机,可以帮助开发者更好地管理需求变更,控制风险和提高开发效率,从而降低维护成本。为了更好地研究软件迭代演化的过程,提高软件的质量,近些年来有很多工作着手于研究代码提交的自动分类问题。
[0004]本专利技术基于Ghadhab等人的方法进行改进,他们的方法是目前代码提交自动分类技术中分类性能最好的,但是仍然存在一定的局限性。
[0005]1、他们的方法虽然利用基于Transformer的双向编码表示(BERT)对代码提交中的变更描述(commit message)进行特征提取,但是并没有将BERT在下游任务中进行微调,BERT的编码向量不能完全捕获代码提交自动分类任务中所需要的特征,因此分类的性能不高。
[0006]2、他们的方法基于fixminer等工具从源代码变更中挖掘代码特征,但由于这些工具的限制,他们的方法仅局限于Java语言,无法跨语言使用,也就无法在复杂的多语言的软件项目中使用。
[0007]3、他们的方法将BERT的特征向量与fixminer等工具提取的代码特征直接拼接后方法,这种特征融合方法会给特征表示带来冗余和噪声,进而降低模型的性能表现。
[0008]为了解决上述问题,本专利技术设计了一个神经网络,基于BERT对代码提交中的变更描述进行特征提取,同时将BERT加入到模型的训练中,以让BERT在下游任务中进行微调。同时,本专利技术设计了一个细粒度的代码行变化特征来对代码提交中的代码变更进行建模,这种特征是语言无关的,可以跨语言使用。此外,本专利技术采用了多模态适应门等特征融合方法将两种模态的特征进行融合方法,进一步提高了模型等分类性能。

技术实现思路

[0009]本专利技术的目的在于针对当前代码提交自动分类准确率较差,且无法跨不同编程语言工作的问题,提出了一种基于深度学习的代码提交自动分类方法。
[0010]本专利技术的目的是通过以下技术方案实现的。
[0011]一种基于深度学习的代码提交自动分类方法,包括:
[0012]步骤1:数据收集
[0013]数据收集包括人工标注微调的数据集和从GitHub上自动生成预训练数据集两个
子步骤。
[0014]步骤2.1:人工标注微调数据集
[0015]从GitHub上随机采样代码提交记录。为了避免人工标注带来的主观偏差,让两个熟悉Git工具和代码提交类别的开发者对采样的代码提交记录进行安装Mockus等人对代码提交自动分类的定义所提出的规则进行独立标注。在他们标注的过程中,一个代码提交记录可以被标注为修复性(Corrective),改进性(Perfective)和适应性(Adaptive)中的一种,当他们遇到不确定的代码提交记录时,则标以#uncertain标签。在两个开发者标注完成后,对他们的标注结果计算一致性Kappa系数,从而判断两个开发者标注的一致性,计算结果为0.65。业界认为,一致性Kappa系数在0.61到0.80之间,表示两个标注人员所标注的结果具有高度一致性,0.81到1.00则表示两个标注人员所标注的结果具有完全一致性。最后,让两个开发者对标注结果中不同的部分(包括#uncertain标签)进行讨论和修改,剔除掉无法统一的数据,最后得到了微调数据集。
[0016]步骤1.2:自动生成预训练数据集
[0017]目前开源社区主流的约定式提交需要在代码提交描述的开头写上本次修改所属的类别,这些类别包括:build,chore,ci,docs,style,refactor,perf,fix,feat,test和revert。除了revert类别,这些类别的定义可以明确地规约到代码提交自动分类任务的三个类别中。chore类别是非功能性修改的统称,对应软件开发中一些非功能修改的琐碎任务,如格式化代码、修改注释、清理代码等活动。这些修改能够提高软件系统的可读性和可维护性,属于改进性(Perfective)类别。build类别表示与代码编译和库依赖相关的更改,通常是为了生成可执行文件或者库文件。这些修改对应软件开发中代码打包、文档生成等活动,能够提高软件系统的可部署性和可重复性,属于改进性(Perfective)类别。ci类别表示与持续性集成相关的变更,用于确保代码在持续集成系统中正确构建、测试和部署。这些修改能够提高软件系统的稳定性和可靠性,属于改进性(Perfective)类别。docs类别表示文档文件的修改,例如API文档、用户手册或其他技术文档的修改。这些修改可以让用户更好地了解如何使用软件,让开发者更好地进行协作开发,属于改进性(Perfective)类别。style类别表示对代码风格的修改。这类修改不改变代码的语义,这些修改能提供代码的可读性和风格的一致性,属于改进性(Perfective)类别。refactor类别表示代码重构的变更,即对代码的结构、设计或者实现进行修改,以提高其可读性、可维护性或者其他方面的质量,属于改进性(Perfective)类别。perf类别表示对代码性能的提高,例如改进算法、减少占用资源等。因为这些修改并不涉及功能的引入,属于改进性(Perfective)类别。test类别表示与软件测试相关的变更,例如增加新的测试用例、修复测试用例等,以提高软件的稳定性和可靠性,属于改进性(Perfective)类别。revert类别代表对软件项目进行回退。通常由于在前面的开发历史中引入了一些错误或者不必要的代码提交,通过回退以撤销这些更改。这是一个特殊的类别,本专利技术不考虑revert类别。feat类别表示新功能的添加,属于适应性(Adaptive)类别。fix类别表示对功能性错误进行修复,属于修复性(Corrective)类别。
[0018]将revert类别剔除,剩下十种类别都可以明确规约到代码提交自动分类任务的三种类别中。本专利技术在GitHub上按照Star数量排序,选择目前主流十种编程语言,包括C,Python等,选择Star数量最高的前二十个仓库,并对这些仓库进行人工筛选,排除掉一些资
料分享,教程类的非软件工程项目。将筛选出来的仓库下载到本地,对其开发代码提交历史进行筛选,选择符合约定式提交格式的代码提交记录通过上述方法识别其类别,并自动生成对应的分类标签,得到用于预训练的数据集。
[0019]步骤2:特征提取。
[0020]在本步骤中,对步骤1.1和步骤1.2的代码提交数据集进行特征提取,本专利技术对代码提交记录进行两方面的特征提取,即包括来自代码提交变更描述信息的文本特征本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于深度学习的代码提交自动分类方法,其特征包括:步骤1、数据收集;步骤1.1:人工标注微调数据集;步骤1.2:自动生成预训练数据集;步骤2、特征提取;对步骤1.1和步骤1.2的代码提交数据集进行特征提取,所提取的特征将被用于步骤3的特征融合中;步骤2.1:代码提交的文本特征提取;使用基于Transformer的双向编码表示(BERT)对代码提交变更描述的文本进行特征提取;首先将变更描述的文本使用分词器划分成一系列的单词,然后将这些单词映射成一个向量,将这些向量输入到BERT中,最后选择BERT输出到对应[cls]单词的向量,将这个向量作为整段变更描述文本的特征向量;步骤2.2:代码提交的代码特征提取;将代码提交中所更改的文件划分为代码文件类别、测试文件类别和文档文件类别;对于代码文件类别和测试文件类别,因为其中的内容属于编程语言代码,而编程语言代码中的每一行有不同的功能,因此本发明将代码文件的代码行分为三种类别,即代码行,注释行和空行;代码行表示了代码本身的功能,注释行提高了代码行的可读性,而空行是一种特殊的注释行,本身并不提供信息,而是用于格式化代码;对于代码文件类别和测试文件类别,分别统计代码提交记录中所有属于代码文件类别和测试文件类别的更改中,代码行增加和减少的总量,注释行增减和减少的总量,空行增加和减少的总量,并分别计算代码行增减减少的差值,注释行增加减少的差值,空行增加减少的差值,让模型可容易学到代码...

【专利技术属性】
技术研发人员:曾群鸿张宇霞刘辉
申请(专利权)人:北京理工大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1