CN112698833B - 一种基于局部和全局特征的特征依恋代码味道检测方法 - Google Patents
一种基于局部和全局特征的特征依恋代码味道检测方法 Download PDFInfo
- Publication number
- CN112698833B CN112698833B CN202011631064.3A CN202011631064A CN112698833B CN 112698833 B CN112698833 B CN 112698833B CN 202011631064 A CN202011631064 A CN 202011631064A CN 112698833 B CN112698833 B CN 112698833B
- Authority
- CN
- China
- Prior art keywords
- code
- word
- function
- output
- layer
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- 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/22—Matching criteria, e.g. proximity measures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/279—Recognition of textual entities
- G06F40/284—Lexical analysis, e.g. tokenisation or collocates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Artificial Intelligence (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Evolutionary Computation (AREA)
- General Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computing Systems (AREA)
- Molecular Biology (AREA)
- Mathematical Physics (AREA)
- Biophysics (AREA)
- Biomedical Technology (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Bioinformatics & Computational Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Evolutionary Biology (AREA)
- Databases & Information Systems (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Machine Translation (AREA)
- Error Detection And Correction (AREA)
Abstract
本发明涉及一种基于局部和全局特征的特征依恋代码味道检测方法,属于计算机软件重构技术领域。本方法能够自动地提取代码中的特征信息,消除了人工提取特征的步骤,降低了人力成本,能够将提取出的特征信息与检测结果自动匹配,减少了人工设计规则的时间和人力成本。除加入已有代码度量中的结构化信息,还加入了源代码中局部特性信息和全局特征信息,可以辅助已有的度量值检测方式,对代码味道进行更深入的检测。本方法与基于传统机器学习的代码味道检测方法相比,提高了检测的精准率和查全率。
Description
技术领域
本发明涉及一种特征依恋代码味道检测方法,具体涉及一种基于局部和全局特征的特征依恋代码味道检测方法,属于计算机软件重构技术领域。
背景技术
软件系统中的源代码质量问题,一直是现代软件工程领域面临的一个关键性问题。在互联网的软件开发工作中,当对一个大型软件系统进行长时间的维护时,开发人员编写的代码虽然可以很好的完成业务需求,但是长期的软件工程活动中会导致当前代码工程偏离原来的代码架构,使得代码的可维护性变差,最终往往会导致严重的软件质量问题和软件维护问题。在软件工程中,使得让软件质量下降的代码片段被称为坏味代码,坏味代码的存在直接影响着软件系统的可维护性和可重用性。为了去避免代码的可维护性等出现问题,需要工作人员定期对软件系统进行分析,将潜在的坏味代码识别出来,并将该代码片段进行重构,所以坏味代码的检测在软件工程领域起着至关重要的作用。
在软件开发的过程中,开发人员发现相同方法编写在不同的类中会对代码产生不同影响,有时会项目产生较大的质量隐患。为了更好的识别代码中的坏味,研究者们对产生问题的代码片段进行了大量的分析,Fowler等人总共引入了22种代码味道,包括FeatureEnvy,Long Method以及God Class等。由于不同坏味代码之间的特点差别很大,对后续针对不同的坏味代码检测的研究提供了坚实有力的基础。
最初坏味代码的检测是人工检测,但是人工检测方法掺杂着很强的主观性因素,为了解决这问题,研究者们提出了一种基于度量值的检测方法,一比如圈复杂度、代码行数、类耦合等。然而对于相同的坏味代码,不同的检测方法具有不同的规则,因此结果往往会产生很大的偏差。
为了避免人工设计规则而导致的系统性误差,研究人员提出了基于传统机器学习的代码味道检测方法,比如如SVM、J-48和朴素贝叶斯。这些方法能够额外的提供主观性,从而避免人们对代码味道的认识不同的问题,同时,这些方法能够自动地从代码度量中提取相应的特征完成对代码味道的识别。但是,当同时检测两种或者更多种代码味道时,这些基于传统的机器学习的方法并没有很好地表现。
近年来,深度学习在自然语言处理、计算机视觉、推荐系统等领域中大放光彩。深度学习等技术的架构是基于多层神经网络的,其目的主要贡献在于可以对高维数据进行有效的建模。与基于传统的机器学习技术不同,深度学习技术提供了从低到高的多层次的数据抽象,并在深度特征提取上取得了更好的表现。目前,深度学习技术已经成功应用于代码味道检测当中。例如,刘辉等人提出了一种基于深度学习的方法来检测坏味代码,这种方法利用了文本信息和代码度量值,但是在当前的检测方法中,模型考虑代码文本的角度过于单一,没有充分利用代码文本中局部信息,并且忽视了代码文本中的局部信息和全局信息之间的关系。
因此,如何克服现有技术的缺陷,寻找更为有效的检测方法,成为本领域的重要研究方向。
发明内容
本发明的目的是为了解决软件重构领域现有代码味道检测方法存在考虑代码文本的角度过于单一,没有充分利用代码文本中局部信息,并且忽视代码文本中的局部信息和全局信息之间的关系等技术问题,创造性地提出一种基于局部和全局特征的特征依恋代码味道检测方法。
本发明是通过以下技术方案实现的。
一种基于局部和全局特征的特征依恋代码味道检测方法。
包括模型训练部分和模型测试部分。
模型训练包括代码函数表示A、局部特征提取B、全局特征提取C和代码分类味道D。
模型测试包括代码函数表示E,局部特征提取F,全局特征提取G和代码味道分类H。
其中,代码函数表示A和代码函数表示E是基于Self-Attention神经网络代码函数表示。
局部特征提取B和局部特征提取F是基于孪生网络结构的特征提取。
全局特征提取C和全局特征提取G是基于卷积神经网络的结构化特征提取。
代码味道分类D和代码味道分类H是基于多层感知机的代码味道分类。
代码函数A表示和代码函数表示E的操作为:基于Self-Attention神经网络,对被检测的代码函数进行特征表示并进行特征提取,具体方法为:
步骤1:将被检测的代码函数所在的类名、目标类名和函数名作为一个元组拼接在一起,输出代码标识符,作为深度语义提取的文本输入,用公式(1)中的符号textualinput表示:
textualinput=<nameec,nametc,namem> (1)
其中,nameec代表代码函数所在的类名;nametc代表代码函数要重构的目标类名;namem代表代码函数所在的函数名。nameec,nametc和namem统称代码标识符。
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词,再对分词后的长度进行统一并拼接表示。
其中,经分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为q。q的取值为5。
对分词后的长度进行统一并拼接表示,具体方法为:
步骤2.1:若代码标识符所包含的单词数超过了q,则将多出的单词删除;若代码标识符所包含的单词数少于q,则将空余部分用*补齐。
步骤2.2:将得到的<nameec,nametc,namem>这3个单词序列拼接起来,得到一个长单词序列。该长单词序列所包含的单词数为3个级别的代码标识符所分单词数的和:
minput=concat(nameec,nametc,namem) (2)
=concat(w1,w2,…,wn), (3)其中,nameec、nametc和namem分别表示代码函数所在的类名、代码函数可能要重构的目标类名、待检测代码的函数名;wi为相对应的代码标识符分解出的单词,下标i的取值范围为1到n,n代表wi的数量,其取值范围为5到15。concat(·)为将输入连接起来的函数,concat(w1,w2,…,wn)表示将w1,w2,…,wn连接起来。长单词序列所包含的单词n的数量是3q个。
步骤3:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符不进行分词。
每一个代码标识符仍然得到一个单词序列,每个单词序列的长度设置为q,q的取值为5,但接下来不进行拼接。
步骤3.1:若代码标识符所包含的单词数超过了q,则将多出的单词删除;若代码标识符所包含的单词数少于q,则将空余部分用*补齐。
步骤3.2:将得到的<nameec,nametc,namem>这3个单词序列单独表示起来:
mecinput=concat(nameec) (4)
=concat(ecw1,ecw2,…,ecwn) (5)
mtcinput=concat(nametc) (6)
=concat(tcw1,tcw2,…,tcwn) (7)
mninput=concat(namem) (8)
=concat(mw1,mw2,…,mwn) (9)
其中,mecinput,mtcinput,mninput分别表示所在类名、目标类名、方法名。
步骤4:根据步骤2输出的minput,将minput长单词序列转换为一个包含有n个单词的长句子,将句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量。其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量。单词嵌入层将每一个单词转换为单词向量,表示如公式(10):
V(minput)=V(concat(w1,w2…,wn))
=concat(V(w1),V(w2),…,V(wn)) (10)
其中,V(·)表示单词嵌入函数,即将输入的(·)转换为相对应的单词向量;V(wi)表示将wi转换为一个单词向量,下标i的取值范围为1到n。
优选的,单词嵌入函数为Word2vec。
公式(10)表明,将minput转换为单词向量等价于将minput所包含的每一个wi转换为对应的单词向量V(wi),再将n个单词向量经concat(·)函数连接起来。
步骤5:根据步骤3输出的mecinput,mtcinput,mninput的单个单词序列,不同于步骤4,而是对单个的单词序列mecinput,mtcinput,mninput变为3个长度为5长句子,将3个句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量。其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量。单词嵌入层将每一个单词转换为单词向量,表示如公式(11)(12)(13):
V(mecinput)=V(concat(ecw1,ecw2,…,ecwn))
=concat(V(ecw1),V(ecw2),…,V(ecwn)) (11)
V(mtcinput)=V(concat(tcw1,tcw2,…,tcwn))
=concat(V(tcw1),V(tcw2),…,V(tcwn)) (12)
V(mninput)=V(concat(mw1,mw2,…,mwn))
=concat(V(mw1),V(mw2),…,V(mwn)) (13)
其中,V(·)表示单词嵌入函数,即将输入的(·)转换为相对应的单词向量;V(wi)表示将wi转换为一个单词向量,下标i的取值范围为1到n。
优选的,单词嵌入函数为Word2vec。
公式(11)(12)(13)表明,将mecinput,mtcinput,mninput转换为单词向量等价于将mecinput,mtcinput,mninput所包含的每一个wi转换为对应的单词向量V(wi),再将n个单词向量经concat(·)函数连接起来。
步骤6:将步骤5的Word2Vec输出的单词向量,输入到一个自注意力机制层,输出上下文语义特征m。
选用自注意力机制层的原因为:不是所有的隐藏层状态都能平等的反应隐藏在代码中的语义特征,利用自注意力机制层可以自动选择出对代码味道检测有着重要影响的上下文语义特征。
其中,上下文语义特征m由步骤5中的单词向量组成:
其中,n对应单词序列中的单词数量,即为5;ht是句子序列中的第t个单词对应的隐藏层状态,即表示时间状态t对应的隐藏层状态;at是ht的注意力权重,表示第t个隐藏层状态对代码味道检测的重要程度。
对应的每一个隐藏层状态的注意力权重at定义如公式(15)-(16):
e(ht)=W1 tanh(W2ht) (15)
其中,W1和W2为权重矩阵;e(·)是计算隐藏层状态对代码味道检测重要程度的分数函数;tanh(·)是一种非线性激活函数;ht表示句子序列中的第t个单词对应的隐藏层状态,t的取值范围是0-n;hk表示第k个输入在编码器的输出。
经过步骤1到步骤6,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取。
局部特征提取B和局部特征提取F的操作为:利用基于孪生网络的深度学习框架,对通过孪生网络进行语义间的相似度计算,对局部特征进行提取。具体方法为:
步骤7:在步骤5中的mecinput,mtcinput,mninput的基于Self-Attention的函数表示中,它们的模型是共享参数的,即得到3个单词序列的特征向量,接着将其输入到前馈神经网络中,将mecinput和mninput做余弦相似度计算,并对将mtcinput和mninput做余弦相似度计算,最终得到两个相似度得分,余弦相似度表示如公式(17)所示:
经过步骤7的操作,完成了局部特征提取。
全局特征提取C和全局特征提取G的操作为:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数,进行相应的全局特征提取。具体方法为:
步骤8:利用代码重构工具,对需要检测的代码进行全局结构化信息提取,得到相应的代码度量。
步骤9:对步骤8输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input。将所有的代码度量分为2组,按照分别为该方法到本类的距离和该方法到目标类的距离,作为全局结构化特征提取部分的输入。
其中,结构化信息由metric_input表示:
metric_input=concat(distmec,distmtc) (18)
=concat(m1,m2,…,mi,…,mx). (19)
其中,distmec和distmtc分别表示项目、包、类和函数对应的代码度量;x表示结构化信息metric_input包含代码度量的总数;mi表示结构化信息中的第i个代码度量,i的取值范围为1到x。
步骤10:将步骤9输出的结构化信息metric_input输入到卷积神经网络模型CNN中,得到对应的结构化特征outputl3。
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3。将结构化信息metric_input转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1。
在卷积层1中,使用128个过滤器去获得结构化输入的多维特征,每个过滤器的大小设置为1*1。
卷积层1中的每一个卷积操作包括一个过滤器Wl1(),这个过滤器作用于一个代码度量上,生成一个新的特征。卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
ci=tanh(Wl1(j)·mi+bl1(j)). (20)
其中,i的取值范围为1-128;Wl1(j)表示i个卷积操作中的第j个过滤器的权重矩阵;bl1(j)是第j个过滤器的偏置参数,其中j的取值范围为1-128;对于公式中tanh(·)是一个非线性的激活函数;mi表示metric_input中的一个代码度量。在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配Cl1(i),Cl1(i)和卷积层1表示为(21)到(22):
Cl1(i)=[c1,c2,…,cn], (21)
outputl1=CNN1(input)
=[Cl1(1),Cl1(2),…,Cl1(128)]. (22)
其中,CNN1()表示卷积层1对应的卷积函数;input表示输入的代码度量;outputl1表示卷积层1的输出。
然后,将卷积层1的输出输入到卷积层2中,再将卷积层2的输出输入到卷积层3中。卷积层2有128个过滤器,卷积层3有128个过滤器。卷积层2和卷积层3的输出表示为(17)到(18):
outputl2=CNN2(outputl1)
=[Cl2(1),Cl2(2),…,Cl2(128)], (23)
outputl3=CNN3(outputl2)
=[Cl3(1),Cl3(2),…,Cl3(128)]. (24)
其中,Cl2(i)表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128;CNN2(·)表示卷积层2的卷积函数;outputl2表示卷积层2的输出;Cl3(i)表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-128;CNN3(·)表示卷积层3的卷积函数;outputl3表示卷积层3的输出。
步骤11:将步骤10输出的结构化特征outputl3输入到一个扁平操作中,将通过卷积神经网络提取出的结构化特征outputl3转变为一个一维向量。
步骤12:将步骤4输出的代码函数表示信息V(minput)输入到卷积神经网络模型CNN中,得到对应的特征outputk3。
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3。将V(minput)转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1。
在卷积层1中,使用128个过滤器去获得输入的多维特征,每个过滤器的大小设置为1*5。
卷积层1中的每一个卷积操作包括一个过滤器Wk1(),这个过滤器作用于一个代码度量上,生成一个新的特征。卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
ci=tanh(Wk1(j)·mi+bk1(j)). (25)
其中,i的取值范围为1-128;Wk1(j)表示i个卷积操作中的第j个过滤器的权重矩阵;bk1(j)是第j个过滤器的偏置参数,其中j的取值范围为1-128;对于公式中tanh(·)是一个非线性的激活函数;mi表示V(minput)中的一个代码单词表示。在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配Ck1(i),Ck1(i)和卷积层1表示为(21)到(22):
Ck1(i)=[c1,c2,…,cn], (26)
outputk1=CNN1(input)
=[Ck1(1),Ck1(2),…,Ck1(128)]. (27)
其中,CNN1()表示卷积层1对应的卷积函数;input表示输入的代码度量;outputk1表示卷积层1的输出。
然后,将卷积层1的输出输入到卷积层2中,再将卷积层2的输出输入到卷积层3中。卷积层2有128个过滤器,卷积层3有128个过滤器。卷积层2和卷积层3的输出表示为(17)到(18):
outputk2=CNN2(outputk1)
=[Ck2(1),Ck2(2),…,Ck2(128)], (28)
outputk3=CNN3(outputk2)
=[Ck3(1),Ck3(2),…,Ck3(128)]. (29)
其中,Ck2(i)表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128;CNN2(·)表示卷积层2的卷积函数;outputk2表示卷积层2的输出;Cl3(i)表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-128;CNN3(·)表示卷积层3的卷积函数;outputk3表示卷积层3的输出。
步骤13:将步骤12输出的特征outputk3输入到一个扁平操作中,将通过卷积神经网络提取出的特征outputk3转变为一个一维向量。
经过步骤8至步骤13的操作,完成了全局特征提取。
代码函数味道分类,是在基于Word2Vec、Self-Attention神经网络代码函数表示操作、基于孪生网络框架的局部信息表示以及基于CNN的全局特征提取。利用多层感知机神经网络模型,将提取到的深层特征(包括局部特征和全局化特征)与代码味道检测结果自动匹配,完成分类模型的训练。具体方法为:
步骤14:将步骤7输出的局部特征信息,步骤12和步骤13输出的全局特征信息,在全连接层连接起来,得到多层感知机模型的输入。
步骤15:将步骤14的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的局部信息特征和全局信息特征映射到单个输出中。其中,多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道,该输出层的激活函数为sigmoid函数。
步骤16:将步骤15的输出结果与数据集中的标签比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练。binary_cross_entropy损失函数表示为:
至此,从步骤1到步骤16,完成了模型训练。
其中,步骤1到步骤6,对应模型训练中的代码函数表示A;步骤7到对应模型训练中的局部特征信息提取B;步骤8到步骤13,对应模型训练中的全局特征提取C;步骤14到步骤16,对应模型训练中的代码函数味道分类D;
模型测试部分与步骤1到步骤16完全相同,其中,步骤1到步骤6,对应模型测试中的代码函数表示E;步骤7,对应模型测试中的局部特征提取F;步骤8到步骤13,对应模型训练中的交互特征提取G;步骤14到步骤16,对应模型训练中的代码函数味道分类H。
模型训练结束后,再根据步骤1到步骤15所描述的过程,完成对代码函数的代码味道检测测试,最终得到代码味道检测结果。
有益效果
本发明方法,与现有代码味道检测方法相比,具有如下优点:
1.本方法与基于启发式规则的代码味道检测方法相比,能够自动地提取代码中的特征信息,消除了人工提取特征的步骤,降低了人力成本。
2.本方法与基于启发式规则的代码味道检测方法相比,能够将提取出的特征信息与检测结果自动匹配,减少了人工设计规则的时间和人力成本。
3.本方法与基于度量的代码味道检测方法相比,除了加入已有代码度量中的结构化信息,还加入了源代码中局部特性信息和全局特征信息,可以辅助已有的度量值检测方式,对代码味道进行更深入的检测。
4.本方法与基于传统机器学习的代码味道检测方法相比,提高了检测的精准率和查全率。
附图说明
图1为本发明一种基于局部和全局特征的特征依恋代码味道检测方法模型结构图。
具体实施方式
下面结合附图和实施例对本发明方法做进一步进行详细说明。
实施例
本实例采用本发明提出的方法,建立一个基于深度特征交互的上帝类代码味道检测系统,该检测系统采用Python开发平台,Tensorflow资源库。采用来自github上的软件测试工具Junit项目提供的源代码,Junit开源项目的地址为https://github.com/junit-team/junit4。
利用代码重构工具PMD将Junit项目源代码中所有函数的相关信息提取出来,并且分为训练集和测试集。如图所示,模型训练和模型测试的步骤如下:
其中,模型训练包括局部特征提取A,全局特征提取B和代码依恋分类C;模型测试包括局部特征提取D、全局特征提取E和代码依恋分类F;
局部提取A和局部提取D是基于self-Attention的孪生网络的局部特征提取;全局特征提取B和全局特征提取E是基于卷积神经网络的全局特征提取;上帝类分类C和上帝类分类E是基于多层感知机的代码依恋分类;
局部特征提取的操作是:
步骤1:对所有Junit源代码中函数相关的函数所在类名、函数目标类和函数名进行提取,形成2个句子对。例如Junit项目中有runnerForClass()函数,此函数所在的类名为:JUnit3Builder,此函数名为runnerForClass,此函数的目标类名为TestDecorato,将函数名和该函数所在类名形成一个句子对(runnerForClass,TestDecorato),将函数名和该函数目标名形成一个句子对(runnerForClass,JUnit3Builder)。
步骤2:结合大小写字母、数字、下划线、斜杠、英文句号标志,对步骤1输出的2个句子对进行分词,分别得到两对单词序列,将每个单词序列的长度q设置为5,如果代码标识符所包含的单词数超过了5,则将多出的单词删除,如果代码标识符所包含的单词数少于5,则将空余部分用*补齐;从而得到的单词序列对为([*,*,runner,for,class],[*,*,*,test,decorato])和([*,*,runner,for,class],[*,*,junit,3,builder])
步骤3:根据步骤2输出的单词序列对,将单词序列对中的每一个单词输入到单词嵌入层完成单词到单词向量的转换,转换后将其拼接起来。
步骤4:将步骤3得到的单词向量输入到自注意力机制中,以提取出对代码味道检测有着重要作用的特征表示。
步骤5:将步骤4的得到的单词序列对特征表示,成对的进行相似度计算,用于提取句子中各个单词之间的上下文关系,并且从这些关系中获取到语义相似度。
经过步骤1到步骤5的操作,完成对代码进行特征表示并进行局部特征提取的操作;
所述全局交互特征提取部分的操作是:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数,进行相应的全局特征提取。具体为:
步骤6:利用代码重构工具PMD对需要检测的Junit代码进行结构化信息提取,从而得到相应的代码度量。提取出的代码度量包括:方法与本类的距离和方法与目标类的距离。
步骤7:将步骤6的得到的结构化信息输入到基于卷积神经网络模型中。通过卷积神经网络的特征提取,获得相应的部分全局特征。
步骤8:对所有Junit源代码中函数相关的函数所在类名、函数目标类和函数名进行提取,形成单词序列。例如Junit项目中有runnerForClass()函数,此函数所在的类名为:JUnit3Builder,此函数名为runnerForClass,此函数的目标类名为TestDecorato,将函数名和该函数所在类名,以及目标类名形成一个句子对(runnerForClass,TestDecorato,JUnit3Builder)。
步骤9:结合大小写字母、数字、下划线、斜杠、英文句号标志,对步骤1输出的单词序列进行分词,将每个单词序列的长度q设置为5,如果代码标识符所包含的单词数超过了5,则将多出的单词删除,如果代码标识符所包含的单词数少于5,则将空余部分用*补齐;从而得到的单词序列对为([*,*,runner,for,class,*,*,*,test,decorato,*,*,junit,3,builder])
步骤10:根据步骤9输出的单词序列对,将单词序列对中的每一个单词输入到单词嵌入层完成单词到单词向量的转换,转换后将其拼接起来。
步骤11:将步骤10的得到的文本信息输入到基于卷积神经网络模型中。通过卷积神经网络的特征提取,获得另一部分全局特征。
步骤12:将步骤7和步骤11得到的特征拼接起来,得到全部的全局特征。
经过步骤6至步骤12的操作,完成全局特征提取部分的操作;
所述代上帝类分类阶段的操作是在基于LSTM神经网络和注意力机制的语义特征提取和基于注意力机制的结构化信息的结构化交互特征提取的基础上进行的,具体为:
步骤13:将步骤5输出的局部特征和步骤12输出的全局特征在全连接层连接起来,得到多层感知机模型的输入。
步骤14:将步骤13的输出结果输入到多层感知机模型中,自动地将从代码信息中提取出的局部特征和全局特征映射到单个输出中。
步骤15:将步骤14的输出结果与数据集中的标签相比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码类味道分类器的训练。
以上为本发明的模型训练部分,模型训练部分可以得到基于深度特征交互的上帝类检测模型,利用此模型便可以完成对代码类中的上帝类检测。
本发明的使用过程与上述测试过程的步骤1-14完全相同,根据步骤1-14所描述的过程,即可完成对代码依恋检测,得到代码依恋检测结果。
经过上述步骤的操作,采用本发明提出的方法(一种基于局部和全局特征的特征依恋代码味道检测方法)得到的检索结果的F1和AUC如表1中的第2行所示。
为说明本发明的检索效果,在同等条件下,以相同的实验数据与采用JDeodorant工具和Deep Learning方法进行比较,得到的检索结果的F1和AUC分别如表1中的第3行所示。
通过表1可以得出以下结论:基于局部和全局特征的特征依恋代码味道检测方法利用嵌入在代码中的局部特征和全局特征,将特征自动地映射到分类结果中,实现了比采用JDeodorant工具和Deep Learning方法更高的F1和AUC,验证了其有效性。
表1三种检测方式效果比较
Claims (6)
1.一种基于局部和全局特征的特征依恋代码味道检测方法,包括模型训练部分和模型测试部分:
模型训练包括代码函数表示A、局部特征提取B、全局特征提取C和代码分类味道D;
模型测试包括代码函数表示E,局部特征提取F,全局特征提取G和代码味道分类H;
其中,代码函数表示A和代码函数表示E是基于Self-Attention神经网络代码函数表示;
局部特征提取B和局部特征提取F是基于孪生网络结构的特征提取;
全局特征提取C和全局特征提取G是基于卷积神经网络的结构化特征提取;
代码味道分类D和代码味道分类H是基于多层感知机的代码味道分类;
其特征在于:
代码函数表示A和代码函数表示E的操作为:基于Self-Attention神经网络,对被检测的代码函数进行特征表示并进行特征提取,具体方法为:
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词,再对分词后的长度进行统一并拼接表示;
其中,经分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为q;
步骤3:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词;
每一个代码标识符仍然得到一个单词序列,每个单词序列的长度依然设置为q,但接下来不进行拼接;
步骤3.1:若代码标识符所包含的单词数超过了q,则将多出的单词删除;若代码标识符所包含的单词数少于q,则将空余部分用*补齐;
步骤4:根据步骤2输出的,将长单词序列转换为一个包含有n个单词的长句子,将句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;单词嵌入层将每一个单词转换为单词向量,表示如公式(10):
步骤5:根据步骤3输出的的单个单词序列,不同于步骤4,而是对单个的单词序列变为3个长度为5的长句子,将3个句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;单词嵌入层将每一个单词转换为单词向量,表示如公式(11)(12)(13):
步骤6:将步骤5输出的单词向量,输入到一个自注意力机制层,输出上下文语义特征m;利用自注意力机制层自动选择出对代码味道检测有着重要影响的上下文语义特征;
其中,上下文语义特征m由步骤5中的单词向量组成:
其中,n对应单词序列中的单词数量;ht是句子序列中的第t个单词对应的隐藏层状态,即表示时间状态t对应的隐藏层状态;at是ht的注意力权重,表示第t个隐藏层状态对代码味道检测的重要程度;
对应的每一个隐藏层状态的注意力权重at定义如公式(15)-(16):
其中,和为权重矩阵;是计算隐藏层状态对代码味道检测重要程度的分数函数;tanh( )是一种非线性激活函数;表示句子序列中的第t个单词对应的隐藏层状态,t的取值范围是0-n;表示第k个输入在编码器的输出;
经过步骤1到步骤6,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取;
局部特征提取B和局部特征提取F的操作为:利用基于孪生网络的深度学习框架,对通过孪生网络进行语义间的相似度计算,对局部特征进行提取;具体如下:
步骤7:在步骤5中的的基于Self-Attention的函数表示中,它们的模型是共享参数的,即得到3个单词序列的特征向量,接着将其输入到前馈神经网络中,将做余弦相似度计算,并对将做余弦相似度计算,最终得到两个相似度得分;
经过步骤7的操作,完成了局部特征提取;
全局特征提取C和全局特征提取G的操作为:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数,进行相应的全局特征提取,具体如下:
步骤8:对需要检测的代码进行全局结构化信息提取,得到相应的代码度量;
步骤9:对步骤8输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input;将所有的代码度量分为2组,按照分别为该需要 检测的方法到本类的距离和该待检测的方法到目标类的距离,作为全局结构化特征提取部分的输入;
其中,结构化信息由metric_input表示:
步骤10:将步骤9输出的结构化信息metric_input输入到卷积神经网络模型CNN中,得到对应的结构化特征outputl3;
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3;将结构化信息metric_input转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1;
在卷积层1中,使用128个过滤器去获得结构化输入的多维特征,每个过滤器的大小设置为1*1;
然后,将卷积层1的输出输入到卷积层2中,再将卷积层2的输出输入到卷积层3中;卷积层2有128个过滤器,卷积层3有128个过滤器;卷积层2和卷积层3的输出表示为(17)到(18):
其中,表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128;表示卷积层2的卷积函数;表示卷积层2的输出;表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-128;表示卷积层3的卷积函数;表示卷积层3的输出;
在卷积层1中,使用128个过滤器去获得输入的多维特征,每个过滤器的大小设置为1*5;
其中,i的取值范围为1-128;表示i个卷积操作中的第j个过滤器的权重矩阵;是第j个过滤器的偏置参数,其中j的取值范围为1-128;对于公式中是一个非线性的激活函数;mi表示中的一个代码单词表示;在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配,和卷积层1表示为(21)到(22):
然后,将卷积层1的输出输入到卷积层2中,再将卷积层2的输出输入到卷积层3中;卷积层2有128个过滤器,卷积层3有128个过滤器;卷积层2和卷积层3的输出表示为(17)到(18):
其中,表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128;表示卷积层2的卷积函数;表示卷积层2的输出;表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-128;表示卷积层3的卷积函数;表示卷积层3的输出;
经过步骤8至步骤13的操作,完成了全局特征提取;
利用多层感知机神经网络模型,将提取到的深层特征,包括局部特征和全局化特征,与代码味道检测结果自动匹配,完成分类模型的训练;具体方法为:
步骤14:将步骤7输出的局部特征信息,步骤12和步骤13输出的全局特征信息,在全连接层连接起来,得到多层感知机模型的输入;
步骤15:将步骤14的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的局部信息特征和全局信息特征映射到单个输出中;其中,多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道,该输出层的激活函数为sigmoid函数;
至此,从步骤1到步骤16,完成了模型训练;
其中,步骤1到步骤6,对应模型训练中的代码函数表示A;步骤7对应模型训练中的局部特征信息提取B;步骤8到步骤13,对应模型训练中的全局特征提取C;步骤14到步骤16,对应模型训练中的代码函数味道分类D;
模型测试部分依然采用步骤1到步骤16,其中,模型测试的步骤1到步骤6,对应模型测试中的代码函数表示E;步骤7,对应模型测试中的局部特征提取F;步骤8到步骤13,对应模型训练中的交互特征提取G;步骤14到步骤16,对应模型训练中的代码函数味道分类H;
模型训练结束后,再根据步骤1到步骤15所描述的过程,完成对代码函数的代码味道检测测试,最终得到代码味道检测结果。
2.如权利要求1所述的种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,对分词后的长度进行统一并拼接表示的方法为:
若代码标识符所包含的单词数超过了q,则将多出的单词删除;若代码标识符所包含的单词数少于q,则将空余部分用*补齐;
3.如权利要求2所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,n取值范围为5到15。
4.如权利要求1所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,步骤2中,每个单词序列的长度q的取值为5。
5.如权利要求1所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,步骤4中,单词嵌入函数为Word2vec。
6.如权利要求1所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,步骤5中,单词嵌入函数为Word2vec。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011631064.3A CN112698833B (zh) | 2020-12-31 | 2020-12-31 | 一种基于局部和全局特征的特征依恋代码味道检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011631064.3A CN112698833B (zh) | 2020-12-31 | 2020-12-31 | 一种基于局部和全局特征的特征依恋代码味道检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112698833A CN112698833A (zh) | 2021-04-23 |
CN112698833B true CN112698833B (zh) | 2022-05-31 |
Family
ID=75513552
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011631064.3A Active CN112698833B (zh) | 2020-12-31 | 2020-12-31 | 一种基于局部和全局特征的特征依恋代码味道检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112698833B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108664269A (zh) * | 2018-05-14 | 2018-10-16 | 北京理工大学 | 一种基于深度学习的特征依恋代码异味检测方法 |
CN110413319A (zh) * | 2019-08-01 | 2019-11-05 | 北京理工大学 | 一种基于深度语义的代码函数味道检测方法 |
CN110502277A (zh) * | 2019-08-30 | 2019-11-26 | 西安邮电大学 | 一种基于bp神经网络的代码坏味检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11334467B2 (en) * | 2019-05-03 | 2022-05-17 | International Business Machines Corporation | Representing source code in vector space to detect errors |
-
2020
- 2020-12-31 CN CN202011631064.3A patent/CN112698833B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108664269A (zh) * | 2018-05-14 | 2018-10-16 | 北京理工大学 | 一种基于深度学习的特征依恋代码异味检测方法 |
CN110413319A (zh) * | 2019-08-01 | 2019-11-05 | 北京理工大学 | 一种基于深度语义的代码函数味道检测方法 |
CN110502277A (zh) * | 2019-08-30 | 2019-11-26 | 西安邮电大学 | 一种基于bp神经网络的代码坏味检测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112698833A (zh) | 2021-04-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112000791B (zh) | 一种电机故障知识抽取系统及方法 | |
CN110413319B (zh) | 一种基于深度语义的代码函数味道检测方法 | |
CN111382565B (zh) | 基于多标签的情绪-原因对抽取方法及系统 | |
CN111209401A (zh) | 网络舆情文本信息情感极性分类处理系统及方法 | |
CN109857846B (zh) | 用户问句与知识点的匹配方法和装置 | |
CN110929034A (zh) | 一种基于改进lstm的商品评论细粒度情感分类方法 | |
CN112711953A (zh) | 一种基于注意力机制和gcn的文本多标签分类方法和系统 | |
CN114816497B (zh) | 基于bert预训练模型的链接生成方法 | |
CN111709244A (zh) | 一种用于矛盾纠纷事件因果关系识别的深度学习方法 | |
CN116956929B (zh) | 针对桥梁管养文本数据的多特征融合命名实体识别方法、装置 | |
CN112561718A (zh) | 基于BiLSTM权重共享的案件微博评价对象情感倾向性分析方法 | |
CN114706559A (zh) | 一种基于需求识别的软件规模度量方法 | |
CN113742733A (zh) | 阅读理解漏洞事件触发词抽取和漏洞类型识别方法及装置 | |
CN114647715A (zh) | 一种基于预训练语言模型的实体识别方法 | |
CN113868432A (zh) | 一种用于钢铁制造企业的知识图谱自动构建方法和系统 | |
CN114547619A (zh) | 一种基于树的漏洞修复系统及修复方法 | |
CN116821168A (zh) | 一种改进的基于生成式大语言模型的nl2sql方法 | |
CN113378024A (zh) | 一种基于深度学习面向公检法领域的相关事件识别方法 | |
CN112698833B (zh) | 一种基于局部和全局特征的特征依恋代码味道检测方法 | |
CN116842263A (zh) | 一种智能问答式理财顾问模型的训练处理方法及装置 | |
CN116611447A (zh) | 一种基于深度学习方法的信息抽取和语义匹配系统及方法 | |
CN115062109A (zh) | 一种基于实体对注意力机制的实体关系联合抽取方法 | |
CN112530414B (zh) | 迭代式大规模发音词典构建方法及装置 | |
CN112328479A (zh) | 一种基于深度特征交互网络的上帝类代码味道检测方法 | |
Zhu et al. | Siamese ELECTRA Network Combined with BERT for Semantic Similarity |
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 |