CN112328478A - 一种基于微调和深度交互的代码味道检测方法 - Google Patents
一种基于微调和深度交互的代码味道检测方法 Download PDFInfo
- Publication number
- CN112328478A CN112328478A CN202011207766.9A CN202011207766A CN112328478A CN 112328478 A CN112328478 A CN 112328478A CN 202011207766 A CN202011207766 A CN 202011207766A CN 112328478 A CN112328478 A CN 112328478A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- input
- output
- name
- 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.)
- Pending
Links
- 235000019640 taste Nutrition 0.000 title claims abstract description 85
- 238000001514 detection method Methods 0.000 title claims abstract description 54
- 230000003993 interaction Effects 0.000 title claims abstract description 19
- 230000002452 interceptive effect Effects 0.000 claims abstract description 100
- 238000000034 method Methods 0.000 claims abstract description 76
- 238000012549 training Methods 0.000 claims abstract description 45
- 238000005259 measurement Methods 0.000 claims abstract description 26
- 230000006870 function Effects 0.000 claims description 144
- 238000000605 extraction Methods 0.000 claims description 73
- 239000013598 vector Substances 0.000 claims description 50
- 238000013527 convolutional neural network Methods 0.000 claims description 33
- 230000004913 activation Effects 0.000 claims description 17
- 239000011159 matrix material Substances 0.000 claims description 16
- 238000012360 testing method Methods 0.000 claims description 16
- 230000007246 mechanism Effects 0.000 claims description 14
- 238000013528 artificial neural network Methods 0.000 claims description 11
- 238000013135 deep learning Methods 0.000 claims description 11
- 238000003062 neural network model Methods 0.000 claims description 11
- 230000008569 process Effects 0.000 claims description 11
- 210000004027 cell Anatomy 0.000 claims description 10
- 238000013507 mapping Methods 0.000 claims description 7
- 238000006243 chemical reaction Methods 0.000 claims description 5
- 102100033620 Calponin-1 Human genes 0.000 claims description 4
- 102100033591 Calponin-2 Human genes 0.000 claims description 4
- 102100033592 Calponin-3 Human genes 0.000 claims description 4
- 101000945318 Homo sapiens Calponin-1 Proteins 0.000 claims description 4
- 101000945403 Homo sapiens Calponin-2 Proteins 0.000 claims description 4
- 101000945410 Homo sapiens Calponin-3 Proteins 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 claims description 4
- 230000009466 transformation Effects 0.000 claims description 4
- 238000013145 classification model Methods 0.000 claims description 3
- 230000011218 segmentation Effects 0.000 claims description 3
- 210000002569 neuron Anatomy 0.000 claims description 2
- 238000007781 pre-processing Methods 0.000 claims description 2
- 238000000844 transformation Methods 0.000 claims description 2
- 238000010586 diagram Methods 0.000 description 8
- 238000010801 machine learning Methods 0.000 description 5
- 238000013461 design Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000018109 developmental process Effects 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- HVBDBNBRWGIRLT-UHFFFAOYSA-N 4-nitrosoprocainamide Chemical compound CCN(CC)CCNC(=O)C1=CC=C(N=O)C=C1 HVBDBNBRWGIRLT-UHFFFAOYSA-N 0.000 description 1
- 101150032944 Cnn1 gene Proteins 0.000 description 1
- -1 Cnn2 Proteins 0.000 description 1
- 206010013911 Dysgeusia Diseases 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000000593 degrading effect Effects 0.000 description 1
- 239000000796 flavoring agent Substances 0.000 description 1
- 235000019634 flavors Nutrition 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- 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/044—Recurrent networks, e.g. Hopfield 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/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)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Biophysics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Computational Linguistics (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Machine Translation (AREA)
Abstract
本发明涉及一种基于微调和深度交互的代码味道检测方法,属于计算机软件重构技术领域。本方法通过提取文本信息和结构化信息中的语义特征、数字化特征和交互特征,以及使用预训练和微调的训练方式,能够自动地提取代码中的特征信息,并将提取出的特征信息与检测结果自动匹配,在较小的检测时间下,能够保证检测结果具有较高的召回率和精确度。本方法除了加入已有代码度量中的结构化信息,还加入了源代码中的文本信息以及交互特征信息,利用文本信息中的上下文语义关系和本信息和度量值信息存在的三种交互特征信息对代码味道进行更深入的检测。
Description
技术领域
本发明涉及一种基于微调和深度交互的代码味道检测方法,属于计算机软件重构技术领域。
背景技术
程序源代码的质量是现代软件工程中的关键问题之一。随着产品需求的不断变化,程序设计之初设计的代码框架需要不断调整,以实现功能的变化。随着时间的推移,程序会逐渐偏离原来的框架,从而使代码质量下降,产生代码味道。代码味道是弱点或设计缺陷的标志,可能导致软件系统在可读性、可维护性和可扩展性方面的问题。为了解决这个问题,人们提出了软件重构,通过重构软件的内部结构来提高软件的可维护性和可扩展性,而外部行为保持不变。多年来,开发过程中的实践和应用表明,代码重构在提高程序的可读性和可维护性方面起着重要作用。
软件重构的关键步骤之一是识别需要重构的代码片段。为了帮助开发人员确定在程序中何处重构,Fowler等人提出了代码味道的概念。代码味道意味着影响软件系统中软件质量的设计问题,Fowler等人总共引入了22种代码味道,包括Feature Envy,LongMethod以及God Class等。基于这一定义,研究人员提出了一系列自动或半自动的方法来检测代码味道。
近年来,研究人员提出了许多方法来检测软件代码味道。现有的检测方法主要是基于通用软件度量,例如LOC、NOA以及TCC等。不同的检测方法往往使用不同的度量和不同的阈值,检测结果往往差异很大。因此,人工构造最佳的启发式方法是非常具有挑战性的。为了避免人工设计规则,研究人员提出了传统的基于机器学习的代码味道检测方法,如SVM、J-48和朴素贝叶斯。这些方法能够额外的提供主观性,从而避免人们对代码味道的认识不同的问题,同时,这些方法能够自动地从代码度量中提取相应的特征完成对代码味道的识别。
然而,当同时检测两种或者更多种代码味道时,这些基于传统的机器学习的方法并没有很好地表现。
基于深度学习的技术已经广泛在各个被使用,例如自然语言处理、计算机视觉、推荐系统等。深度学习等技术的架构是基于多层神经网络的,其目的主要贡献在于可以对高维数据进行有效的建模。与基于传统的机器学习技术不同,深度学习技术提供了从低到高的多层次的数据抽象,并在深度特征提取上取得了更好的表现。目前,深度学习技术已经成功应用于代码味道检测当中。例如,刘辉等人提出了一种基于深度学习的方法来检测坏味代码,这种方法利用了文本信息和代码度量值,但是,其并没有考虑到文本信息和代码度量值的交互信息,也没有考虑到用合成的数据集并不能很好地预测真实生活中的坏味代码情况。
因此,如何克服现有技术的缺陷,寻找更为有效的检测方法,成为本领域的重要研究方向。
发明内容
本发明的目的是为了解决软件重构领域已有的代码味道检测方法存在真实数据集数量少以及没有考虑到交互信息等技术问题,创造性地提出一种基于微调和深度交互的代码味道检测方法。
本发明是通过以下技术方案实现的。
一种基于微调和深度交互的代码味道检测方法,包括模型训练和模型测试。其中,模型训练包括代码函数表示A、结构化特征提取B、交互特征提取C和代码味道分类D;模型测试包括代码函数表示E、结构化特征提取F、交互特征提取G和代码味道分类H。代码函数表示A和代码函数表示E是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取B和结构化特征提取F是基于卷积神经网络的结构化特征提取;交互特征提取C和交互特征提取G是基于Transformer的交互特征提取;代码味道分类D和代码味道分类H是基于多层感知机的代码味道分类。
代码函数A表示和代码函数表示E的操作为:基于注意力机制和LSTM神经网络,对被检测的代码函数进行特征表示并进行语义特征提取。具体方法为:
步骤1:将被检测的代码函数所在的项目名、包名、类名和函数名作为一个元组拼接在一起,输出代码标识符,作为深度语义提取的文本输入,用公式(1)中的符号textual_input表示:
textual_input=<namepr,namepa,namec,namem> (1)
其中,namepr代表代码函数所在的项目名;namepa代表代码函数所在的包名;namec代表代码函数所在的类名;namem代表代码函数所在的函数名。namepr,namepa,namec和namem统称代码标识符。
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词,再对分词后的长度进行统一并拼接表示。
其中,经分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为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的三个激活状态;σ是logisticsigmoid激活函数,b表示运算时的偏置参数,tanh(·)是一种非线性激活函数,表示元素乘积;W表示对应隐藏层状态h的权重矩阵,Wc表示单元状态c对应的权重矩阵;ht表示时间状态t对应的隐藏层状态,ct表示时间状态t对应的单元状态,表示时间状态t计算过程中临时的单元状态。bc表示单元状态c对应的偏置参数。
步骤5:将步骤4的输出的LSTM层隐藏层状态h,输入到一个自注意力机制层,输出上下文语义特征m。
选用自注意力机制层的原因为:不是所有的隐藏层状态都能平等的反应隐藏在代码中的语义特征,利用自注意力机制层可以自动选择出对代码味道检测有着重要影响的上下文语义特征。
其中,上下文语义特征m由步骤4中的隐藏层状态的权重和组成:
其中,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;hk表示第k个输入在编码器的输出。
经过步骤1到步骤5,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取。
结构化特征提取B和结构化特征提取F的操作为:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息进行结构化特征提取。具体方法为:
步骤6:利用代码重构工具,对需要检测的代码进行结构化信息提取,得到相应的代码度量。
步骤7:对步骤6输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input。将所有的代码度量分为4组,按照项目、包、类和函数的包含顺序连接起来,作为结构化特征提取部分的输入。
其中,结构化信息由metric_input表示:
metric_input=concat(grouppr,grouppa,groupc,groupm) (12)
=concat(m1,m2,…,mi,…,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的操作,完成了结构化特征提取。
交互特征提取C和交互特征提取G的操作为:利用Transformer模型,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数,进行相应的交互特性提取。具体方法为:
步骤10:利用Transformer模型,分别提取三部分的交互特征:度量之间的交互特征、文本信息之间的交互特征、度量和文本信息之间的交互特征。
Transformer模型中attention的计算,采用点乘计算方法,即:
其中,Q代表query,K代表keys,V代表values。attention函数看作将一个query和一系列key-value对映射为一个输出(output)的过程,query、keys、values以及output都是向量。输出是由带权的values加起来得到,每个value的权重根据query和相应的key通过查询函数计算出来。
multi-head self-attention通过h个不同的线性变换对Q、K、V进行投影,最后将不同的attention结果拼接起来,表示为(20)到(21):
S=Concat(head1,…,headh)WH (20)
headi=Attention(ETWQ,ETWK,ETWV) (21)
其中,WQ,WK,WV,WH是输入信息的映射矩阵,ET是输入信息的嵌入矩阵,h是注意力头的数量。
之后,通过前馈网络进一步处理非线性变换,包括两个线性变化,中间有一个ReLu激活函数,用P表示提取到的交互特征信息,即:
S′=LayerNorm(E+Dropout(s)) (22)
P=LayerNorm(S′+Dropout(LeakyRelu(S′W1+b1)W2+b2)) (23)
其中,W1、W2、b1、b2是学习参数,LayerNorm是标准正则化;LeakyRelu是激活函数;Dropout表示在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。
具体地,利用Transformer模型提取度量之间的交互特征、文本信息之间的交互特征、度量和文本信息之间的交互特征三者的方法为:
步骤10.1:将步骤3输出的V(m_input)单词向量输入到Transformer模型,得到文本之间的交互特征信息P1。然后把P1输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量。之后通过全连接层输出结果。
步骤10.2:将步骤7输出的metric_input度量值向量输入到Transformer模型,得到度量值之间的交互特征信息P2。然后把P2输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量。之后通过全连接层输出结果。
步骤10.3:将步骤3输出的V(m_input)单词向量和步骤7输出的metric_input结构化信息拼接起来得到p_input。然后把p_input输入到Transformer模型,得到度量值与文本之间的交互特征信息P3。之后把P3输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量。最后通过全连接层输出结果:
pinput=concat(minput,metricinput) (24)
步骤11:将步骤10的三个输出拼接起来,得到三种交互特征信息。
经过步骤10至步骤11的操作,完成了交互特征提取。
代码函数味道分类,是在基于注意力机制、LSTM神经网络代码函数表示操作、基于CNN的结构化特征提取以及基于Transformer的交互特征提取的基础上进行的。利用多层感知机神经网络模型,将提取到的深层特征(包括语义特征和结构化特征)与代码味道检测结果自动匹配,完成分类模型的训练。具体方法为:
步骤12:将步骤5输出的上下文语义特征和步骤9输出的结构化特征以及步骤11输出的交互特征在全连接层连接起来,得到多层感知机模型的输入。
步骤13:经过步骤1到步骤12的操作,使用人工合成的数据集预训练了一个神经网络模型。重复步骤1到步骤12的操作,使用真实数据集微调预训练得到的神经网络模型的参数。
步骤14:将步骤13的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的上下文语义特征、从代码度量信息中提取出的结构化特征、从文本信息和代码度量信息提取的三种交互特征映射到单个输出中。
其中,多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道,该输出层的激活函数为sigmoid函数。
步骤15:将步骤14的输出结果与数据集中的标签比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练。binary_cross_entropy损失函数表示为:
至此,从步骤1到步骤15,完成了模型训练。
其中,步骤1到步骤5,对应模型训练中的代码函数表示A;步骤6到步骤9,对应模型训练中的结构化特征提取B;步骤10到步骤11,对应模型训练中的交互特征提取C;步骤13到步骤14,对应模型训练中的代码函数味道分类D;
模型测试部分与步骤1到步骤14完全相同,其中,步骤1到步骤5,对应模型测试中的代码函数表示E;步骤6到步骤9,对应模型测试中的结构化特征提取F;步骤10到步骤11,对应模型训练中的交互特征提取G;步骤13到步骤14,对应模型训练中的代码函数味道分类H。
模型训练结束后,再根据步骤1到步骤13所描述的过程,完成对代码函数的代码味道检测测试,最终得到代码味道检测结果。
有益效果
本发明方法,与现有代码味道检测方法相比,具有如下优点:
1.本方法与基于启发式规则的代码味道检测方法相比,能够自动地提取代码中的特征信息,消除了人工提取特征的步骤,降低了人力成本。
2.本方法与基于启发式规则的代码味道检测方法相比,能够将提取出的特征信息与检测结果自动匹配,减少了人工设计规则的时间和人力成本。
3.本方法与基于度量的代码味道检测方法相比,除了加入已有代码度量中的结构化信息,还加入了源代码中的文本信息以及交互特征信息,利用文本信息中的上下文语义关系和本信息和度量值信息存在的三种交互特征信息对代码味道进行更深入的检测。
4.本方法与传统的基于代码味道检测方法相比,在训练方式上采用了预训练+微调的训练方式,有效的解决了真实的代码味道数据集稀疏的问题。
5.本方法与基于传统机器学习的代码味道检测方法相比,提高了检测的精准率和查全率。
附图说明
图1为本发明方法代码函数表示部分的结构图。图从下到上分别表示代码函数标识的输入层,单词序列层,单词嵌入层、单词向量层、LSTM层、自注意力机制层以及输出层;代码函数表示的输入为四种代码标识符,即项目名、包名、类名和函数名;代码函数表示的输出为从代码函数中提取的上下文语义特征。
图2为本发明方法结构化特征提取部分的结构图。图从左到右分别表示结构化特征提取的输入层、CNN神经网络模型、扁平层;其中,结构化特征提取的输入为4组代码度量;CNN神经网络包含3层卷积操作,包括Cnn1,Cnn2和Cnn3。
图3为本发明方法交互特征部分的结构图。图从下到上分别表示交互特征的输入层(包括代码函数表示和结构化特征),Transformer层,扁平层、全连接层和输出层;交互特征提取部分输出的是三种交互特征:度量之间的交互特征,文本信息之间的交互特征以及度量和文本信息之间的交互特征。
图4为本发明方法基于多层感知机分类器的结构图;图中①表示代码函数表示部分。图中②表示结构化特征提取部分;图中③表示交互特征提取部分;图中④表示基于多层感知机的代码味道检测部分。
其中,①、②和③的详细结构图分别为图1、图2和图3;④中从上到下分别为全连接层、多层感知机层和输出层;全连接层将①、②和③的输出连接起来,多层感知机层自动的将①输出的上下文语义特征、②输出的结构化特征和③输出的交互特征于分类结果进行匹配,输出层通过sigmoid激活函数将结果分为两类,即存在代码味道和不存在代码味道。
具体实施方式
下面结合附图和实施例对本发明方法做进一步进行详细说明。
实施例
本实例采用本发明提出的方法,建立一种基于微调和深度交互的代码味道检测系统,该检测系统采用Python开发平台,Tensorflow资源库。采用来自github上的软件测试工具Junit项,Junit开源项目的地址为https://github.com/junit-team/junit4,以及和来自sourceforge上的思维导图软件FreeMind提供的源代码https://sourceforge.net/projects/freemind。
利用代码重构工具PMD将Junit项目源代码中所有函数的相关信息提取出来,用作训练集1,将FreeMind项目源代码所有函数的相关信息提取出来,并且分为训练集2和测试集。模型训练和模型测试的具体步骤如下:
其中,模型训练包括代码函数表示A、结构化特征提取B、交互特征提取C和代码味道分类D;模型测试包括代码函数表示E、结构化特征提取F、交互特征提取G和代码味道分类H。
代码函数表示A和代码函数表示E是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取B和结构化特征提取F是基于卷积神经网络的结构化特征提取;交互特征提取C和交互特征提取G是基于Transformer的交互特征提取;代码味道分类D和代码味道分类H是基于多层感知机的代码味道分类;
代码函数表示的操作是:
步骤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)。如图1所示。
步骤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输出的单词序列,将单词序列中的每一个单词输入到单词嵌入层完成单词到单词向量的转换,转换后将其拼接起来。如图1所示。
步骤4:将步骤3的得到的单词向量输入到LSTM层,用于提取句子中各个单词之间的上下文关系,并且从这些关系中获取到相关的语义特征。如图1所示。
步骤5:将步骤4得到的隐藏层状态输入到自注意力机制中,以提取出对代码味道检测有着重要作用的隐藏层状态。如图1所示。
经过步骤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组,按照项目、包、类和函数的顺序连接起来,作为结构化特征提取部分的输入。如图2所示。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的神经网络模型中。通过三层卷积神经网络的特征提取,获得相应的结构化特征。如图2所示。
步骤9:将步骤8得到的结构化特征输入到一个扁平操作中,将通过卷积神经网络提取出的深度结构化特征转变为一个一维向量。如图2所示。
经过步骤6至步骤9的操作,完成结构化特征提取部分的操作;
所述交互特征提取B和交互特征提取F的操作是:利用已有的Transformer模型,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数进行相应的交互特性提取,具体为:
步骤10:利用已有的Transformer模型,分别提取三部分的交互特征:度量之间的交互特征,文本信息之间的交互特征以及度量和文本信息之间的交互特征。
步骤10.1:将步骤3的得到的单词向量输入到Transformer模型,得到文本之间的交互特征信息;然后把交互特征信息输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量;之后通过全连接层输出结果。如图3所示。
步骤10.2:将步骤7的得到的结构化信息输入到Transformer模型,得到结构化信息之间的交互特征信息;然后把交互特征信息输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量;之后通过全连接层输出结果;如图3所示。
步骤10.3:将步骤3得到的单词向量和步骤7得到的度量值向量拼接起来,然后输入到Transformer模型,得到度量值与文本之间的交互特征信息;然后把交互特征信息输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量;之后通过全连接层输出结果;如图3所示。
步骤11:将步骤10.1得到的文本之间的交互特征信息,步骤10.2得到的结构化信息之间的交互特征信息以及步骤10.3得到的度量值与文本之间的交互特征信息拼接起来,得到三种交互特征信息。如图3所示。
经过步骤10至步骤11的操作,完成交互特征提取部分的操作;
所述代码函数味道分类是在基于注意力机制和LSTM神经网络代码函数表示操作和基于CNN的结构化特征提取以及基于Transformer的交互特征提取的基础上进行的,利用多层感知机神经网络模型将提取到的深层特征包括语义特征和结构化特征与代码味道检测结果自动地匹配起来,完成分类模型的训练,具体为:
步骤12:将步骤5输出的上下文语义特征和步骤9输出的结构化特征以及步骤11输出的交互特征在全连接层连接起来,得到多层感知机模型的输入;在全连接层连接起来,得到多层感知机模型的输入。如图4所示。
步骤13:经过步骤1到步骤12操作,已经使用人工合成的大型数据集预训练了一个神经网络模型。接下来重复步骤1到步骤12的操作,使用真实数据集FreeMind项目源代码微调预训练得到的神经网络模型的参数。
步骤14:将步骤13的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的上下文语义特征和从代码度量信息中提取出的结构化特征以及从文本信息和代码度量信息提取的三种交互特征映射到单个输出中;如图4所示。
步骤15:将步骤14的输出结果与数据集中的标签相比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练。
以上为本发明的模型训练部分,模型训练部分可以得到基于深度语义的代码函数味道检测模型,利用此模型能够完成对代码中的函数的坏味道检测。
本发明的使用过程与上述测试过程的步骤1-14完全相同,根据步骤1-13所描述的过程,即可完后对代码函数的代码味道检测,得到代码味道检测结果。
经过上述步骤的操作,采用本发明提出的方法得到的检索结果的召回率和准确率如表2中的第2行所示。
为说明本发明的检索效果,在同等条件下,以相同的实验数据分别采用JDeodorant工具和Deep Learning方法进行比较,得到的检索结果的召回率和准确率分别如表1中的第2行和第3行所示。
通过表1可以得出以下结论:基于深度语义的代码函数代码味道检测方法利用嵌入在代码中的语义关系,自动地提取文本信息和结构化信息中的高维特征,将特征自动地映射到分类结果中,实现了比基于传统的机器学习的方法更高的准确率和召回率,验证了其有效性。
表1三种检测方式效果比较
Claims (7)
1.一种基于微调和深度交互的代码味道检测方法,其特征在于:
首先,进行模型训练和模型测试;
其中,模型训练包括代码函数表示A、结构化特征提取B、交互特征提取C和代码味道分类D;模型测试包括代码函数表示E、结构化特征提取F、交互特征提取G和代码味道分类H;
代码函数表示A和代码函数表示E是基于注意力机制和LSTM神经网络的代码函数表示;结构化特征提取B和结构化特征提取F是基于卷积神经网络的结构化特征提取;交互特征提取C和交互特征提取G是基于Transformer的交互特征提取;代码味道分类D和代码味道分类H是基于多层感知机的代码味道分类;
代码函数A表示和代码函数表示E的操作为:基于注意力机制和LSTM神经网络,对被检测的代码函数进行特征表示并进行语义特征提取,具体方法为:
步骤1:将被检测的代码函数所在的项目名、包名、类名和函数名作为一个元组拼接在一起,输出代码标识符,作为深度语义提取的文本输入,用公式(1)中的符号textual_input表示:
textual_input=<namepr,namepa,namec,namem> (1)
其中,namepr代表代码函数所在的项目名;namepa代表代码函数所在的包名;namec代表代码函数所在的类名;namem代表代码函数所在的函数名;namepr,namepa,namec和namem统称代码标识符;
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词,再对分词后的长度进行统一并拼接表示;
其中,经分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为q;
步骤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;
公式(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的三个激活状态;σ是logisticsigmoid激活函数,b表示运算时的偏置参数,tanh(·)是一种非线性激活函数,表示元素乘积;W表示对应隐藏层状态h的权重矩阵,Wc表示单元状态c对应的权重矩阵;ht表示时间状态t对应的隐藏层状态,ct表示时间状态t对应的单元状态,表示时间状态t计算过程中临时的单元状态;bc表示单元状态c对应的偏置参数;
步骤5:将步骤4的输出的LSTM层隐藏层状态h,输入到一个自注意力机制层,输出上下文语义特征m;
其中,上下文语义特征m由步骤4中的隐藏层状态的权重和组成:
其中,n对应单词序列中的单词数量,即4q,n的取值范围是16-40;ht是句子序列中的第t个单词对应的隐藏层状态,即表示时间状态t对应的隐藏层状态;at是ht的注意力权重,表示第t个隐藏层状态对代码味道检测的重要程度;
对应每一个隐藏层状态的注意力权重at定义如公式(10)-(11):
e(ht)=W1tanh(W2ht) (10)
其中,W1和W2为权重矩阵;e(·)是计算隐藏层状态对代码味道检测重要程度的分数函数;tanh(·)是一种非线性激活函数;ht表示句子序列中的第t个单词对应的隐藏层状态,t的取值范围是0-n;hk表示第k个输入在编码器的输出;
经过步骤1到步骤5,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取;
结构化特征提取B和结构化特征提取F的操作为:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息进行结构化特征提取,具体方法为:
步骤6:利用代码重构工具,对需要检测的代码进行结构化信息提取,得到相应的代码度量;
步骤7:对步骤6输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input;将所有的代码度量分为4组,按照项目、包、类和函数的包含顺序连接起来,作为结构化特征提取部分的输入;
其中,结构化信息由metric_input表示:
metric_input=concat(grouppr,grouppa,groupc,groupm) (12)
=concat(m1,m2,…,mi,…,mx). (13)
其中,grouppr、grouppa、groupc和groupm分别表示项目、包、类和函数对应的代码度量;x表示结构化信息metric_input包含代码度量的总数;mi表示结构化信息中的第i个代码度量,i的取值范围为1到x;
步骤8:将步骤7输出的结构化信息metric_input输入到卷积神经网络模型CNN中,得到对应的结构化特征outputl3;
步骤9:将步骤8输出的结构化特征outputl3输入到一个扁平操作中,将通过卷积神经网络提取出的结构化特征outputl3转变为一个一维向量;
经过步骤6至步骤9的操作,完成了结构化特征提取;
交互特征提取C和交互特征提取G的操作为:利用Transformer模型,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数,进行相应的交互特性提取,具体方法为:
步骤10:利用Transformer模型,分别提取三部分的交互特征:度量之间的交互特征、文本信息之间的交互特征、度量和文本信息之间的交互特征;
Transformer模型中attention的计算,采用点乘计算方法,即:
其中,Q代表query,K代表keys,V代表values;attention函数看作将一个query和一系列key-value对映射为一个输出(output)的过程,query、keys、values以及output都是向量;输出是由带权的values加起来得到,每个value的权重根据query和相应的key通过查询函数计算出来;
multi-head self-attention通过h个不同的线性变换对Q、K、V进行投影,最后将不同的attention结果拼接起来,表示为:
S=Concat(head1,…,headh)WH (20)
headi=Attention(ETWQ,ETWK,ETWV) (21)
其中,WQ,WK,WV,WH是输入信息的映射矩阵,ET是输入信息的嵌入矩阵,h是注意力头的数量;
之后,通过前馈网络进一步处理非线性变换,包括两个线性变化,中间有一个ReLu激活函数,用P表示提取到的交互特征信息,即:
S′=LayerNorm(E+Dropout(s)) (22)
P=LayerNorm(S′+Dropout(LeakyRelu(S′W1+b1)W2+b2)) (23)
其中,W1、W2、b1、b2是学习参数,LayerNorm是标准正则化;LeakyRelu是激活函数;
步骤11:将步骤10的三个输出拼接起来,得到三种交互特征信息;
经过步骤10至步骤11的操作,完成了交互特征提取;
代码函数味道分类,是在基于注意力机制、LSTM神经网络代码函数表示操作、基于CNN的结构化特征提取以及基于Transformer的交互特征提取的基础上进行的;利用多层感知机神经网络模型,将提取到的深层特征与代码味道检测结果自动匹配,完成分类模型的训练;具体方法为:
步骤12:将步骤5输出的上下文语义特征和步骤9输出的结构化特征以及步骤11输出的交互特征在全连接层连接起来,得到多层感知机模型的输入;
步骤13:经过步骤1到步骤12的操作,使用人工合成的数据集预训练了一个神经网络模型;重复步骤1到步骤12的操作,使用真实数据集微调预训练得到的神经网络模型的参数;
步骤14:将步骤13的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的上下文语义特征、从代码度量信息中提取出的结构化特征、从文本信息和代码度量信息提取的三种交互特征映射到单个输出中;
其中,多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道,该输出层的激活函数为sigmoid函数;
步骤15:将步骤14的输出结果与数据集中的标签比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练;binary_cross_entropy损失函数表示为:
至此,从步骤1到步骤15,完成了模型训练;
其中,步骤1到步骤5,对应模型训练中的代码函数表示A;步骤6到步骤9,对应模型训练中的结构化特征提取B;步骤10到步骤11,对应模型训练中的交互特征提取C;步骤13到步骤14,对应模型训练中的代码函数味道分类D。
模型测试部分与步骤1到步骤14完全相同,其中,步骤1到步骤5,对应模型测试中的代码函数表示E;步骤6到步骤9,对应模型测试中的结构化特征提取F;步骤10到步骤11,对应模型训练中的交互特征提取G;步骤13到步骤14,对应模型训练中的代码函数味道分类H;
模型训练结束后,再根据步骤1到步骤13所描述的过程,完成对代码函数的代码味道检测测试,最终得到代码味道检测结果。
2.如权利要求1所述的一种基于微调和深度交互的代码味道检测方法,其特征在于,步骤1中每个单词序列的长度q的取值范围为4-10。
3.如权利要求1所述的一种基于微调和深度交互的代码味道检测方法,其特征在于,步骤2对分词后的长度进行统一并拼接表示的方法为:
步骤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的数量;concat(·)为将输入连接起来的函数,concat(w1,w2,···,wn)表示将w1,w2,···,wn连接起来;单词序列所包含的单词n的数量是4q个。
4.如权利要求3所述的一种基于微调和深度交互的代码味道检测方法,其特征在于,n的取值范围为16到40。
5.如权利要求1所述的一种基于微调和深度交互的代码味道检测方法,其特征在于,步骤3中,单词嵌入函数为Word2vec。
6.如权利要求1所述的一种基于微调和深度交互的代码味道检测方法,其特征在于,其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3;将结构化信息metric_input转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1;
卷积层1中的每一个卷积操作包括一个过滤器Wl1(),这个过滤器作用于一个代码度量上,生成一个新的特征;卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
ci=tanh(Wl1(j)·mi+bl1(j)). (14)
其中,Wl1(j)表示i个卷积操作中的第j个过滤器的权重矩阵;bl1(j)是第j个过滤器的偏置参数;tanh(·)是一个非线性的激活函数;mi表示metric_input中的一个代码度量;i、j的取值范围为1-256;
在卷积层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的输出。
7.如权利要求1所述的一种基于微调和深度交互的代码味道检测方法,其特征在于,利用Transformer模型提取度量之间的交互特征、文本信息之间的交互特征、度量和文本信息之间的交互特征三者的方法为:
步骤10.1:将步骤3输出的V(m_input)单词向量输入到Transformer模型,得到文本之间的交互特征信息P1;然后把P1输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量;之后通过全连接层输出结果;
步骤10.2:将步骤7输出的metric_input度量值向量输入到Transformer模型,得到度量值之间的交互特征信息P2;然后把P2输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量;之后通过全连接层输出结果;
步骤10.3:将步骤3输出的V(m_input)单词向量和步骤7输出的metric_input结构化信息拼接起来得到p_input;然后把p_input输入到Transformer模型,得到度量值与文本之间的交互特征信息P3;之后把P3输入到一个扁平操作中,将通过卷积神经网络提取出的交互特征转变为一个一维向量;最后通过全连接层输出结果pinput=concat(minput,metricinput)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011207766.9A CN112328478A (zh) | 2020-11-03 | 2020-11-03 | 一种基于微调和深度交互的代码味道检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011207766.9A CN112328478A (zh) | 2020-11-03 | 2020-11-03 | 一种基于微调和深度交互的代码味道检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112328478A true CN112328478A (zh) | 2021-02-05 |
Family
ID=74324461
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011207766.9A Pending CN112328478A (zh) | 2020-11-03 | 2020-11-03 | 一种基于微调和深度交互的代码味道检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112328478A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180024911A1 (en) * | 2016-03-07 | 2018-01-25 | T Komp Tomasz Kruszewski | Software code debugger for quick detection of error root causes |
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神经网络的代码坏味检测方法 |
-
2020
- 2020-11-03 CN CN202011207766.9A patent/CN112328478A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180024911A1 (en) * | 2016-03-07 | 2018-01-25 | T Komp Tomasz Kruszewski | Software code debugger for quick detection of error root causes |
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神经网络的代码坏味检测方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110597735B (zh) | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 | |
CN110413319B (zh) | 一种基于深度语义的代码函数味道检测方法 | |
CN112732921B (zh) | 一种虚假用户评论检测方法及系统 | |
CN111274817A (zh) | 一种基于自然语言处理技术的智能化软件成本度量方法 | |
CN118277538B (zh) | 一种基于检索增强语言模型的法律智能问答方法 | |
CN114818703B (zh) | 基于BERT语言模型和TextCNN模型的多意图识别方法及系统 | |
CN108170848A (zh) | 一种面向中国移动智能客服的对话场景分类方法 | |
CN115204143B (zh) | 一种基于prompt的文本相似度计算方法及系统 | |
CN114238649B (zh) | 一种常识概念增强的语言模型预训练方法 | |
CN117151222B (zh) | 领域知识引导的突发事件案例实体属性及其关系抽取方法、电子设备和存储介质 | |
CN115526236A (zh) | 一种基于多模态对比学习的文本网络图分类方法 | |
CN114547299A (zh) | 一种基于复合网络模型的短文本情感分类方法及装置 | |
CN113886562A (zh) | 一种ai简历筛选方法、系统、设备和存储介质 | |
CN113920379A (zh) | 一种基于知识辅助的零样本图像分类方法 | |
CN113378563A (zh) | 一种基于遗传变异、半监督和强化学习的案件特征提取方法及装置 | |
CN113255360A (zh) | 基于层次化自注意力网络的文档评级方法和装置 | |
CN117349311A (zh) | 一种基于改进RetNet的数据库自然语言查询方法 | |
CN115186102A (zh) | 基于双流嵌入和深度神经网络的动态知识图谱补全方法 | |
CN115424663B (zh) | 一种基于attention的双向表示模型的RNA修饰位点预测方法 | |
CN112698833B (zh) | 一种基于局部和全局特征的特征依恋代码味道检测方法 | |
CN114817537A (zh) | 一种基于政策文件数据的分类方法 | |
CN112328478A (zh) | 一种基于微调和深度交互的代码味道检测方法 | |
CN116226371A (zh) | 一种数字经济专利分类方法 | |
CN113821571B (zh) | 基于bert和改进pcnn的食品安全关系抽取方法 | |
CN114969511A (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 |