掌桥专利:专业的专利平台
掌桥专利
首页

一种基于语义词元分析的代码克隆检测方法和装置

文献发布时间:2024-04-18 20:02:18


一种基于语义词元分析的代码克隆检测方法和装置

技术领域

本发明属于网络安全技术领域,尤其涉及一种基于语义词元分析的代码克隆检测方法和装置。

背景技术

代码克隆检测是一种软件工程领域的技术,旨在检测代码中存在的重复代码片段或克隆代码。常见的代码克隆类型根据语法或语义层面的差异被分类为四个类别:文本相似、词法相似、语法相似、语义相似。前三种类型是语法上相似的克隆,而最后一种类型是描述语义上相似的克隆。在语法相似性方面,通常发生在程序员进行代码复制和粘贴时,而语义相似性则是指开发人员从头开始实现具有相似功能的代码。

现有技术中存在较多的代码克隆检测技术,这些方法根据对源代码信息的不同利用程度,依据表征方式可划分文本、词法、语法、语义4个层次。

基于文本表征方式的检测技术将源代码当作文本编码,利用一系列文本相似度算法来检测代码克隆。基于词法的检测技术利用了解析器将源代码分成符号序列,然后这些符号序列会被组织成符号的语句,最后将这些符号组成的语句进行比较。基于语法分析的检测方法使用与编译器类似的解析器前端将源程序转换为解析树或抽象语法树,然后基于抽象语法树进行克隆检测。基于语义分析的克隆代码检测方法通过静态程序分析技术抽取语义关系图结构,通过图相似度匹配来进一步理解源代码语义之间的相似性。但是现有的方法存在以下不足:

1)基于文本和词法的解析方式会损失大量信息,如语义和结构信息,这会导致检测技术对于简单的复制粘贴行为具有良好的检测效果,但是对于复杂的修改行为,检测效果一般甚至完全检测不出。由于缺乏对程序语义的考虑,这些方法无法处理语义克隆。

2)基于语法的检测方法不能识别出标识符和文本值的不同,难以保证较高的精确度,即使是两个代码片段的指标是相同的,这两段代码也有可能是不相似的。

3)现在基于语义的方法虽然能够在深层次利用源代码的信息,但是基于图匹配的检测技术计算开销较大,无法处理大规模代码。

现有的代码克隆检测技术在检测精度、效率和适用范围等方面存在挑战。一些方法可能在准确性上有所欠缺,无法捕捉到语义上相似的克隆代码。另一些方法可能无法处理大规模代码库或具有复杂结构的克隆代码。

发明内容

本发明的目的是通过解决在保留图形结构特征的基础上执行词元分析和实现可扩展且准确的相似性计算过程两个问题来实现基于语义的代码克隆检测方法。

为解决上述问题,本发明提供了如下方案:一种基于语义词元分析的代码克隆检测方法和装置。其中,一种基于语义词元分析的代码克隆检测方法,包括:

采用静态代码分析提取待检测函数的程序依赖图;

利用已训练的字节级字节对编码模型对所述程序依赖图中每个节点中的代码语句进行分词操作,提取词元信息;

计算所述程序依赖图中每个节点的Katz中心性,然后将所述Katz中心性分配给基本块中的每个词元,并求和不同基本块中相同词元的Katz中心性,获得包含图形特征的语义词元;

编码所述语义词元为向量化表示,构建基于孪生网络架构的克隆检测神经网络模型进行代码克隆检测,获得检测结果。

优选地,所述利用已训练的字节级字节对编码模型对每个节点中的代码语句进行分词操作,提取词元信息的过程包括,

收集文本和代码数据作为训练数据集,并构建字节级字节对编码模型;

基于所述训练数据集对字节级字节对编码模型进行训练,获得已训练的字节级字节对编码模型;

将所述程序依赖图中每个节点的代码语句转化为字节序列,并利用已训练的字节级字节对编码模型中的字节聚合方法对所述字节序列进行聚合操作,生成对应的词元序列。

优选地,构建所述字节级字节对编码模型的过程包括,

在给定的数据集中抽取单词以及相应的频次,并确定词表大小;

将单词拆分为字节序列,不重复的字节作为初始词表;

重复迭代地将所述字节序列中的字节不重复地添加到词表中,选择并合并频次最高的相邻字节对直至满足词表大小。

优选地,计算所述程序依赖图中每个节点的Katz中心性,获得包含图形特征的语义词元的过程包括,

将所述程序依赖图依据控制依赖和数据依赖划分为控制流图和数据流图,然后分别对所述控制流图和数据流图的节点进行中心性分析,使得每个节点的Katz中心性都收敛,获得所述控制流图和数据流图中每个节点的中心性,基于每个节点的中心性求均值获得每个节点最终的Katz中心性;

基于每个节点最终的Katz中心性,对基本块中的所有词元进行分配,并计算不同基本块中相同词元的总中心性;

将所有词元的中心性进行归一化处理,经过中心性分析后,获得所述程序依赖图中所有词元的相应总Katz中心性,这些具有总Katz中心性的词元称为语义词元。

优选地,分别对所述控制流图和数据流图的节点进行中心性分析的过程包括,

设A表示具有n个节点的图的n×n邻接矩阵,如果存在连接节点i和节点j的边,则元素A

设c表示大小为n的Katz中心度向量,与节点i对应的元素c

其中,α∈[0,1],表示衰减因子,使得长路径的权重小于短路径,而β

以矩阵形式,将公式(1)写作:

c=αAc+β (2)

在初始设置c(0)=β之后,使用幂迭代法基于公式(2)近似计算c的第t次迭代的结果:

c(t)=αAc(t-1)+β(4)

其中,c(t)表示第t次迭代的结果。

优选地,编码所述语义词元为向量化表示的过程包括,

将词元按函数内原始顺序排序,构建用于词向量无监督学习的全局对数双线性回归模型GloVe,通过GloVe模型训练词-词共现矩阵中的非零元素,生成具有有意义子结构的向量空间;

利用已训练的GloVe词向量模型将每个基本块内的所有词元转换为向量表示Vec

优选地,对所述GloVe模型进行训练的过程包括,

根据语料库构建共现矩阵X,所述共现矩阵中的每一个元素X

构建词向量和共现矩阵之间的近似关系,采用以下公式近似地表达两者之间的关系:

其中,

最后通过构建一个加权最小二乘回归模型来构造损失函数,将公式(5)看作一个最小二乘问题,并在损失函数中引入权重函数f(X

其中,V是词库的大小;

所述权重函数的公式表达式为:

优选地,构建基于孪生网络架构的克隆检测神经网络模型进行代码克隆检测的过程包括,

基于Siamese架构的神经网络,以总Katz中心性的词元作为堆叠BiLSTM网络的输入,使用已训练的GloVe模型将词元转换为固定长度的向量并预设维度大小,在乘以相应的总Katz中心性后,语义向量被输入到两个相同的堆叠BiLSTM子网络中;

基于相似性计算网络接收两个子网络的输出作为输入,基于余弦相似度计算向量之间的距离;其中,所述堆叠BiLSTM子网络中使用的损失函数是交叉熵,用于惩罚错误分类;Siamese架构的神经网络使用学习率为0.0001的均方根传播进行训练,训练后的Siamese网络的输出是两个输入是克隆对的概率,如果概率值大于0.5,则这两个函数是一对克隆函数,反之,则不是。

优选地,基于相似性计算网络接收两个子网络的输出作为输入,基于余弦相似度计算向量之间的距离的过程包括,

输入函数对

其中,

本发明还提供一种基于语义词元分析的代码克隆检测装置,包括:

静态分析模块,用于提取每个待检测函数的程序依赖图,每个节点表示一个基本块;

分词器模块,与所述静态分析模块连接,用于利用已训练的字节级字节对编码模型对所述程序依赖图中每个节点中的代码语句进行分词操作,提取词元信息;

Katz中心性分析模块,与所述分词器模块连接,用于计算所述程序依赖图中每个基本块的Katz中心性,然后将所述Katz中心性分配给基本块中的每个词元,并求和不同基本块中相同词元的Katz中心性,获得包含图形特征的语义词元;

词元编码模块,与所述Katz中心性分析模块连接,用于利用词向量模型对每个词元进行向量化表示,并与对应词元的Katz中心性值相乘得到最终的语义词元的向量表示;

克隆检测神经网络模型模块,与所述词元编码模块连接,用于基于构建的孪生网络架构的克隆检测神经网络模型进行代码克隆检测,获得检测结果。

与现有技术相比,本发明具有如下优点和技术效果:

本发明通过在程序依赖图的基础上执行Katz中心性分析,并利用字节级字节对编码模型提取词元信息、GloVe词向量模型进行编码、基于堆叠BiLSTM的孪生网络架构等技术实现代码克隆检测可以有效的深度理解代码语义,全面分析程序结构,能有效解决传统代码克隆检测方法的局限性,提高代码克隆检测的准确性和效率,对软件工程领域的代码复用、代码维护和代码演化分析等应用有重要价值。

附图说明

构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本发明实施例的方法流程示意图;

图2为本发明实施例的函数代码的控制流图和数据流图的示意图;

图3为本发明实施例的孪生网络架构的代码克隆检测示例图;

图4为本发明实施例的装置结构示意图。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

名词解释

克隆:指在软件系统中存在相似或完全相同的代码片段。这些片段可能出现在不同的位置或不同的函数中,但它们的语法结构和功能是相似的。

词元:在自然语言处理(Natural Language Processing,NLP)中,词元(Token)是将自然语言文本划分为有意义的单元或符号的过程。词元可以是一个单词、一个标点符号、一个数字、一个符号等,它们是句子或文本的基本构成部分。

控制流图(Control Flow Graph,CFG)是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向,也能反映一个过程的实时执行过程。

数据流图(Data Flow Graph,DFG)是一种图形化表示程序或系统内数据流动的表示方法。它由节点(nodes)和边(edges)组成,其中节点代表变量被赋值或使用的位置,而边表示变量被赋值的位置与之后使用该赋值结果的位置之间的关系。

程序依赖图(Program Dependence Graph,PDG)是程序的一种图形表示,它是带有标记的有向多重图。过程内的程序依赖图是基本块间控制依赖关系和数据依赖关系的图形表示,每个节点是一个基本块,节点之间的连接边表示了控制依赖关系和数据依赖关系。

可将函数f

Katz中心性(Katz Centrality):Katz中心性是一种用于衡量网络中节点重要性的中心性指标。它基于节点之间的路径数量和路径长度来计算节点的中心性分值。Katz中心性在网络分析中被广泛应用,用于确定网络中重要的节点、影响力传播、关键节点识别等任务。它既考虑了节点的直接连接情况,又考虑了节点之间的间接连接关系,因此对于评估节点的整体重要性具有一定的准确性和全局性。

字节级字节对编码模型(Byte-level Byte Pair Encoding Model,BBPE):是一种文本压缩和编码算法,常用于自然语言处理任务中的序列处理。它通过将文本划分为字节级别的子序列,并使用字节对(byte pair)操作来逐步构建编码词汇表。字节对操作是指将频率最高的相邻字节对合并为一个新的字节,不断重复此过程直到达到预定的词汇表大小或停止条件。

未登录词(Out-of-Vocabulary,OOV):是指在自然语言处理(NLP)任务中出现但未在模型的词汇表中找到的词汇或标记。这些词汇可能是生僻词、新词汇、拼写错误、缩写、专有名词或其他模型未曾见过的词汇。未登录词对于NLP任务来说是一个常见的挑战,因为模型只能处理它们在训练数据中存在的信息,对于未登录词的处理需要特殊的策略。

BiLSTM(Bidirectional Long Short-Term Memory,双向长短时记忆网络):是一种循环神经网络(Recurrent Neural Network,简称RNN)的变种。BiLSTM结合了两个方向(前向和后向)的信息流来更好地捕捉时序数据中的上下文信息。

堆叠:在深度学习中,堆叠意味着将多个相同类型的层叠加在一起以构建更复杂的模型。在堆叠BiLSTM中,多个BiLSTM层按顺序叠加在一起,其中每一层都接受前一层的输出作为输入。这样,信息可以在多个层之间传递,允许模型逐渐抽象和提取更高级别的特征。

传统方法主要基于词法、句法分析,而对于代码的语义理解和程序结构的深度分析不足,这可能导致克隆检测的准确性不高。本发明旨在解决在代码克隆检测场景下如何将高成本的图形匹配转化为简洁的词元分析,同时保留图形的细节,和高扩展、高准确率的相似性计算过程的问题。

实施例一

如图1所示,本发明所提供的一种基于语义词元分析的代码克隆检测方法,主要包含以下几个步骤:

步骤1:采用静态代码分析提取每个待检测函数的程序依赖图;

步骤2:利用已训练的字节级字节对编码模型对所述每个节点中的代码语句进行分词操作,提取词元信息;

步骤3:Katz中心性分析,针对程序依赖图中的每个节点计算Katz中心性,并计算出每个词元的Katz中心性值;

步骤4:编码语义词元为向量化表示;

步骤5:构建基于孪生网络架构的克隆检测神经网络模型。

进一步的优化方案,针对步骤1:采用静态代码分析提取每个待检测函数的程序依赖图。

程序依赖图是在控制流图CFG的基础上添加数据依赖关系,使得该图同时包含了程序的控制依赖和数据依赖关系。在控制流图中,每个节点都是一个基本块,节点之间的连接边表示基本块之间的控制依赖。

静态分析的目的是将函数代码转换为图形表示。该步骤不限于方法所使用的编程语言(如Java和C/C++),因为不同的编程语言有相应的静态分析工具可以分析它们。例如,利用Soot获取Java方法的控制流图,使用Joern来提取C方法的控制流图。

进一步的优化方案,针对步骤2:利用已训练的字节级字节对编码模型对所述每个节点中的代码语句进行分词操作,提取词元信息;

具体方法如下:

步骤2.1:从公开渠道收集大量文本和代码数据以作为训练数据集;

步骤2.2:构建字节级字节对编码模型。字节级字节对编码模型相比字节对编码模型,是将单词转化从字符序列变为字节序列,其可以有效的解决未登录词的问题。

所述字节级字节对编码模型的构建步骤如下:

1)给定的数据集中抽取单词以及相应的频次,并确定词表大小为51200;

2)将单词拆分为字节序列,这些不重复的字节作为初始词表;

3)将所有字节序列中的字节不重复地添加到词表中,选择并合并频次最高的相邻字节对;

4)重复步骤3直到满足词表大小。

步骤2.3:将所有程序依赖图中每个节点的代码语句转化为字节序列,并利用训练好的字节级字节对编码模型中的字节聚合方法对字节序列进行聚合操作,生成对应的词元序列;

例如,针对“eval”词汇的分词操作。所有操作都是在字节级上进行,聚合的方式是依据步骤2.2所训练得到的聚合策略进行,包含51739条规则。‘eval’词首先会被划分为('e','v','a','l')四个字节的序列,然后依据规则首先匹配字节‘a’和‘l’能够聚合为‘al’,接着匹配到字节’v’和‘al’能够聚合为‘val’,最后匹配到字节‘e’能和‘val’聚合为‘eval’。因此,最终输入‘eval’或被划分为只包含一个词元的序列(‘eval’)。

进一步的优化方案,针对步骤3:Katz中心性分析,针对程序依赖图中的每个节点计算Katz中心性,并计算出每个词元的Katz中心性值;

具体地,通过计算所述程序依赖图中每个节点的Katz中心性,然后将所述Katz中心性分配给基本块中的每个词元,并求和不同基本块中相同词元的Katz中心性,获得包含图形特征的语义词元;

与使用传统的图匹配方法来衡量两个图的相似性不同,本发明将PDG视为一个社交网络,并进行中心性分析以挖掘图的细节,以便更高效地计算相似性。中心性概念最初是在社交网络分析中发展起来的,用于量化网络中节点的重要性,并有潜力揭示网络的结构模式。在不同领域的网络分析中,提出了许多不同类型的中心性度量(例如度中心性和特征向量中心性)。

步骤3.1:在本发明中,优选地选择Katz中心性作为开始进行中心性分析的指标。Katz中心性(Katz Centrality)是特征向量中心性的一个变体,它不仅考虑了直接邻居的中心性,还考虑了网络中通过这些直接邻居连接到所考虑节点的所有其他节点的数量来计算网络中节点的相对影响。

如图2所示,程序依赖图是一个具有多类型边的图结构数据,因此在Katz中心性的计算中,通过将图依据控制依赖和数据依赖划分为两个子图(控制流图和数据流图),然后分别对每个子图的节点进行中心性分析。

Katz中心性计算过程如下:

设A表示具有n个节点的图的n×n邻接矩阵。如果存在连接节点i和节点j的边,则元素A

其中α∈[0,1],表示衰减因子,使得长路径的权重小于短路径,而β

以矩阵形式,公式(1)可以写作:

c=αAc+β (2)

为了计算Katz中心度向量c,可以解以下线性系统方程组,得:

c=(I-αA)

然而,对于大型图形来说,根据公式(3)计算矩阵的逆是计算密集型的,其复杂度为O(n

c(t)=αAc(t-1)+β (4)

其中c(t)表示第t次迭代的结果。每次迭代都会增加矩阵A的幂,这对应于考虑到更远的邻居。因此,Katz中心度衡量了节点在整个图中的全局影响力。每次迭代还会减少远离节点对节点影响力的贡献。在一些关于图拓扑结构的合理假设下,幂迭代法以O(n)的复杂度收敛到公式(3)中的中心度向量,例如α必须小于最大特征值的倒数。

优选地,设置α=0.5,β=1,控制依赖图和数据依赖图计算的中心性分别如表1和表2所示:

表1

表2

详细的Katz中心性计算。为了了解Katz中心性是如何通过幂迭代法计算得到的,在表格I中展示了c(t=0),c(t=1),...直到在t=4时收敛的结果,其中行表示节点的Katz中心性分数,列表示时间。为了解释Katz中心性背后的直觉,以单个种子节点B的迭代为例进行计算说明。初始时,c

步骤3.2:在本发明中,不限制迭代的次数,使得每个节点的Katz中心性都能收敛。在获得控制依赖图和数据依赖图中每个节点的中心性后,通过求均值获得每个节点最终的Katz中心性。例如,节点A的Katz中心性分数c

步骤3.3:一个基本块由多个词元组成。例如,基本块“a,b=read_input();”由10个词元组成,它们是:“a”、“,”、“b”、“=”、“read”、“_”、“input”、“(”、“)”、“;”。经过Katz中心性分析后,将相应的中心性分配给基本块中的所有词元,并计算不同基本块中相同词元的总中心性。例如,基本块A、B和D的Katz中心性分别是2.40625、1.8125和1。然后,词元“a”的总Katz中心性可以计算为2.40625+1.8125+1=5.21875。最后将所有词元的中心性进行归一化处理。经过中心性分析后,可以获得PDG中所有词元的相应总Katz中心性。这些具有总Katz中心性的词元称为语义词元。

简而言之,中心性分析的输入是一个程序依赖图,输出是带有图形特征(即Katz中心性)的词元,称为语义词元。

进一步的优化方案,针对步骤4:编码语义词元为向量化表示。

如果把这些词元按函数内原始顺序排序,那么这些词元就可以看作是一个句子。因此,可以应用自然语言处理领域的技术将句子编码为向量表示,从而有效地进行相似度计算。

步骤4.1:本发明采用一个新的全局对数双线性回归模型GloVe,用于词向量的无监督学习。它结合了全局矩阵分解和局部上下文窗口方法两者的优点。GloVe模型通过只训练词-词共现矩阵中的非零元素,而不是整个稀疏矩阵或大型语料库中的单个上下文窗口,有效地利用了统计信息。GloVe模型生成了一个具有有意义子结构的向量空间。

GloVe模型的训练主要采用以下步骤:

根据语料库构建一个共现矩阵(Co-ocurrence Matrix)X,矩阵中的每一个元素X

构建词向量和共现矩阵之间的近似关系,可以采用以下公式近似地表达两者之间的关系:

其中

最后通过构建一个加权最小二乘回归模型来构造损失函数。将公式(5)看作一个最小二乘问题,并在损失函数中引入权重函数f(X

其中V是词库的大小。

因为少见的共现携带有噪声,并且比频繁的共现携带更少的信息。添加权重函数可以避免对所有共现事件赋予相同的权重,优选地,采用如下所示形式的权重函数:

步骤4.2:利用已训练的GloVe词向量模型将每个基本块内的所有词元转换为向量表示Vec

进一步的优化方案,针对步骤5:构建基于孪生网络架构的克隆检测神经网络模型进行代码克隆检测,获得检测结果。

函数克隆检测的输入应该是一对函数,输出是它们的相似度,表示存在克隆的概率。孪生网络在这种情况下工作得很好。它主要由两个子网络组成,每个子网络以处理后的特征作为输入,输出特征的向量表示。特别是,这两个子网络共享所有参数。这种权重共享机制可以实现对函数代码同源潜在关联信息的抽取。接着,通过Loss的计算来评价两个输入的相似度。通常选择计算余弦相似度(Cosine),并输出[-1,1]之间的值来判断相似性。

优选地,本发明构建的子网络选择堆叠BiLSTM网络,其相比经典的BiLSTM具有更强的表示能力,更丰富的上下文信息,更好的梯度传播和特征提取和更好的模型鲁棒性。

优选地,模型的克隆检测过程是输入函数对

其中

图3展示了本发明中使用的Siamese架构神经网络。堆叠BiLSTM网络的输入是通过Katz中心性分析获得的特定语义词元(即具有总Katz中心性的词元)。首先使用已训练的GloVe模型将词元转换为固定长度的向量,其维度设置为100。在乘以相应的总Katz中心性后,语义向量被输入到两个相同的堆叠BiLSTM子网络中。优选地,堆叠的层数设置为3。最后,一个相似性计算网络接收这两个子网络的输出作为输入,计算它们之间的距离。本发明采用余弦相似度来计算,其他的度量方式也可以采用,此外,这两个子网络中使用的损失函数是交叉熵,用于惩罚错误分类。Siamese网络使用学习率为0.0001的均方根传播(RMSProp)进行训练。训练后的Siamese网络的输出是两个输入方法是克隆对的概率。如果该值大于0.5,则这两个函数是一对克隆函数,反之,则不是。

本发明从静态分析得到的程序依赖图中提取出每个基本块的Katz中心性,然后将中心性分配给基本块中的每个词元,并求和不同基本块中相同词元的中心性,得到包含图形特征的语义词元。

利用中心性计算每个基本块的影响力可以有效提取函数内部的结构信息,相比传统的图匹配方式具有更高的计算效率。程序依赖图相比控制依赖图多了基本块之间的数据依赖关系,因此,在程序依赖图的基础上计算中心性能够包含更多的结构特性,计算的中心性分数可靠性更高。

采用Katz中心性来计算基本块的影响力,其优势主要在于它不仅考虑了直接邻居的中心性,还考虑了网络中通过这些直接邻居连接到所考虑节点的所有其他节点的数量来计算网络中节点的相对影响,能够很好的衡量节点在网络中的全局重要性。

求和不同基本块中相同词元的中心性,得出的值作为总的中心性分数,可以有效凸显同一基本块中不同词元的重要性差异,利于关键词元作用发挥。

本发明对程序依赖图中每个基本块的代码语句采用字节级字节对编码模型提取词元信息;相比传统采用词法分析或利用特殊符号进行分词操作,如空格,标点符号等,采用字节级字节对编码模型可以有效地处理未登录词和稀有词的问题,避免信息损失和引入噪声,有效提升词向量模型的稳定性和泛化能力。此外,采用字节级字节对编码模型构建的词汇表大小可控,保留了上下文信息,可以有效处理多语言和字符集问题。

本发明利用GloVe词向量模型对词元进行向量化表示:常用于对代码进行向量化表示的静态词向量模型分为:全局矩阵分解方法(例如LSA)和局部上下文窗口方法(例如Word2vec)。但是,这两类方法都有明显的缺陷。虽然像LSA这样的方法有效地利用了统计信息,但他们在单词类比任务上表现相对较差,这表明不是最优的向量空间结构。像Word2vec这样的方法可能在类比任务上做得更好,但是他们很少利用语料库的统计数据,因为它们在单独的局部上下文窗口上训练,而不是在全局共现计数上训练。

GloVe是一个新的全局对数双线性回归模型,用于词向量的无监督学习。它结合了全局矩阵分解和局部上下文窗口方法两者的优点。GloVe模型通过只训练词-词共现矩阵中的非零元素,而不是整个稀疏矩阵或大型语料库中的单个上下文窗口,有效地利用了统计信息。GloVe模型生成了一个具有有意义子结构的向量空间。

本发明利用堆叠BiLSTM网络和孪生网络架构构建克隆检测模型。孪生网络非常适合比较两个对象的相似性,能够很好的适配代码克隆检测场景。它主要由两个子网络组成,每个子网络以处理后的特征作为输入,输出特征的向量表示。特别是,这两个子网络共享所有参数。这种权重共享机制可以实现对函数代码同源潜在关联信息的抽取。

整个函数转变为一个词元序列,可以作为一个句子。而RNN网络结构能够有效的适用于序列文本的学习。相比其他RNN网络,采用堆叠BiLSTM具有更多的优势:

更强的表示能力:堆叠双向LSTM通过堆叠多个双向LSTM层,增加了网络的深度。深层网络能够学习更复杂的特征表示,从而提高了模型的表示能力。通过堆叠多个层,堆叠双向LSTM可以捕捉更丰富、更抽象的序列特征。

更丰富的上下文信息:双向LSTM能够同时考虑当前时间步之前和之后的上下文信息,但仍然受限于单个双向LSTM层的能力。堆叠双向LSTM通过多层的组合,能够更好地利用更长的上下文信息。每个双向LSTM层的输出都包含了前面层的信息,使得最后一层的输出可以综合多层的上下文信息,提供更全面的序列理解。

更好的梯度传播和特征提取:堆叠双向LSTM在反向传播过程中,梯度可以更好地流经多个层,从而更有效地更新每一层的参数。这有助于缓解梯度消失或梯度爆炸问题,并更好地训练深层网络。此外,每个双向LSTM层都可以提取不同抽象级别的特征,从而提供更丰富的特征表示。

更好的模型鲁棒性:由于堆叠双向LSTM具有更强的表示能力和更丰富的上下文信息,它通常能够更好地应对数据中的噪声、冗余或不完整信息。这使得堆叠双向LSTM在处理复杂序列任务时具有更好的鲁棒性和泛化能力。

实施例二

如图4所示,本发明还提供一种基于语义词元分析的代码克隆检测装置,包括静态分析模块、分词器模块、Katz中心性分析模块、词元编码模块和克隆检测神经网络模型。

静态分析模块,旨在提取每个函数的程序依赖图,每个节点表示一个基本块。

分词器模块,与静态分析模块连接,用于利用已训练的字节级字节对编码模型对程序依赖图中每个节点中的代码语句进行分词操作,提取词元信息。

Katz中心性分析模块,与分词器模块连接,用于计算所述程序依赖图中每个基本块的Katz中心性,然后将Katz中心性分配给基本块中的每个词元,并求和不同基本块中相同词元的Katz中心性,得到包含图形特征的语义词元。

词元编码模块,与Katz中心性分析模块连接,用于利用词向量模型对每个词元进行向量化表示,并与对应词元的Katz中心性值相乘得到最终的语义词元的向量表示。

克隆检测神经网络模型模块,与词元编码模块模块连接,用于基于构建的孪生网络架构的克隆检测神经网络模型进行代码克隆检测,获得检测结果。具体通过给定一对代码函数,将相应的语义词元输入到Siamese网络中。输出是这两个函数是克隆对的概率。如果概率大于0.5,则认为它们是一对克隆。首先使用标记的代码对对Siamese网络进行训练。

以上,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。

相关技术
  • 一种基于程序源代码语义分析的代码相似度检测方法
  • 一种基于深度语义匹配的代码克隆检测方法
技术分类

06120116580871