CN112698833B - 一种基于局部和全局特征的特征依恋代码味道检测方法 - Google Patents

一种基于局部和全局特征的特征依恋代码味道检测方法 Download PDF

Info

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
Application number
CN202011631064.3A
Other languages
English (en)
Other versions
CN112698833A (zh
Inventor
施重阳
殷昕
江贺
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Institute of Technology BIT
Original Assignee
Beijing Institute of Technology BIT
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Institute of Technology BIT filed Critical Beijing Institute of Technology BIT
Priority to CN202011631064.3A priority Critical patent/CN112698833B/zh
Publication of CN112698833A publication Critical patent/CN112698833A/zh
Application granted granted Critical
Publication of CN112698833B publication Critical patent/CN112698833B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/35Clustering; Classification
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/22Matching criteria, e.g. proximity measures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/279Recognition of textual entities
    • G06F40/284Lexical analysis, e.g. tokenisation or collocates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning 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中的单词向量组成:
Figure BDA0002880071790000051
其中,n对应单词序列中的单词数量,即为5;ht是句子序列中的第t个单词对应的隐藏层状态,即表示时间状态t对应的隐藏层状态;at是ht的注意力权重,表示第t个隐藏层状态对代码味道检测的重要程度。
对应的每一个隐藏层状态的注意力权重at定义如公式(15)-(16):
e(ht)=W1 tanh(W2ht) (15)
Figure BDA0002880071790000052
其中,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)所示:
Figure BDA0002880071790000061
经过步骤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损失函数表示为:
Figure BDA0002880071790000091
其中,
Figure BDA0002880071790000092
是数据集中第i条数据的真实分类;y(i)是对第i条数据预测出的代码味道的分类结果;log()表示对数为2的对数函数;N表示训练数据的数据量,且N的取值范围为50000-100000。
至此,从步骤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三种检测方式效果比较
Figure BDA0002880071790000131

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神经网络,对被检测的代码函数进行特征表示并进行特征提取,具体方法为:
步骤1:将被检测的代码函数所在的类名、目标类名和函数名作为一个元组拼接在一起,输出代码标识符,作为深度语义提取的文本输入,用公式(1)中的符号
Figure 414488DEST_PATH_IMAGE001
表示:
Figure 321DEST_PATH_IMAGE002
(1)
其中,
Figure 275445DEST_PATH_IMAGE003
代表代码函数所在的类名; nametc代表代码函数要重构的目标类名;namem代表代码函数所在的函数名;
Figure 233430DEST_PATH_IMAGE004
统称代码标识符;
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词,再对分词后的长度进行统一并拼接表示;
其中,经分词后,每一个代码标识符得到一个单词序列,每个单词序列的长度设置为q;
步骤3:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词;
每一个代码标识符仍然得到一个单词序列,每个单词序列的长度依然设置为q,但接下来不进行拼接;
步骤3.1:若代码标识符所包含的单词数超过了q,则将多出的单词删除;若代码标识符所包含的单词数少于q,则将空余部分用*补齐;
步骤3.2:将得到的
Figure 568596DEST_PATH_IMAGE005
这3个单词序列单独表示起来:
Figure 297518DEST_PATH_IMAGE006
(4)
Figure 438649DEST_PATH_IMAGE007
(5)
Figure 936627DEST_PATH_IMAGE008
(6)
Figure 521323DEST_PATH_IMAGE009
(7)
Figure 471962DEST_PATH_IMAGE010
(8)
Figure 354467DEST_PATH_IMAGE011
(9)
其中,
Figure 769268DEST_PATH_IMAGE012
分别表示所在类名、目标类名、函数名;
Figure 711816DEST_PATH_IMAGE013
表示本类名单词序列,
Figure 461335DEST_PATH_IMAGE014
表示目标类名单词序列,
Figure 881952DEST_PATH_IMAGE015
表示函数名单词序列;
步骤4:根据步骤2输出的
Figure 354522DEST_PATH_IMAGE016
,将
Figure 530288DEST_PATH_IMAGE016
长单词序列转换为一个包含有n个单词的长句子,将句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;单词嵌入层将每一个单词转换为单词向量,表示如公式(10):
Figure 455519DEST_PATH_IMAGE017
=concat(V(w1),V(w2),…,V(wn)) (10)
其中,V(
Figure 679827DEST_PATH_IMAGE018
)表示单词嵌入函数,即将输入的(
Figure 554373DEST_PATH_IMAGE018
)转换为相对应的单词向量;
Figure 838724DEST_PATH_IMAGE019
表示一个单词;
Figure 251251DEST_PATH_IMAGE020
表示将转换为一个单词向量,下标i的取值范围为1到n;
公式(10)表明,将
Figure 341566DEST_PATH_IMAGE016
转换为单词向量等价于将
Figure 523149DEST_PATH_IMAGE016
所包含的每一个wi转换为对应的单词向量
Figure 712822DEST_PATH_IMAGE020
,再将
Figure 915440DEST_PATH_IMAGE021
个单词向量经
Figure 481551DEST_PATH_IMAGE022
函数连接起来;
步骤5:根据步骤3输出的
Figure 845536DEST_PATH_IMAGE012
的单个单词序列,不同于步骤4,而是对单个的单词序列
Figure 206110DEST_PATH_IMAGE012
变为3个长度为5的长句子,将3个句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;单词嵌入层将每一个单词转换为单词向量,表示如公式(11)(12)(13):
Figure 593229DEST_PATH_IMAGE023
Figure 776080DEST_PATH_IMAGE024
(11)
Figure 666676DEST_PATH_IMAGE025
Figure 463730DEST_PATH_IMAGE026
(12)
Figure 134883DEST_PATH_IMAGE027
Figure 308375DEST_PATH_IMAGE028
(13)
其中,V(
Figure 319057DEST_PATH_IMAGE018
)表示单词嵌入函数,即将输入的(
Figure 598597DEST_PATH_IMAGE018
)转换为相对应的单词向量;
Figure 694729DEST_PATH_IMAGE020
表示将
Figure 406333DEST_PATH_IMAGE019
转换为一个单词向量,下标i的取值范围为1到n;
公式(11)(12)(13)表明,将
Figure 333838DEST_PATH_IMAGE029
转换为单词向量等价于将
Figure 472695DEST_PATH_IMAGE029
所包含的每一个wi转换为对应的单词向量
Figure 56123DEST_PATH_IMAGE030
,再将n个单词向量经concat(·)函数连接起来;
步骤6:将步骤5输出的单词向量,输入到一个自注意力机制层,输出上下文语义特征m;利用自注意力机制层自动选择出对代码味道检测有着重要影响的上下文语义特征;
其中,上下文语义特征m由步骤5中的单词向量组成:
Figure 118888DEST_PATH_IMAGE031
(14)
其中,n对应单词序列中的单词数量;ht是句子序列中的第t个单词对应的隐藏层状态,即表示时间状态t对应的隐藏层状态;at是ht的注意力权重,表示第t个隐藏层状态对代码味道检测的重要程度;
对应的每一个隐藏层状态的注意力权重at定义如公式(15)-(16):
Figure 104162DEST_PATH_IMAGE032
(15)
Figure 476237DEST_PATH_IMAGE033
(16)
其中,
Figure 546962DEST_PATH_IMAGE034
Figure 600368DEST_PATH_IMAGE035
为权重矩阵;
Figure 754662DEST_PATH_IMAGE036
是计算隐藏层状态对代码味道检测重要程度的分数函数;tanh(
Figure 235322DEST_PATH_IMAGE018
)是一种非线性激活函数;
Figure 590080DEST_PATH_IMAGE037
表示句子序列中的第t个单词对应的隐藏层状态,t的取值范围是0-n
Figure 447178DEST_PATH_IMAGE038
表示第k个输入在编码器的输出;
经过步骤1到步骤6,完成了代码函数表示,即对代码函数进行特征表示并进行语义特征提取;
局部特征提取B和局部特征提取F的操作为:利用基于孪生网络的深度学习框架,对通过孪生网络进行语义间的相似度计算,对局部特征进行提取;具体如下:
步骤7:在步骤5中的
Figure 141464DEST_PATH_IMAGE039
的基于Self-Attention的函数表示中,它们的模型是共享参数的,即得到3个单词序列的特征向量,接着将其输入到前馈神经网络中,将
Figure 606075DEST_PATH_IMAGE040
做余弦相似度计算,并对将
Figure 651391DEST_PATH_IMAGE041
做余弦相似度计算,最终得到两个相似度得分;
经过步骤7的操作,完成了局部特征提取;
全局特征提取C和全局特征提取G的操作为:利用基于CNN的深度学习方法,对通过软件重构工具提取出的代码度量结构化信息和被检测的代码函数,进行相应的全局特征提取,具体如下:
步骤8:对需要检测的代码进行全局结构化信息提取,得到相应的代码度量;
步骤9:对步骤8输出的代码度量进行预处理操作,得到代码函数的结构化信息metric_input;将所有的代码度量分为2组,按照分别为该需要 检测的方法到本类的距离和该待检测的方法到目标类的距离,作为全局结构化特征提取部分的输入;
其中,结构化信息由metric_input表示:
Figure 46601DEST_PATH_IMAGE042
(18)
Figure 657710DEST_PATH_IMAGE043
(19)
其中,
Figure 745752DEST_PATH_IMAGE044
Figure 324370DEST_PATH_IMAGE045
分别表示该待检测的方法到本类的度量和该待检测的方法到目标类的度量;x表示结构化信息
Figure 523270DEST_PATH_IMAGE046
包含代码度量的总数;mi表示结构化信息中的第i个代码度量,i的取值范围为1到x;
步骤10:将步骤9输出的结构化信息metric_input输入到卷积神经网络模型CNN中,得到对应的结构化特征outputl3
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3;将结构化信息metric_input转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1;
在卷积层1中,使用128个过滤器去获得结构化输入的多维特征,每个过滤器的大小设置为1*1;
卷积层1中的每一个卷积操作包括一个过滤器
Figure 926570DEST_PATH_IMAGE047
,这个过滤器作用于一个代码度量上,生成一个新的特征;卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
Figure 247830DEST_PATH_IMAGE048
(20)
其中,i的取值范围为1-128;
Figure 2159DEST_PATH_IMAGE049
表示i个卷积操作中的第j个过滤器的权重矩阵;
Figure 552220DEST_PATH_IMAGE050
是第j个过滤器的偏置参数,其中j的取值范围为1-128;对于公式中
Figure 75605DEST_PATH_IMAGE051
是一个非线性的激活函数;mi表示
Figure 505450DEST_PATH_IMAGE052
中的一个代码度量;
在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配
Figure 543813DEST_PATH_IMAGE053
Figure 84516DEST_PATH_IMAGE054
和卷积层1表示为(21)到(22):
Figure 42501DEST_PATH_IMAGE055
(21)
Figure 377667DEST_PATH_IMAGE056
Figure 106589DEST_PATH_IMAGE057
(22)
Figure 247720DEST_PATH_IMAGE058
()表示卷积层1对应的卷积函数;input表示输入的代码度量;
Figure 745697DEST_PATH_IMAGE059
表示卷积层1的输出;
然后,将卷积层1的输出输入到卷积层2中,再将卷积层2的输出输入到卷积层3中;卷积层2有128个过滤器,卷积层3有128个过滤器;卷积层2和卷积层3的输出表示为(17)到(18):
Figure 64814DEST_PATH_IMAGE060
Figure 281032DEST_PATH_IMAGE061
(23)
Figure 163538DEST_PATH_IMAGE062
Figure 578338DEST_PATH_IMAGE063
(24)
其中,
Figure 520887DEST_PATH_IMAGE064
表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128;
Figure 958821DEST_PATH_IMAGE065
表示卷积层2的卷积函数;
Figure 691023DEST_PATH_IMAGE066
表示卷积层2的输出;
Figure 163592DEST_PATH_IMAGE067
表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-128;
Figure 11463DEST_PATH_IMAGE068
表示卷积层3的卷积函数;
Figure 999010DEST_PATH_IMAGE069
表示卷积层3的输出;
步骤11:将步骤10输出的结构化特征
Figure 223318DEST_PATH_IMAGE069
输入到一个扁平操作中,将通过卷积神经网络提取出的结构化特征
Figure 550394DEST_PATH_IMAGE069
转变为一个一维向量;
步骤12:将步骤4输出的单词向量信息
Figure 647794DEST_PATH_IMAGE070
输入到卷积神经网络模型CNN中,得到对应的特征
Figure 60321DEST_PATH_IMAGE071
其中,CNN中包括三个卷积层,记为卷积层1、卷积层2以及卷积层3;它们的权重和输出分别用
Figure 822741DEST_PATH_IMAGE072
下标进行表示,然后将
Figure 66640DEST_PATH_IMAGE070
转换为一个二维矩阵,并将这个矩阵输入到CNN中的卷积层1;
在卷积层1中,使用128个过滤器去获得输入的多维特征,每个过滤器的大小设置为1*5;
卷积层1中的每一个卷积操作包括一个过滤器
Figure 521892DEST_PATH_IMAGE073
,这个过滤器作用于一个代码度量上,生成一个新的特征;卷积层1中的第i个卷积操作得到一个特征
Figure 736229DEST_PATH_IMAGE074
,通过公式(14)获得:
Figure 302340DEST_PATH_IMAGE075
(25)
其中,i的取值范围为1-128;
Figure 338429DEST_PATH_IMAGE076
表示i个卷积操作中的第j个过滤器的权重矩阵;
Figure 26899DEST_PATH_IMAGE077
是第j个过滤器的偏置参数,其中j的取值范围为1-128;对于公式中
Figure 414018DEST_PATH_IMAGE051
是一个非线性的激活函数;mi表示
Figure 518241DEST_PATH_IMAGE070
中的一个代码单词表示;在卷积层1中,这个过滤器应用到每一个结构化输入中的代码度量上,从而生成一个特征匹配
Figure 487465DEST_PATH_IMAGE078
Figure 284520DEST_PATH_IMAGE078
和卷积层1表示为(21)到(22):
Figure 893355DEST_PATH_IMAGE079
(26)
Figure 129165DEST_PATH_IMAGE080
Figure 139846DEST_PATH_IMAGE081
(27)
其中CNN1()表示卷积层1对应的卷积函数;input表示输入的代码度量;
Figure 419387DEST_PATH_IMAGE082
表示卷积层1的输出;
然后,将卷积层1的输出输入到卷积层2中,再将卷积层2的输出输入到卷积层3中;卷积层2有128个过滤器,卷积层3有128个过滤器;卷积层2和卷积层3的输出表示为(17)到(18):
Figure 515518DEST_PATH_IMAGE083
Figure 961543DEST_PATH_IMAGE084
(28)
Figure 154627DEST_PATH_IMAGE085
Figure 293485DEST_PATH_IMAGE086
(29)
其中,
Figure 689962DEST_PATH_IMAGE087
表示卷积层2中的第i个过滤器生成的特征匹配,i的取值范围为1-128;
Figure 939678DEST_PATH_IMAGE065
表示卷积层2的卷积函数;
Figure 924951DEST_PATH_IMAGE088
表示卷积层2的输出;
Figure 297027DEST_PATH_IMAGE067
表示卷积层3中的第i个过滤器生成的特征匹配,i的取值范围为1-128;
Figure 367751DEST_PATH_IMAGE068
表示卷积层3的卷积函数;
Figure 421158DEST_PATH_IMAGE071
表示卷积层3的输出;
步骤13:将步骤12输出的特征
Figure 587171DEST_PATH_IMAGE071
输入到一个扁平操作中,将通过卷积神经网络提取出的特征
Figure 67830DEST_PATH_IMAGE071
转变为一个一维向量;
经过步骤8至步骤13的操作,完成了全局特征提取;
利用多层感知机神经网络模型,将提取到的深层特征,包括局部特征和全局化特征,与代码味道检测结果自动匹配,完成分类模型的训练;具体方法为:
步骤14:将步骤7输出的局部特征信息,步骤12和步骤13输出的全局特征信息,在全连接层连接起来,得到多层感知机模型的输入;
步骤15:将步骤14的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取出的局部信息特征和全局信息特征映射到单个输出中;其中,多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道,该输出层的激活函数为sigmoid函数;
步骤16:将步骤15的输出结果与数据集中的标签比较,计算
Figure 360272DEST_PATH_IMAGE089
作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练;
Figure 279686DEST_PATH_IMAGE089
损失函数表示为:
Figure 973972DEST_PATH_IMAGE090
(25)
其中,
Figure 625534DEST_PATH_IMAGE091
是数据集中第i条数据的真实分类;
Figure 483899DEST_PATH_IMAGE092
是对第i条数据预测出的代码味道的分类结果;log()表示对数为2的对数函数;N表示训练数据的数据量,且N的取值范围为50000-100000;
至此,从步骤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,则将空余部分用*补齐;
将得到的
Figure 879109DEST_PATH_IMAGE093
这3个单词序列拼接起来,得到一个长单词序列;该长单词序列所包含的单词数为3个级别的代码标识符所分单词数的和:
Figure 427902DEST_PATH_IMAGE094
(2)
Figure 578260DEST_PATH_IMAGE095
(3)
其中,
Figure 845294DEST_PATH_IMAGE096
Figure 90199DEST_PATH_IMAGE097
Figure 759078DEST_PATH_IMAGE098
分别表示代码函数所在的类名、代码函数可能要重构的目标类名、待检测代码的函数名;
Figure 80338DEST_PATH_IMAGE019
为相对应的代码标识符分解出的单词,下标i的取值范围为1到n,
Figure 569088DEST_PATH_IMAGE019
的数量;
Figure 571679DEST_PATH_IMAGE099
为将输入连接起来的函数,concat(w1,w2,…,wn)表示将
Figure 908113DEST_PATH_IMAGE100
连接起来;长单词序列所包含的单词n的数量是3q个。
3.如权利要求2所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,n取值范围为5到15。
4.如权利要求1所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,步骤2中,每个单词序列的长度q的取值为5。
5.如权利要求1所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,步骤4中,单词嵌入函数为Word2vec。
6.如权利要求1所述的一种基于局部和全局特征的特征依恋代码味道检测方法,其特征在于,步骤5中,单词嵌入函数为Word2vec。
CN202011631064.3A 2020-12-31 2020-12-31 一种基于局部和全局特征的特征依恋代码味道检测方法 Active CN112698833B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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

Patent Citations (3)

* Cited by examiner, † Cited by third party
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