利索能及
我要发布
收藏
专利号: 2022103231125
申请人: 湖北大学
专利类型:发明专利
专利状态:已下证
更新日期:2026-08-04
缴费截止日期: 暂无
联系人

摘要:

权利要求书:

1.一种基于图神经网络与双向GRU特征抽取的缺陷预测方法,其特征在于,包括:S1:对软件系统进行网络建模,使用神经网络模型学习网络结构,获得软件依赖关系特征;

S2:将软件系统源文件构建成抽象语法树,提取令牌序列,使用双向门控递归单元进行建模,获得软件系统的深层语义特征;

S3:将S1获得的软件依赖关系特征与S2获得的源代码的语义特征结合,得到最终的混合特征,并训练一个分类器,用于基于得到的混合特征进行缺陷预测。

2.如权利要求1所述的缺陷预测方法,其特征在于,步骤S1包括:S1.1:利用开源工具解析软件源代码文件,构造软件依赖网络模型;

S1.2:利用网络嵌入方法,对软件依赖网络进行学习,得到节点的嵌入向量;

S1.3:构建图神经网络模型,将步骤S1.1构造的软件依赖网络模型和步骤S1.2得到的节点的嵌入向量作为图神经网络模型输入,获得软件依赖关系特征。

3.如权利要求2所述的缺陷预测方法,其特征在于,步骤S1.1包括:S1.1.1:利用开源工具对源代码编译后产生的各类文件进行依赖关系扫描,并保存为统一的文件格式:S1.1.2:解析并提取各类文件之间的依赖关系,进行网络建模,构造软件依赖网络模型,其中,软件依赖网络模型为一个无向无权网络SDN=(V,E),其中节点vi(vi∈V)代表软件系统中的一个类文件或接口文件,如果两个节点之间存在依赖关系,则它们之间存在一条连边eij,其中,eij=(vi,vj)∈E。

4.如权利要求2所述的缺陷预测方法,其特征在于,步骤S1.2包括:S1.2.1:利用Node2vec方法,通过偏向性随机游走的方式学习将网络转换为节点序列,并将转换得到的节点序列作为自然语言处理中的文本序列;

S1.2.2:根据得到的节点序列,通过词向量模型skip gram进行训练,得到节点的低维向量表示,作为节点的嵌入向量。

5.如权利要求2所述的缺陷预测方法,其特征在于,S1.3包括:S1.3.1:将步骤S1.1中得到的软件依赖网络模型与步骤S1.2中得到的节点嵌入向量X作为图神经网络的输入, |V|是节点的个数,d为点嵌入向量的维数,N(v)={u∈V|(v,u)∈E)表示节点v的邻居集合, 表示目标节点v在模型第k层的隐含嵌入向量,初始输入时,S1.3.2:通过图神经网络GCN使用卷积操作迭代更新节点向量模式,网络中的每个节点在迭代中对其邻居节点特征做聚合,并与自身在上一层迭代得到的嵌入向量相结合,得到新的一层嵌入向量,每个节点依次迭代,直到最后一层进行输出,得到更新后的节点特征,其中,GCN的卷积层表示如下:其中,A是邻接矩阵, 是加上自连接的邻接矩阵,IN是单位矩阵,是度矩阵,(l) (l)表示矩阵 中第i行第j列对应的元素的值.H 是第l层的输出,Θ 是第l层(l+1)的参数,σ(·)表示激活函数,H 是第l+1层的输出,更新后的节点特征为软件依赖关系特征。

6.如权利要求5所述的缺陷预测方法,其特征在于,在步骤S1.3.2之后,所述方法还包括:通过softmax层得到每个节点的输出概率值,具体公式为:

其中, 是拉普拉斯矩阵归一化后的邻接矩阵,X是节点的嵌入向量,为初(0) C×H (1) H×2始特征,W ∈R 和W ∈R 分别是两层的权重矩阵,C是输入层每个节点的维度,H是隐N×2藏层每个节点的维度,Z∈R 是所有节点的输出概率值;

以预测值与真实标签更接近为目标进行训练,采用的损失函数为:

其中,yL是标签节点索引集,Zlf是GCN是标签l的预测向量,f是预测向量的维度,ylf是标签l的真实one‑hot向量,目标是减小真实标签与预测标签之间的误差。

7.如权利要求1所述的缺陷预测方法,其特征在于,利用开源工具将软件源文件解析为抽象语法树,并提取令牌序列,包括:使用javalang工具将源文件转换为抽象语法树;

遍历抽象语法树,保留需要抽取的类型的节点,每个源文件被解析为一系列代码标记[w1,w2,…,wn],将解析得到的代码标记构建一个固定大小的词表V,使用word2vec训练词表,将每个代码标记转换为低维连续的实值向量表示,得到一个令牌嵌入矩阵 d表示代码标记的维度,令牌嵌入矩阵用于存储令牌序列。

8.如权利要求1所述的缺陷预测方法,其特征在于,使用双向门控递归单元进行建模,获得软件系统的深层语义特征,包括:将每个类文件的代码令牌序列输入到GRU单元序列中,每个代码标记wi采用一个实值向量xi=[x1,x2,…,xd]表示,输入到一个GRU单元中通过预测序列中下一个代码令牌来训练每个GRU单元;

经过训练的GRU单元为每个代码标记生成一个状态输出向量si=[s1,s2,…,sd],表示根据代码标记的上下文捕获其语义分布;

将每个.java源文件的一系列代码标记[w1,w2,…,wn]输入到训练好的GRU中,得到令牌状态的输出序列[s1,s2,…,sn],通过池化层将令牌状态的输出序列聚合为一个文件向量,作为与源文件对应的软件系统的深层语义特征。