[发明专利]一种基于上下文环境的依恋情结代码味道检测方法有效
申请号: | 202110007180.6 | 申请日: | 2021-01-05 |
公开(公告)号: | CN112732570B | 公开(公告)日: | 2022-05-31 |
发明(设计)人: | 施重阳;赵舒鑫;任少君;江贺 | 申请(专利权)人: | 北京理工大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36;G06N3/08;G06N3/04 |
代理公司: | 北京正阳理工知识产权代理事务所(普通合伙) 11639 | 代理人: | 张利萍 |
地址: | 100081 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 上下文 环境 依恋 情结 代码 味道 检测 方法 | ||
1.一种基于上下文环境的依恋情结代码味道检测方法,包括模型训练部分和模型测试部分;
其中,模型训练包括:代码上下文信息表示A、函数及类关联特征提取B和代码味道分类C;模型测试包括代码上下文信息表示D、函数及类关联特征提取E和代码味道分类F;
代码上下文信息表示A和代码上下文信息表示D是基于注意力机制和卷积神经网络的上下文信息表示;
函数及类关联特征提取B和函数及类关联特征提取E是基于卷积神经网络的函数及类关联特征提取;
代码味道分类C和代码味道分类F是基于多层感知机的代码味道分类;
其特征在于:
其中,代码上下文信息表示A和代码上下文信息表示D的操作为:基于注意力机制和卷积神经网络,对被检测的代码上下文进行特征表示并进行语义特征提取,具体如下:
将检测的代码函数解构为三部分,第一个部分包括返回值和参数类型,第二个部分包括内部调用的方法名字及内部调用的属性名字,第三部分为函数名字;通过这种解构方式,将上下文环境元素引入特征依恋检测;
具体地:
将被检测的代码函数的返回值和参数类型,作为一个上下文信息元组拼接在一起,用符号Method_context表示;同时,将被检测的代码函数内部调用的方法的名字及内部调用的属性的名字作为一个内容元组拼接在一起,用符号Method_content表示;最后,将被检测的代码函数的名字作为一个单独的名称信息元组,用符号Method_name表示:
Method_context=<returnm,parameterm> (1)
Method_content=<method_namem,attribute_namem> (2)
Method_name=<namem> (3)
其中,returnm代表代码函数的返回值,parameterm代表代码函数的参数;method_namem代表代码函数内部调用的方法的名字,attribute_namem代表代码函数内部调用的属性的名字;namem代表代码函数的名字;
将被检测的代码函数包含类内部调用方法的上下文信息,作为包含类的上下文信息元组拼接在一起,用符号ContainClass_context表示;同时,将包含类内部的方法、属性的名字作为内容元组拼接在一起,用符号ContainClass_content表示;最后将包含类的名字作为一个内容元组拼接在一起,用符号ContainClass_name表示:
ContainClass_context=returncm,parametercm (4)
ContainClass_content=Method_namecc,attribute_namecc (5)
ContainClass_name=namecc (6)
其中;returncm代表包含类内部函数的返回值,parametercm代表包含类内部函数的参数;Method_namecc代表包含类内部函数名称,attribute_namecc代表包含类内部属性名称;namecc中代表包含类的名字;
将被检测的代码函数的目标类内部的方法的上下文信息,作为目标类的上下文信息元组拼接在一起,用符号TargetClass_context表示;同时,将目标类内部的方法、属性的名字作为内容元组拼接在一起,用符号TargetClass_content表示;最后将目标类的名字作为一个内容元组拼接在一起,用符号TargetClass_name表示;
TargetClass_context=returntm,parametertm (7)
TargetClass_content=Method_nametc,attribute_nametc (8)
TargetClass_name=nametc (9)
其中,returntm代表目标类内部函数的返回值,parametertm代表目标内部函数的参数;Method_nametc代表目标类内部函数名称,attribute_nametc代表目标类内部属性名称;nametc中代表目标类的名字;
步骤2:结合大小写字母、数字、下划线、斜杠以及英文句号标志,对步骤1输出的各代码标识符进行分词,再对分词后的单词序列进行处理及筛选;
经分词后,每一个代码标识符得到一个单词序列,随后对得到的单词序列进行处理及筛选;
其中,对分词后得到的单词序列进行处理及和筛选的具体方法为:
步骤2.1:若得到的单词序列中有单个的大写或小写英文字母,并且该单词无实际意义的,删除该字母;
步骤2.2:将得到的单词序列全部转换成小写;
步骤2.3:按照步骤1中的输出元组,将对应元组得到的单词序列拼接起来,得到一个长单词序列;
该长单词序列所包含的单词数为对应元组中代码标识符所分单词数的和:
Method_context=returnm,parameterm (10)
=concat(w1,w2,…,wn). (11)
其中,returnm、parameterm分别表示代码函数的返回值和参数;wi为相对应的代码标识符分解出的单词,下标i的取值范围为1到n,n代表wi的数量;concat(·)为将输入连接起来的函数,concat(w1,w2,…,wn)表示将w1,w2,…,wn连接起来;按照此步骤,对步骤1中所有的输出元组都做相同的处理;
步骤3:根据步骤2输出的Method_context,将Method_context长单词序列转换为一个包含有n个单词的长句子,将句子中的每一个单词输入到单词嵌入层将句子中每个单词转换为单词向量;其中,单词嵌入层将输入的每一个单词转换为一个数字向量,称为单词向量;单词嵌入层将每一个单词转换为单词向量,表示如式(12):
V(Method_context)=V(concat(w1,w2,…,wn))
=concat(V(w1),V(w2),…,V(wn)) (12)
其中,V(·)表示单词嵌入函数,即将输入的(·)转换为相对应的单词向量;V(wi)表示将wi转换为一个单词向量,下标i的取值范围为1到n;对经过步骤2处理的所有输出元组都做相同的处理;
公式(12)表明,将Method_context转换为单词向量等价于将Method_context所包含的每一个wi转换为对应的单词向量V(wi),再将n个单词向量经concat(·)函数连接起来;
步骤4:将步骤3输出的与V(Method_context)相同形式的9个单词向量输入到卷积神经网络CNN中,以提取句子中各单词间的上下文关系,并从这些关系中获得相关的语义特征,得到9个对应元组内部特征;
其中,CNN包括三种不同尺寸的过滤器,记为W2()、W3()、W4(),每种尺寸的过滤器分别有32个以确保能够充分提取输入单词间的上下文关系;
在嵌入层后的卷积层中,每一个卷积操作包含:大小为“2*单词向量维度”的过滤器32个,记为W2();“3*单词向量维度”的过滤器32个,记为W3();“4*单词向量维度”的过滤器32个,记为W4();3个不同尺寸的过滤器分别作用于步骤3输出的嵌入表示以获取到提取出来的代码标识符的内部特征;该卷积层中尺寸大小为i*单词向量维度的过滤器经过卷积操作得到一个特征ci,通过公式(13)获得:
cij=tanh(Wi(j)·mi+bi(j)) (13)
其中,i的取值范围为2-4,j的取值范围为1-32;Wi(j)表示卷积尺寸为i*单词向量的第j个过滤器的权重矩阵;bi(j)是第j个过滤器的偏置参数;tanh(·)是一个非线性的激活函数;mi表示9个输入矩阵中的符合过滤器尺寸的单词向量;
对于同一单词矩阵,3个不同尺寸的过滤器都会提取到32个特征矩阵,应该将同一单词矩阵的96个特征矩阵转换到同一Tensor类型数据中,通过公式(14)及(15)完成:
ci=Concat(ci1,…,ci32) (14)
outputcn_method_context=Concat(ci) (15)
其中,ci代表尺寸为i*单词向量维度的32过滤器的特征矩阵组合结果,i的取值范围为2-4;ci1表示尺寸为i*单词向量维度的第一个过滤器获得的输出特征;outputcn_method_context代表3种不同尺寸的共96个过滤器对Method_context信息矩阵的处理结果,对步骤3输出的9种信息都做相同的处理;
步骤5:将经过步骤4操作得到的9个输出,输入到一个基于CNN的自注意力机制层,输出9个代码上下文信息表示矩阵,通过这个操作将信息利用率进一步提升;
基于CNN的自注意力机制,是在spatial和channel两个维度完成的:
outputat_method_context=aspatial(achanneloutputcn_method_context) (16)
其中,outputat_method_context表示经过自注意力机制处理的Method_context数据矩阵;outputcn_method_context表示步骤4中输出的经过CNN卷积的Method_context数据;achannel是自注意力机制在CNN层输入数据channel维度的权重,通过基于输入数据的宽和高的globalmax polling和global average pooling以及共享的多层感知机来完成对不同channel赋予不同的权重;aspatial是自注意力机制对已经经过channel维度处理的数据赋予spatial维度的权重,通过全局最大池化、全局平均池化及降维操作来完成对不同的spatial赋予不同的权重;对于步骤4输出的9个信息矩阵,都需要做相同的处理,输出9个语义特征矩阵;
经过步骤1到步骤5,完成了代码上下文信息表示,即对代码的函数及类的上下文信息进行特征表示并进行语义特征提取;
函数及类关联特征提取B和函数及类关联特征提取E的操作为:利用基于LSTM的深度学习方法,对已经被自注意力层赋予不同权重的函数及类信息进行关联特征提取;
具体地:
步骤6:对步骤5输出的语义特征矩阵进行拼接融合,转换成符合卷积要求的9个特征矩阵;
步骤7:将步骤6输出的特征矩阵进行分类,Method_name、ContainClass_name、TargetClass_name的三个特征矩阵由同一个CNN卷积层进行处理,Method_context、ContainClass_context、TargetClass_context的三个特征矩阵由同一个CNN卷积层进行处理,Method_content、ContainClass_content、TargetClass_content的三个特征矩阵由同一个CNN卷积层进行处理;按照以上规则将特征矩阵输入到CNN网络模型中,得到更深层次的语义特征矩阵;
其中,CNN中包括三个并行的卷积层,记为卷积层1、卷积层2以及卷积层3;将Method_name、ContainClass_name、TargetClass_name三个特征矩阵输入到卷积层1中,剩余6个矩阵按照前述规则分别输入到卷积层2和卷积层3;
在卷积层1中,使用64个过滤器去获得结构化输入的多维特征,每个过滤器的大小设置为3*1;卷积层2和卷积层3参数设置与卷积层1相同;
卷积层1中的每一个卷积操作包括一个过滤器Wl1(),这个过滤器作用于对应尺寸的单词向量上,提取更深层次的文本特征;卷积层1中的第i个卷积操作得到一个特征ci,通过公式(14)获得:
ci=tanh(Wl1(j)·mi+bl1(j)). (17)
其中,i的取值范围为1-64;Wl1(j)表示i个卷积操作中的第j个过滤器的权重矩阵;bl1(j)是第j个过滤器的偏置参数,其中j的取值范围为1-64;tanh(·)是一个非线性的激活函数;mi表示输入矩阵中的符合过滤器尺寸的单词向量;对卷积层2和卷积层3设置同样的参数,并且完成同样的操作;
在卷积层1中,这个过滤器应用到对应尺寸的单词向量上,从而生成一个特征匹配Cl1(i),Cl1(i)和卷积层1表示为(18)到(19):
Cl1(i)=[c1,c2,…,cn], (18)
outputl1_n=CNN1(inputn)
=[Cl1(1),Cl1(2),…,Cl1(64)]. (19)
其中,CNN1()表示卷积层1对应的卷积函数;inputn表示输入的特征矩阵,对于卷积层1来说共有三个不同的输入特征矩阵,分别是Method_name、ContainClass_name、TargetClass_name的特征矩阵,即对应n的取值为1-3;outputl1_n表示卷积层1的输出对inputn,对于三个不同的输入特征矩阵,共有三个输出;
卷积层2和卷积层3同样执行相同的操作,输出表示为(20)到(21):
outputl2_n=CNN2(inputn)
=[Cl2(1),Cl2(2),…,Cl2(64)], (20)
outputl3_n=CNN3(inputn)
=[Cl3(1),Cl3(2),…,Cl3(64)]. (21)
其中,Cl2(i)表示卷积层2中的第i个过滤器提取的特征,i的取值范围为1-64;CNN2(·)表示卷积层2的卷积函数;inputn表示输入的特征矩阵,对于卷积层2来说共有三个不同的输入特征矩阵,分别是Method_context、ContainClass_context、TargetClass_context的特征矩阵,即对应n的取值为1-3;outputl2_n表示卷积层2对inputn的输出;Cl3(i)表示卷积层3中的第i个过滤器提取的特征,i的取值范围为1-64;CNN3(·)表示卷积层3的卷积函数;inputn表示输入的特征矩阵,对于卷积层3来说共有三个不同的输入特征矩阵,分别是Method_content、ContainClass_content、TargetClass_content的特征矩阵,即对应n的取值为1-3;outputl3_n表示卷积层3对inputn的输出;
步骤8:将步骤7输出的9个特征矩阵中和上下文信息相关的3个矩阵outputl2_1、outputl2_2、outputl2_3进行压缩维度以及max_pooling操作以符合LSTM输入要求;
步骤9:将经过步骤8操作的输出关于context矩阵输入到LSTM层,以提取输入矩阵中各单词之间的上下文关系,并从中获得函数及类之间的关联特征,输出LSTM层的隐藏层状态h;
其中,LSTM层使用三个门来控制LSTM单元中的状态流;对于每一个时间状态t,通过给定的单词向量V(wt)、当前的单元状态ct和隐藏层状态ht、通过先前的单元状态ct-1和隐藏层状态ht-1,基于公式(22)-(25)进行更新;
其中,t的取值范围为0-n;it、ft和ot是范围在0-1的三个激活状态;σ是logisticsigmoid激活函数,b表示运算时的偏置参数,tanh(·)是一种非线性激活函数,表示元素乘积;W表示对应隐藏层状态h的权重矩阵,Wc表示单元状态c对应的权重矩阵;ht表示时间状态t对应的隐藏层状态,ct表示时间状态t对应的单元状态,表示时间状态t计算过程中临时的单元状态;bc表示单元状态c对应的偏置参数;
经过步骤6至步骤9的操作,完成了函数及类关联特征的提取;
所述代码味道分类,是在基于CNN神经网络和注意力机制的代码上下文信息表示和基于LSTM神经网络的函数及类关联特征提取的基础上进行的,利用多层感知机神经网络模型将提取到的深层特征包括上下文特征和关联特征与代码味道检测结果自动地匹配起来,完成分类模型的训练;
具体地:
步骤10:将步骤7中卷积层1和卷积层3输出的深度语义特征和步骤9输出的函数及类之间的关联特征在全连接层连接起来,得到多层感知机模型的输入;
步骤11:将步骤10的输出输入到多层感知机模型中,利用多层感知机模型将从文本信息中提取到的深度语义特征和函数及类之间的关联特征映射到单个输出中;
其中,多层感知机模型的输出层只有一个神经元,表示本次识别代码味道的结果,即存在代码味道或不存在代码味道,该输出层的激活函数为sigmoid函数;
步骤12:将步骤11的输出结果与数据集中的标签比较,计算binary_cross_entropy作为训练过程的损失函数,最小化损失函数以完成代码函数味道分类器的训练;binary_cross_entropy损失函数表示为:
其中,是数据集中第i条数据的真实分类;y(i)是对第i条数据预测出的代码味道的分类结果;log()表示对数为2的对数函数;N表示训练数据的数据量;
至此,从步骤1到步骤12,完成了模型训练;
模型训练包括代码上下文信息表示A、函数及类关联特征提取B和代码味道分类C;模型测试包括代码上下文信息表示D、函数及类关联特征提取E和代码味道分类F;
其中,步骤1到步骤5,对应模型训练中的代码上下文信息表示A;步骤6到步骤9,对应模型训练中的函数及类关联特征提取B;步骤10到步骤12,对应模型训练中的代码味道分类C;
模型测试部分与步骤1到步骤12完全相同,其中,步骤1到步骤5,对应模型测试中的代码上下文信息表示A;步骤6到步骤9,对应模型测试中的函数及类关联特征提取B;步骤10到步骤12,对应模型训练中的代码味道分类C;
模型训练结束后,再根据步骤1到步骤12所描述的过程,完成对代码函数的代码味道检测测试,最终得到代码味道检测结果。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京理工大学,未经北京理工大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110007180.6/1.html,转载请声明来源钻瓜专利网。