CN110413319B - 一种基于深度语义的代码函数味道检测方法 - Google Patents
一种基于深度语义的代码函数味道检测方法 Download PDFInfo
- Publication number
- CN110413319B CN110413319B CN201910705359.1A CN201910705359A CN110413319B CN 110413319 B CN110413319 B CN 110413319B CN 201910705359 A CN201910705359 A CN 201910705359A CN 110413319 B CN110413319 B CN 110413319B
- Authority
- CN
- China
- Prior art keywords
- code
- function
- name
- input
- output
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/35—Clustering; Classification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/24—Classification techniques
- G06F18/241—Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/77—Software metrics
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Life Sciences & Earth Sciences (AREA)
- Databases & Information Systems (AREA)
- Artificial Intelligence (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Bioinformatics & Computational Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Evolutionary Biology (AREA)
- Evolutionary Computation (AREA)
- Machine Translation (AREA)
Abstract
本发明涉及一种基于深度语义的代码函数味道检测方法,属于自动化软件重构技术领域。通过提取文本信息和结构化信息中的语义特征和数字化特征,包括模型训练以及模型测试;模型训练包括代码函数表示A、结构化特征提取A和代码味道分类A;包括代码函数表示B、结构化特征提取B和代码味道分类B;代码函数表示A和代码函数表示B是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取A和结构化特征提取B是基于卷积神经网络的结构化特征提取;代码味道分类A和代码味道分类B是基于多层感知机的代码味道分类提出了一种基于深度学习的函数级代码味道检测方法。在较小的检测时间下,能够保证检测结果具有较高的召回率和精确度。
Description
技术领域
本发明涉及一种基于深度语义的代码函数味道检测方法,属于自动化软件重构技术领域。
背景技术
软件项目的源代码的质量一直是现代软件工程领域中的一个关键性的质量问题。在众多质量问题当中最严重的就是代码味道问题。在软件开发过程中,代码味道的存在往往会导致严重的软件质量问题和软件维护问题。代码味道的概念是由Fowler提出的,他介绍了22种类型的代码味道,其中包括著名的feature envy和long method。
代码味道检测已经成为发现源代码(或设计)中需要通过软件重构来纠正的问题的一种重要方法,其目的是提高软件的质量。然而大多数软件项目拥有大量的源代码和复杂的代码结构,而且不同的开发者拥有不同的代码风格;因此依靠人工检测的方式去识别代码是十分困难的。为了降低软件味道的检测成本,许多自动化或半自动方法已经被发明来检测软件味道。
大多数软件味道的检测方法只依赖依靠启发式规则从源代码中提取出来的结构化的信息(代码度量)。然而代码度量只包括前如在源代码中的数字化特征,而且人们对于代码味道定义的理解是十分主观的。因此人工构建规则去检测代码味道是十分困难的,而且带有强烈的主观偏见性。为了解决有关代码味道的共识模糊的问题,同时为了提高代码味道识别的便捷性,基于传统的机器学习的方法已经被提出,例如SVM,J-48,和朴素贝叶斯等方法。这些方法能够额外的提供主观性,来避免人们对代码味道的认识不同的问题,同时这些方法能够自动地从代码度量中提取相应的特征完成对代码味道的识别。然后一些研究证明,当同时检测两种或者更多种代码味道时,这些基于传统的机器学习的方法并没有很好地表现。
最近基于深度学习的技术已经广泛在各个被使用,例如自然语言处理、计算机视觉、推荐系统等。深度学习等技术得架构是基于多层神经网络的,其目的主要贡献在于可以对高维数据进行有效的建模。与基于传统的机器学习技术不同,深度学习技术提供了从低到高的多层次的数据抽象,并在深度特征提取上取得了更好的表现。最近深度学习技术已经成功应用于代码味道检测当中。刘辉等人提出了一种基于深度学习的featureenvy检测方法,这种方法虽然将一些文本信息用于代码味道检测中,但是并没有考虑到嵌入在不同代码层级的语义联系。
发明内容
本发明的目的是针对软件重构领域已有的代码味道检测方法需要人工构建相应的启发式规则,不能自动地提取代码中的相关特征等技术缺陷,提出一种基于深度语义的代码函数味道检测方法。
本发明是通过以下技术方案实现的。
一种基于深度语义提取的代码函数味道检测方法包括模型训练以及模型测试;
其中,模型训练包括代码函数表示A、结构化特征提取A和代码味道分类A;模型测试包括代码函数表示B、结构化特征提取B和代码味道分类B;
代码函数表示A和代码函数表示B是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取A和结构化特征提取B是基于卷积神经网络的结构化特征提取;代码味道分类A和代码味道分类B是基于多层感知机的代码味道分类;
其中,所述代码函数表示A和代码函数B的操作为:对被检测的代码函数基于注意力机制和LSTM神经网络对代码函数进行特征表示并进行语义特征提取,具体为:
步骤1:将被检测的代码函数所在的项目名、包名、类名和函数名作为一个元组拼接在一起,输出代码标识符,作为深度语义提取的文本输入,用公式(1)中的符号textual_input表示:
textual_input=<namepr,namepa,namec,namem> (1)
其中,namepr代表代码函数所在的项目名;namepa代表代码函数所在的包名;namec代表代码函数所在的类名;namem代表代码函数所在的函数名;
且namepr,namepa,namec以及namem统称代码标识符;
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各个代码标识符进行分词,再对分词后的长度进行统一并拼接表示;
经步骤2分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为q,q的取值范围为4-10;
对分词后的长度进行统一并拼接表示,具体为:
步骤2.1若代码标识符所包含的单词数超过了q,则将多出的单词删除,若代码标识符所包含的单词数少于q,则将空余部分用0补齐;
步骤2.2将得到的<namepr,namepa,namec,namem>此4个单词序列拼接起来得到一个长单词序列,该长单词序列所包含的单词数应为4个级别的代码标识符所分单词数的和;
minput=concat(namepr,namepa,namec,namem) (2)
=concat(w1,w2,···,wn), (3)
其中,namepr、namepa、namec和namem分别表示代码函数所在的项目名、包名、类名和函数名,wi为相对应的代码标识符分解出的单词,下标i的取值范围为1到n,n代表wi的数量,其取值范围为16到40;
concat(·)为将输入连接起来的函数,且concat(w1,w2,···,wn)表示将w1,w2,···,wn连接起来;
其中,长单词序列所包含的单词n的数量是4q个;
步骤3:根据步骤2输出的minput,将minput长单词序列转换为一个包含有n个单词的长句子,将句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;
其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;
单词嵌入层将每一个单词转换为单词向量,表示如公式(4):
V(minput)=V(concat(w1,w2,···,wn))
=concat(V(w1),V(w2),···,V(wn)) (4)
其中,V(·)表示单词嵌入函数,即将输入的·转换为相对应的单词向量;V(wi)表示将wi转换为一个单词向量,下标i的取值范围为1到n;
优选的单词嵌入函数为Word2vec;公式(4)表明将minput转换为单词向量,等价于将minput所包含的每一个wi转换为对应的单词向量V(wi),再将n个单词向量经concat(·)函数连接起来;
步骤4:将步骤3输出的V(m_input)单词向量输入到LSTM层以提取句子m_input中各单词间的上下文关系并从这些关系中获得相关的语义特征,输出LSTM层的隐藏层状态h;
其中,LSTM层使用三个门去控制LSTM单元中的状态流;对于每一个时间状态t,通过给定的单词向量V(wt),当前的单元状态ct和隐藏层状态ht通过先前的单元状态ct-1和隐藏层状态ht-1基于(5)-(8)进行更新;
其中,t的取值范围为0-n;
其中,it、ft和ot是范围在0-1的三个激活状态;
步骤5:将步骤4的输出的LSTM层隐藏层状态h输入到一个自注意力机制层,输出上下文语义特征m;
步骤5中,选用自注意力机制层的原因为:不是所有的隐藏层状态都能平等的反应隐藏在代码中的语义特征,利用自注意力机制层可以自动的选择出对代码味道检测有着重要影响的上下文语义特征;
其中,上下文语义特征由步骤4中的隐藏层状态的权重和组成,由符号m表示(9):
其中,n对应着单词序列中的单词数量,即4q,n的取值范围是16-40;
ht是句子序列中的第t个单词对应的隐藏层状态,即表示时间状态t对应的隐藏层状态;at是ht的注意力权重,表示第t个隐藏层状态对代码气味检测的重要程度;
对应着每一个隐藏层状态的注意力权重at定义如公式(10)-(11):
e(ht)=W1 tanh(W2ht) (10)
其中,W1和W2为权重矩阵,e(·)是一种计算隐藏层状态对代码味道检测重要程度的分数函数,tanh(·)是一种非线性激活函数,ht表示句子序列中的第t个单词对应的隐藏层状态,t的取值范围是0-n;
经过步骤1到步骤5,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取;
所述结构化特征提取A和结构化特征提取B的操作是:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息进行结构化特征提取,具体为:
步骤6:利用代码重构工具对需要检测的代码进行结构化信息提取,从而得到相应的代码度量;
步骤7:对步骤6输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input;
将所有的代码度量分为4组,按照项目、包、类和函数的包含顺序连接起来,作为结构化特征提取部分的输入;
其中,结构化信息由metric_input表示:
metric_input =concat(grouppr,grouppa,groupc,groupm) (12)
=concat(m1,m2,…,mx). (13)
其中,grouppr、grouppa、groupc和groupm分别表示项目、包、类和函数对应的代码度量,x表示结构化信息metric_input包含代码度量的总数,mi表示结构化信息中的第i个代码度量,i的取值范围为1到x;
步骤8:将步骤7输出的结构化信息metric_input输入到卷积神经网络模型CNN中,得到对应的结构化特征outputl3;
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3;
将结构化信息metric_input转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1;
在卷积层1中,使用256个过滤器去获得结构化输入的多维特征,每个过滤器的大小设置为1*1;
卷积层1中的每一个卷积操作包括一个过滤器Wl1(),这个过滤器作用于一个代码度量上去生成一个新的特征;
卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
ci=tanh(Wl1(j)·mi+bl1(j)). (14)
其中,i的取值范围为1-256,Wl1(j)表示i个卷积操作中的第j个过滤器的权重矩阵,bl1(j)是第j个过滤器的偏置参数,其中j的取值范围为1-256,tanh(·)是一个非线性的激活函数,mi表示metric_input中的一个代码度量;
在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配,记为Cl1(i);
特征匹配Cl1(i)和卷积层1表示为(15)到(16):
Cl1(i)=[c1,c2,…,cn], (15)
outputl1=CNN1(input)
=[Cl1(1),Cl1(2),…,Cl1(256)]. (16)
CNN1()表示卷积层1对应的卷积函数,input表示输入的代码度量,outputl1表示卷积层1的输出;
接下来,将卷积层1的输出输入到卷积层2中,然后将卷积层2的输出输入到卷积层3中;
卷积层2有128个过滤器,卷积层3有64个过滤器;
卷积层2和卷积层3的输出表示为(17)到(18):
outputl2=CNN2(outputl1)
=[Cl2(1),Cl2(2),···,Cl2(128)], (17)
outputl3=CNN3(outputl2)
=[Cl3(1),Cl3(2),···,Cl3(64)]. (18)
其中,Cl2(i)表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128,CNN2(·)表示卷积层2的卷积函数,outputl2表示卷积层2的输出,Cl3(i)表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-64,CNN3(·)表示卷积层3的卷积函数,outputl3表示卷积层3的输出;
步骤9:将步骤8输出的结构化特征outputl3输入到一个扁平操作中,将通过卷积神经网络提取出的结构化特征outputl3转变为一个一维向量;
经过步骤6至步骤9的操作,完成了结构化特征提取;
所述代码函数味道分类是在基于注意力机制和LSTM神经网络代码函数表示操作和基于CNN的结构化特征提取的基础上进行的,利用多层感知机神经网络模型将提取到的深层特征包括语义特征和结构化特征与代码味道检测结果自动地匹配起来,完成分类模型的训练,具体为:
步骤10:将步骤5输出的上下文语义特征和步骤9输出的结构化特征在全连接层连接起来,得到多层感知机模型的输入;
步骤11:将步骤10的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的上下文语义特征和从代码度量信息中提取出的结构化特征映射到单个输出中;
多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道;该输出层的激活函数为sigmoid函数;
步骤12:将步骤11的输出结果与数据集中的标签相比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练;
其中,binary_cross_entropy损失函数表示为(19):
至此,从步骤1到步骤12,完成了模型训练;
其中,步骤1到步骤5,对应模型训练中的代码函数表示A;步骤6到步骤9,对应模型训练中的结构化特征提取A;步骤10到步骤11,对应模型训练中的代码函数味道分类A;
模型测试与步骤1到步骤11完全相同,其中,步骤1到步骤5,对应模型测试中的代码函数表示B;步骤6到步骤9,对应模型测试中的结构化特征提取B;步骤10到步骤11,对应模型测试中的代码函数味道分类B;
模型训练结束后,再根据步骤1到步骤11所描述的过程,完成对代码函数的代码味道检测测试,得到代码味道检测结果。
有益效果:
一种基于深度语义的代码函数味道检测方法,与现有代码味道检测方法相比,具有如下有益效果:
1.所述代码味道检测方法与基于启发式规则的代码味道检测方法相比,能够自动地提取代码中的特征信息,消除了人工提取特征的步骤,降低了人力成本;
2.所述代码味道检测方法与基于启发式规则的代码味道检测方法相比,能够将提取出的特征信息与检测结果自动匹配,减少了人工设计规则的时间和人力成本;
3.所述代码味道检测方法与基于度量的代码味道检测方法相比,除了加入已有代码度量中的结构化信息,还加入了源代码中的文本信息,利用文本信息中的上下文语义关系对代码味道进行更深入的检测;
4.所述代码味道检测方法与基于传统机器学习的代码味道检测方法相比,提高了检测的精准率和查全率。
附图说明
图1为本发明一种基于深度语义的代码函数味道检测方法代码函数表示部分的结构图;图从下到上分别表示代码函数标识的输入层,单词序列层,单词潜入层、单词向量层、LSTM层、自注意力机制层以及输出层;代码函数表示的输入为四种代码标识符,即项目名、包名、类名和函数名;代码函数表示的输出为从代码函数中提取的上下文语义特征;
图2为本发明一种基于深度语义的代码函数味道检测方法结构化特征提取部分的结构图;图从左到右分别表示结构化特征提取的输入层、CNN神经网络模型、扁平层;其中,结构化特征提取的输入为4组代码度量;CNN神经网络包含3层卷积操作,包括Cnn1,Cnn2和Cnn3。
图3为本发明一种基于深度语义的代码函数味道检测方法基于多层感知机分类器的结构图;图中①表示代码函数表示部分;图中②表示结构化特征提取部分;图中③表示基于多层感知机的代码味道检测部分;其中,①和②的详细结构图分别为图1和图2;③中从上到下分别为全连接层、多层感知机层和输出层;全连接层将①和②的输出连接起来,多层感知机层自动的将①输出的上下文语义特征和②输出的结构化特征于分类结果进行匹配,输出层通过sigmoid激活函数将结果分为两类,即存在代码味道和不存在代码味道。
具体实施方式
根据上述技术方案,下面通过具体实施例对本发明一种基于深度语义的代码函数味道检测方法进行详细说明。
实施例1
本实例采用本发明提出的方法建立一个基于深度语义的代码函数味道检测系统,该检测系统采用Python开发平台,Tensorflow资源库。采用来自github上的软件测试工具Junit项目提供的源代码,Junit开源项目的地址为https://github.com/junit-team/junit4。
利用代码重构工具PMD将Junit项目源代码中所有函数的相关信息提取出来,并且分为训练集和测试集。模型训练和模型测试的具体步骤如下:
其中,模型训练包括代码函数表示A、结构化特征提取A和代码味道分类A;模型测试包括代码函数表示B、结构化特征提取B和代码味道分类B;
代码函数表示A和代码函数表示B是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取A和结构化特征提取B是基于卷积神经网络的结构化特征提取;代码味道分类A和代码味道分类B是基于多层感知机的代码味道分类;
代码函数表示的操作是:
步骤1):对所有Junit源代码中函数相关的项目名、包名、类名和函数名进行提取,并作为一个元组拼接在一起。例如Junit项目中有runnerForClass()函数,此函数所在的项目连带项目所在地址为:/mnt/qualitas/qualitas_corpus_compile/junit-4.10,此函数所在的包名为:org.junit.internal.builders,此函数所在的类名为:JUnit3Builder,此函数名为runnerForClass。将4个代码标识符组成一个元组,(/mnt/qualitas/qualitas_corpus_compile/junit-4.10,org.junit.internal.builders,JUnit3Builder,runnerForClass)。
步骤2):结合大小写字母、数字、下划线、斜杠、英文句号标志,对步骤1输出的代码标识符元组进行分词,分别得到4个单词序列,并将其拼接在一起形成一个长的单词序列,同时将转换为一个长句子;将每个单词序列的长度q设置为6,如果代码标识符所包含的单词数超过了6,则将多出的单词删除,如果代码标识符所包含的单词数少于6,则将空余部分用0补齐;从而得到的单词序列为[mnt,qualitas,qualitas,corpus,compile,junit,org,junit,internal,builders,0,0,Junit,Builder,0,0,0,0,runner,For,Class,0,0,0],长单词序列包含的单词数为24。
步骤3):根据步骤2)输出的单词序列,将单词序列中的每一个单词输入到单词嵌入层完成单词到单词向量的转换,转换后将其拼接起来。
步骤4):将步骤3)的得到的单词向量输入到LSTM层,用于提取句子中各个单词之间的上下文关系,并且从这些关系中获取到相关的语义特征。
步骤5):将步骤4)得到的隐藏层状态输入到自注意力机制中,以提取出对代码味道检测有着重要作用的隐藏层状态。
经过步骤1)到步骤5)的操作,完成对代码函数进行特征表示并进行上下文语义提取的操作;
所述结构化特征提取部分的操作是:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息进行结构化特征提取,具体为:
步骤6):利用代码重构工具PMD对需要检测的Junit代码进行结构化信息提取,从而得到相应的代码度量。提取出的代码度量包括:NOP_method;CC_method;ATFD_method;FDP_method;CM_method;MAXNESTING_method;LOC_method;CYCLO_method;NMCS_method;NOLV_method;MaMCL_method;NOAV_method;LAA_method;FANOUT_method;CFNAMM_method;ATLD_method;CLNAMM_method;CINT_method;MeMCL_method;CDISP_method;NOII_type;NOAM_type;NOCS_type;NOM_type;NMO_type;ATFD_type;FANOUT_type;NOMNAMM_type;NOA_type;NIM_type;DIT_type;LOC_type;LOCNAMM_type;CFNAMM_type;TCC_type;NOPA_type;CBO_type;RFC_type;NOC_type;WMC_type;LCOM5_type;WOC_type;WMCNAMM_type;AMW_type;AMWNAMM_type;NOCS_package;NOMNAMM_package;NOI_package;LOC_package;NOM_package;NOPK_project;NOCS_project;NOI_project;NOM_project;NAM_project;LOC_project。
步骤7):将步骤6)的得到的所有代码度量分为4组,按照项目、包、类和函数的顺序连接起来,作为结构化特征提取部分的输入。runnerForClass函数的结构化信息输入为:(1.0;0.0;0.0;0.0;0.0;1.0;6.0;2.0;0.0;1.0;0.0;1.0;0.0;1.0;1.0;0.0;1.0;1.0;0.0;1.0;0.0;0.0;0.0;2.0;0.0;0.0;1.0;2.0;0.0;6.0;2.0;12.0;12.0;1.0;0.0;0.0;5.0;11.0;0.0;3.0;0.0;1.0;3.0;1.5;1.5;8.0;20.0;0.0;147.0;20.0;28.0;204.0;11.0;1031.0;987.0;9065.0)对应步骤6)得到的代码度量。
步骤8):将步骤7)的得到的结构化信息输入到基于CNN的神经网络模型中。通过三层卷积神经网络的特征提取,获得相应的结构化特征。
步骤9):将步骤8)得到的结构化特征输入到一个扁平操作中,将通过卷积神经网络提取出的深度结构化特征转变为一个一维向量。
经过步骤6)至步骤9)的操作,完成结构化特征提取部分的操作;
所述代码函数味道分类阶段的操作是在基于注意力机制和LSTM神经网络代码函数表示操作和基于CNN的结构化信息的深度特征提取的基础上进行的,具体为:
步骤10):将步骤5输出的上下文语义特征和步骤9输出的结构化特征在全连接层连接起来,得到多层感知机模型的输入。
步骤11):将步骤10)的输出结果输入到多层感知机模型中,自动地将从文本信息中提取出的上下文语义特征和从代码度量信息中提取出的结构化特征映射到单个输出中。
步骤12):将步骤11)的输出结果与数据集中的标签相比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练。
以上为本发明的模型训练部分,模型训练部分可以得到基于深度语义的代码函数味道检测模型,利用此模型便可以完成对代码中的函数的坏味道检测。
本发明的使用过程与上述测试过程的步骤1)-11)完全相同,根据步骤1)-10)所描述的过程,即可完成对代码函数的代码味道检测,得到代码味道检测结果。
经过上述步骤的操作,采用本发明提出的方法(基于深度语义的代码函数味道检测方法)得到的检索结果的召回率和准确率如表1中的第2行所示。
为说明本发明的检索效果,在同等条件下,以相同的实验数据分别采用LiSVM方法和J-48自带的论文搜索机制进行比较,得到的检索结果的召回率和准确率分别如表1中的第3行和第4行所示。
通过表1可以得出以下结论:基于深度语义的代码函数代码味道检测方法利用嵌入在代码中的语义关系,自动地提取文本信息和结构化信息中的高维特征,将特征自动地映射到分类结果中,实现了比基于传统的机器学习的方法更高的准确率和召回率,验证了其有效性。
表1三种检测方式效果比较
需要强调的是,对于本领域技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进,这些也应视为属于本发明的保护范围。
Claims (7)
1.一种基于深度语义的代码函数味道检测方法,其特征在于:包括模型训练以及模型测试;
其中,模型训练包括代码函数表示A、结构化特征提取A和代码味道分类A;模型测试包括代码函数表示B、结构化特征提取B和代码味道分类B;
代码函数表示A和代码函数表示B是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取A和结构化特征提取B是基于卷积神经网络的结构化特征提取;代码味道分类A和代码味道分类B是基于多层感知机的代码味道分类;
其中,所述代码函数表示A和代码函数表示B的操作为:对被检测的代码函数基于注意力机制和LSTM神经网络对代码函数进行特征表示并进行语义特征提取,具体为:
步骤1:将被检测的代码函数所在的项目名、包名、类名和函数名作为一个元组拼接在一起,输出代码标识符,作为深度语义提取的文本输入,用公式(1)中的符号textual_input表示:
textual_input=<namepr,namepa,namec,namem> (1)
其中,namepr代表代码函数所在的项目名;namepa代表代码函数所在的包名;namec代表代码函数所在的类名;namem代表代码函数所在的函数名;
且namepr,namepa,namec以及namem统称代码标识符;
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各个代码标识符进行分词,再对分词后的长度进行统一并拼接表示;
经步骤2分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为q,q的取值范围为4-10;
对分词后的长度进行统一并拼接表示,具体为:
步骤2.1若代码标识符所包含的单词数超过了q,则将多出的单词删除,若代码标识符所包含的单词数少于q,则将空余部分用0补齐;
步骤2.2将得到的<namepr,namepa,namec,namem>此4个单词序列拼接起来得到一个长单词序列,该长单词序列所包含的单词数应为4个级别的代码标识符所分单词数的和;
minput=concat(namepr,namepa,namec,namem) (2)
=concat(w1,w2,···,wn), (3)
其中,namepr、namepa、namec和namem分别表示代码函数所在的项目名、包名、类名和函数名,wi为相对应的代码标识符分解出的单词,下标i的取值范围为1到n,n代表wi的数量,其取值范围为16到40;
concat(·)为将输入连接起来的函数,且concat(w1,w2,···,wn)表示将w1,w2,···,wn连接起来;
步骤3:根据步骤2输出的minput,将minput长单词序列转换为一个包含有n个单词的长句子,将句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;
步骤3中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;
单词嵌入层将每一个单词转换为单词向量,表示如公式(4):
V(minput)=V(concat(w1,w2,···,wn))
=concat(V(w1),V(w2),···,V(wn)) (4)
其中,V(·)表示单词嵌入函数,即将输入的·转换为相对应的单词向量;V(wi)表示将wi转换为一个单词向量,下标i的取值范围为1到n;
公式(4)表明将minput转换为单词向量,等价于将minput所包含的每一个wi转换为对应的单词向量V(wi),再将n个单词向量经concat(·)函数连接起来;
步骤4:将步骤3输出的V(minput)单词向量输入到LSTM层以提取长单词序列minput中各单词间的上下文关系并从这些关系中获得相关的语义特征,输出LSTM层的隐藏层状态h;
其中,LSTM层使用三个门去控制LSTM单元中的状态流;对于每一个时间状态t,通过给定的单词向量V(wt),当前的单元状态ct和隐藏层状态ht通过先前的单元状态ct-1和隐藏层状态ht-1基于(5)-(8)进行更新;
其中,t的取值范围为0-n;
其中,it、ft和ot是范围在0-1的三个激活状态;
步骤5:将步骤4的输出的LSTM层隐藏层状态h输入到一个自注意力机制层,输出上下文语义特征m;
其中,上下文语义特征由步骤4中的隐藏层状态的权重和组成,由符号m表示(9):
其中,n对应着单词序列中的单词数量,即4q,n的取值范围是16-40;
at是ht的注意力权重,表示第t个隐藏层状态对代码气味检测的重要程度;
对应着每一个隐藏层状态的注意力权重at定义如公式(10)-(11):
e(ht)=W1tanh(W2ht) (10)
其中,W1和W2为权重矩阵,e(·)是一种计算隐藏层状态对代码味道检测重要程度的分数函数;
经过步骤1到步骤5,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取;
所述结构化特征提取A和结构化特征提取B的操作是:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息进行结构化特征提取,具体为:
步骤6:利用代码重构工具对需要检测的代码进行结构化信息提取,从而得到相应的代码度量;
步骤7:对步骤6输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input;
将所有的代码度量分为4组,按照项目、包、类和函数的包含顺序连接起来,作为结构化特征提取部分的输入;
其中,结构化信息由metric_input表示:
metric_input=concat(grouppr,grouppa,groupc,groupm) (12)
=concat(m1,m2,…,mx). (13)
其中,grouppr、grouppa、groupc和groupm分别表示项目、包、类和函数对应的代码度量,x表示结构化信息metric_input包含代码度量的总数,mi表示结构化信息中的第i个代码度量,i的取值范围为1到x;
步骤8:将步骤7输出的结构化信息metric_input输入到卷积神经网络模型CNN中,得到对应的结构化特征outputl3;
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3;
将结构化信息metric_input转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1;
卷积层1中的每一个卷积操作包括一个过滤器Wl1(),这个过滤器作用于一个代码度量上去生成一个新的特征;
卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
ci=tanh(Wl1(j)·mi+bl1(j)). (14)
其中,i的取值范围为1-256,Wl1(j)表示i个卷积操作中的第j个过滤器的权重矩阵,bl1(j)是第j个过滤器的偏置参数,其中,j的取值范围为1-256,mi表示metric_input中的一个代码度量;
在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配,记为Cl1(i);
特征匹配Cl1(i)和卷积层1表示为(15)到(16):
Cl1(i)=[c1,c2,…,cn], (15)
outputl1=CNN1(input)
=[Cl1(1),Cl1(2),…,Cl1(256)]. (16)
CNN1(·)表示卷积层1对应的卷积函数,input表示输入的代码度量,outputl1表示卷积层1的输出;
接下来,将卷积层1的输出输入到卷积层2中,然后将卷积层2的输出输入到卷积层3中;
卷积层2和卷积层3的输出表示为(17)到(18):
outputl2=CNN2(outputl1)
=[Cl2(1),Cl2(2),···,Cl2(128)], (17)
outputl3=CNN3(outputl2)
=[Cl3(1),Cl3(2),···,Cl3(64)]. (18)
其中,Cl2(i)表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128,CNN2(·)表示卷积层2对应的卷积函数,outputl2表示卷积层2的输出,Cl3(i)表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-64,CNN3(·)表示卷积层3对应的卷积函数,outputl3表示卷积层3的输出;
步骤9:将步骤8输出的结构化特征outputl3输入到一个扁平操作中,将其转变为一个一维向量;
经过步骤6至步骤9的操作,完成了结构化特征提取;
所述代码函数味道分类是在基于注意力机制和LSTM神经网络代码函数表示操作和基于CNN的结构化特征提取的基础上进行的,利用多层感知机神经网络模型将提取到的深层特征包括语义特征和结构化特征与代码味道检测结果自动地匹配起来,完成分类模型的训练,具体为:
步骤10:将步骤5输出的上下文语义特征和步骤9输出的一维向量在全连接层连接起来,得到多层感知机模型的输入;
步骤11:将步骤10的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的上下文语义特征和从代码度量信息中提取出的结构化特征映射到单个输出中;
步骤12:将步骤11的输出结果与数据集中的标签相比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练;
其中,binary_cross_entropy损失函数表示为(19):
至此,从步骤1到步骤12,完成了模型训练;
其中,步骤1到步骤5,对应模型训练中的代码函数表示A;步骤6到步骤9,对应模型训练中的结构化特征提取A;步骤10到步骤11,对应模型训练中的代码函数味道分类A;
模型测试与步骤1到步骤11完全相同,其中,步骤1到步骤5,对应模型测试中的代码函数表示B;步骤6到步骤9,对应模型测试中的结构化特征提取B;步骤10到步骤11,对应模型测试中的代码函数味道分类B;
模型训练结束后,再根据步骤1到步骤11所描述的过程,完成对代码函数的代码味道检测测试,得到代码味道检测结果。
2.根据权利要求1所述的一种基于深度语义的代码函数味道检测方法,其特征在于:步骤2.2中,长单词序列所包含单词的数量n=4q。
3.根据权利要求1所述的一种基于深度语义的代码函数味道检测方法,其特征在于:步骤3中,单词嵌入函数为Word2vec。
4.根据权利要求1所述的一种基于深度语义的代码函数味道检测方法,其特征在于:步骤8中的卷积层1中,使用256个过滤器去获得结构化输入的多维特征,每个过滤器的大小设置为1*1。
5.根据权利要求1所述的一种基于深度语义的代码函数味道检测方法,其特征在于:步骤8中CNN卷积层2有128个过滤器,卷积层3有64个过滤器。
6.根据权利要求1所述的一种基于深度语义的代码函数味道检测方法,其特征在于:步骤11的多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道;该输出层的激活函数为sigmoid函数。
7.根据权利要求1所述的一种基于深度语义的代码函数味道检测方法,其特征在于:步骤12中N的取值范围为50000-100000。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910705359.1A CN110413319B (zh) | 2019-08-01 | 2019-08-01 | 一种基于深度语义的代码函数味道检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910705359.1A CN110413319B (zh) | 2019-08-01 | 2019-08-01 | 一种基于深度语义的代码函数味道检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110413319A CN110413319A (zh) | 2019-11-05 |
CN110413319B true CN110413319B (zh) | 2020-10-09 |
Family
ID=68365013
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910705359.1A Active CN110413319B (zh) | 2019-08-01 | 2019-08-01 | 一种基于深度语义的代码函数味道检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110413319B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110970098A (zh) * | 2019-11-26 | 2020-04-07 | 重庆大学 | 一种功能多肽苦味预测方法 |
CN111488137B (zh) * | 2020-04-07 | 2023-04-18 | 重庆大学 | 一种基于共同注意力表征学习的代码搜索方法 |
CN112328478A (zh) * | 2020-11-03 | 2021-02-05 | 北京理工大学 | 一种基于微调和深度交互的代码味道检测方法 |
CN112328479A (zh) * | 2020-11-03 | 2021-02-05 | 北京理工大学 | 一种基于深度特征交互网络的上帝类代码味道检测方法 |
CN112698833B (zh) * | 2020-12-31 | 2022-05-31 | 北京理工大学 | 一种基于局部和全局特征的特征依恋代码味道检测方法 |
CN112732570B (zh) * | 2021-01-05 | 2022-05-31 | 北京理工大学 | 一种基于上下文环境的依恋情结代码味道检测方法 |
CN112764758A (zh) * | 2021-01-21 | 2021-05-07 | 中国工商银行股份有限公司 | 代码坏味道检测方法和装置 |
CN112835620B (zh) * | 2021-02-10 | 2022-03-25 | 中国人民解放军军事科学院国防科技创新研究院 | 一种基于深度学习的语义相似代码在线检测方法 |
CN116521560A (zh) * | 2023-05-10 | 2023-08-01 | 湖北大学 | 一种基于图神经网络的多特征融合上帝类检测方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110087703A1 (en) * | 2009-10-09 | 2011-04-14 | Satyam Computer Services Limited Of Mayfair Center | System and method for deep annotation and semantic indexing of videos |
CN105740349B (zh) * | 2016-01-25 | 2019-03-08 | 重庆邮电大学 | 一种结合Doc2vec和卷积神经网络的情感分类方法 |
CN109408389B (zh) * | 2018-10-30 | 2020-10-16 | 北京理工大学 | 一种基于深度学习的代码缺陷检测方法及装置 |
CN109508377A (zh) * | 2018-11-26 | 2019-03-22 | 南京云思创智信息科技有限公司 | 基于融合模型的文本特征提取方法、装置、聊天机器人和存储介质 |
CN109684449B (zh) * | 2018-12-20 | 2021-12-10 | 电子科技大学 | 一种基于注意力机制的自然语言语义表征方法 |
-
2019
- 2019-08-01 CN CN201910705359.1A patent/CN110413319B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN110413319A (zh) | 2019-11-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110413319B (zh) | 一种基于深度语义的代码函数味道检测方法 | |
CN110597735B (zh) | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 | |
CN109857846B (zh) | 用户问句与知识点的匹配方法和装置 | |
CN110096711A (zh) | 序列全局关注和局部动态关注的自然语言语义匹配方法 | |
CN110335653A (zh) | 基于openEHR病历格式的非标准病历解析方法 | |
CN111353306A (zh) | 基于实体关系和依存Tree-LSTM的联合事件抽取的方法 | |
CN112926337B (zh) | 一种结合重构句法信息的端到端方面级情感分析方法 | |
CN108664237B (zh) | 一种基于启发式和神经网络的非api成员推荐方法 | |
CN113742733A (zh) | 阅读理解漏洞事件触发词抽取和漏洞类型识别方法及装置 | |
CN114647713A (zh) | 基于虚拟对抗的知识图谱问答方法、设备及存储介质 | |
CN117151222B (zh) | 领域知识引导的突发事件案例实体属性及其关系抽取方法、电子设备和存储介质 | |
CN113378024A (zh) | 一种基于深度学习面向公检法领域的相关事件识别方法 | |
CN113705207A (zh) | 语法错误识别方法及装置 | |
CN110807096A (zh) | 一种小样本集上的信息对匹配方法及系统 | |
CN115062126A (zh) | 一种语句分析方法、装置、电子设备及可读存储介质 | |
CN114490885A (zh) | 一种实体关系抽取方法、装置、电子设备及存储介质 | |
CN114547294A (zh) | 一种基于传播过程综合信息的谣言检测方法及系统 | |
CN112698833B (zh) | 一种基于局部和全局特征的特征依恋代码味道检测方法 | |
CN112328479A (zh) | 一种基于深度特征交互网络的上帝类代码味道检测方法 | |
CN112732570B (zh) | 一种基于上下文环境的依恋情结代码味道检测方法 | |
CN113407439B (zh) | 一种用于软件自承认型技术债务的检测方法 | |
CN112328478A (zh) | 一种基于微调和深度交互的代码味道检测方法 | |
CN113313184B (zh) | 一种异质集成的自承认技术债务自动检测方法 | |
CN116644059A (zh) | 信创环境下基于机器学习实现数据标准构建处理的方法、装置、处理器及其可读存储介质 | |
CN117610572A (zh) | 图注意力网络文档级关系抽取方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |