基于无监督聚类的代码分块方法、存储介质和装置制造方法及图纸

技术编号:39189718 阅读:13 留言:0更新日期:2023-10-27 08:36
本发明专利技术涉及一种基于无监督聚类的代码分块方法、存储介质和装置,属于代码分块领域,所述方法首先将源代码抽象为抽象语法树,再将抽象语法树平铺得到的文本,使用文本训练词向量模型,得到抽象语法树中每个节点的词向量,接下来以词向量作为输入进行DBSCAN聚类,最后将DBSCAN聚类获得的聚类中心作为SOM算法竞争层神经元、聚类中心个数作为聚类个数即分块个数,由此实现代码分块。本发明专利技术还提供运行所述方法的装置和计算机可读存储介质,本发明专利技术方法能够实现小样本无监督聚类进而实现代码分块任务,其分块结果的稳定性和精确度也明显高于传统代码分块方法。传统代码分块方法。传统代码分块方法。

【技术实现步骤摘要】
基于无监督聚类的代码分块方法、存储介质和装置


[0001]本专利技术属于代码分块领域,具体的涉及一种基于无监督聚类的代码分块方法、存储介质和装置。

技术介绍

[0002]随着计算机技术的不断发展,编程语言也逐渐变的复杂,采用不同编程语言编写的程序数量正在以爆炸式的速度增长。当前编程语言种类繁多,大规模程序代码量巨大,导致代码的后期维护、改进、分析等代码处理方法面临巨大挑战。代码分块是将一段较长的代码拆分为更小的、逻辑独立的代码片段,从而达到将复杂代码分而治之的处理要求和目的。这种技术可以应用在代码漏洞分析、代码翻译、代码注释自动补齐、代码语义理解、代码质量检测等方面。
[0003]传统的代码分块方法,是按照关键字或者代码的结构进行分块,例如遇到for关键字,则将其划分为一个循环体。这种代码分块方法必须针对每一种编程语言的语法进行手动适配,若某些项目采用多种开发语言,某些开发语言未进行人工适配,则该语言无法完成分块,从而导致对项目代码进行分块时不稳定,进而影响后续的代码分析与处理功能。同样的,若某一种语言的关键字或代码结构发生变化(因语言版本升级等原因),则传统的根据关键字分块的方法准确度也会快速降低。采用自动化方法,从大量的已有代码中训练一个模型,实现代码的自动分块,是需要解决的一个问题。为了解决该问题,可以使用无监督聚类的方法,对代码的抽象语法树(AST,Abstract Syntax Tree)节点进行分类,从而达到代码分块的目的。
[0004]面对每种代码语言的字符与结构特征有限,现有的无监督聚类方法大多依赖于大规模的数据集训,对样本数量有很高的要求,而代码的抽象语法树节点个数,是典型的小样本数据集,导致传统的无监督聚类算法,例如自组织映射(Self

organizing Maps,SOM)算法,在应用于代码分块时,由于样本数量太少导致模型收敛速度慢或者无法收敛,进而导致代码分块稳定性和准确性较低。对SOM的初始权值赋值方法进行改进,以适应小样本无监督聚类学习,是一种可行的方案

技术实现思路

[0005]本专利技术要解决的技术问题在于提供一种基于无监督聚类的代码分块方法、存储介质和装置,所述方法实现小样本无监督聚类进而实现代码分块任务。它由具有噪声的基于密度的聚类方法(Density

Based Spatial Clustering of Applications withNoise,DBSCAN)聚类方法和SOM聚类方法组成。该算法分为两个阶段:首先使用DBSCAN聚类方法确定SOM算法的初始权值,代替原有的随机赋值方法,然后在第二阶段使用SOM作为无监督聚类方法完成聚类任务。该方法在代码分块任务上的运行时间、不稳定数据点率和内部误差方面都明显优于传统的SOM算法。
[0006]本专利技术是通过如下技术方案来实现的:
[0007]一种基于无监督聚类的代码分块方法,所述方法首先将提取源代码的抽象语法树,再将抽象语法树平铺得到的文本,使用文本训练词向量模型,得到抽象语法树中每个节点的词向量,用来表示每个节点的特征,接下来以词向量作为输入进行DBSCAN聚类,最后将DBSCAN聚类获得的聚类中心作为SOM算法竞争层神经元、聚类中心个数作为聚类个数即分块个数。
[0008]进一步,通过数据降维法将高维数据映射到竞争层初始化神经元权值,通过DBSCAN聚类算法确定出N
×
M个聚类中心,以此作为SOM算法初始权重值。
[0009]进一步,在SOM算法中,输入神经元与输出神经元直接相连,每个连接对应一个权重值;使用欧氏距离,计算每个输出神经元的输入向量和输入向量之间的距离;距离最小的输出神经元被宣布为获胜者;然后,使用邻域函数最小化神经元自身与其邻域之间的总距离。
[0010]进一步,聚类个数先初始化为与初始样本数目m相关的一个较大数值,将聚类个数初始化为然后结合DBSCAN聚类获得神经元权重值,通过SOM算法进行聚类,将N
×
M初始化为获胜过的神经元的个数;在SOM算法中,对通过化整处理进行修正。
[0011]进一步,将聚类后的抽象语法树节点与源代码进行对应,使用抽象语法树节点的分类表示代码的分块结果。
[0012]本专利技术还提供一种基于无监督聚类的代码分块装置,所述装置能够运行所述基于无监督聚类的代码分块方法。
[0013]本专利技术还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序适用于由处理器加载并执行所述基于无监督聚类的代码分块方法。
[0014]本专利技术与现有技术相比的有益效果:本专利技术利用DBSCAN聚类结果初始化SOM聚类的方法,DBSCAN聚类结果代替SOM聚类中竞争层中神经元收敛过程,降低SOM聚类收敛所需的迭代次数,显著改善代码分块过程中小样本代码聚类时的收敛慢甚至不收敛问题,其分块结果的稳定性和精确度也明显高于传统代码分块方法。
附图说明
[0015]图1为随机初始化权重每迭代50次的竞争层神经元图;
[0016]图2为本专利技术方法每迭代50次的竞争层神经元图。
具体实施方式
[0017]下面通过实施例来对本专利技术的技术方案做进一步解释,但本专利技术的保护范围不受实施例任何形式上的限制。
[0018]实施例1:一种基于无监督聚类的代码分块方法,所述方法首先将源代码抽象为抽象语法树,再将抽象语法树平铺得到的文本,使用文本训练词向量模型,得到抽象语法树中每个节点的词向量,接下来以词向量作为输入进行DBSCAN聚类,最后将DBSCAN聚类获得的聚类中心作为SOM算法竞争层神经元、聚类中心个数作为聚类个数即分块个数,由此实现代码分块。具体步骤如下:
[0019](1)提取源代码的抽象语法树:抽象语法树是程序源代码的抽象语法结构的树状
表示,树上的每个节点都表示源代码中的一种结构。通过抽象语法树对程序源代码进行分析,是程序代码自动生成、代码转换、代码翻译的重要手段。对抽象语法树中的节点进行特征提取,是利用程序源代码抽象语法树进行后续代码处理的核心技术之一,基于抽象语法树的神经网络模型可以更好地表示源代码。
[0020]将代码抽象为抽象语法树,AST由三种类型的节点组成:1)占位符节点;2)应用编程接口(Application Programming Interface,API)节点;3)语法节点。占位符节点不是函数的实际组件,但它们将函数组件链接在一起以形成树。所有AST都有占位符节点,例如“params”表示其叶节点是函数参数,“stmnts”表示其叶是各种类型的语句。API节点是指函数返回值和函数参数的类型。它们也可以是变量声明和函数调用。语法节点是包含控制流元素和运算符的语法元素。运算符(例如“+”、
“‑”
或“=”)将保持不变。
[0021](2)将抽象语法树节点抽取出来平铺得到的文本,使用大量抽象语法树平铺文本训练词向量模型,得到抽象语法树中每个节点的词本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于无监督聚类的代码分块方法,其特征在于,所述方法首先将源代码抽象为抽象语法树,再将抽象语法树平铺得到的文本,使用文本训练词向量模型,得到抽象语法树中每个节点的词向量,接下来以词向量作为输入进行DBSCAN聚类,最后将DBSCAN聚类获得的聚类中心作为SOM算法竞争层神经元、聚类中心个数作为聚类个数即分块个数,由此实现代码分块。2.根据权利要求1所述的一种基于无监督聚类的代码分块方法,其特征在于,通过数据降维法将高维数据映射到竞争层初始化神经元权值,通过DBSCAN聚类算法确定出N
×
M个聚类中心,以此作为SOM算法初始权重值。3.根据权利要求1所述的一种基于无监督聚类的代码分块方法,其特征在于,在SOM算法中,输入神经元与输出神经元直接相连,每个连接对应一个权重值;使用欧氏距离,计算每个输出神经元的输入向量和输入向量之间的距离;距离最小的输出神经元被宣布为获胜者;然后,使用邻域函数最小化神经元自身与其邻域之间的总...

【专利技术属性】
技术研发人员:杨永全管佩琪魏志强
申请(专利权)人:中国海洋大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1