一种基于逐层融合抽象语法树的代码补全方法

文档序号:37124364发布日期:2024-02-22 21:34阅读:32来源:国知局
一种基于逐层融合抽象语法树的代码补全方法

本发明属于软件程序设计领域,更进一步涉及结合人工智能自然语言处理技术进行代码补全。本发明可用于对待补全源程序空缺的部分进行补全。


背景技术:

1、代码补全是指基于上下文中的现有代码,预测接下来要输入的类名、方法名和关键字等代码片段。代码补全是程序开发自动化的重要功能之一,是大多数现代集成开发环境和源代码编辑器的重要组件。随着软件规模和复杂性的提高,对程序编写准确性和效率的要求也日益提升,如何基于现有的代码做出更加准确的预测已经成为了软件工程的领域的热门方向之一。

2、将待补全源程序表示为序列,是代码补全中的一种常用的方法,然而这种方法会导致代码的层次结构信息的丢失,进而导致无法产生语法正确的补全代码。而使用抽象语法树(abstract syntax tree,ast)来表示待补全源程序,能够保持更丰富的代码层次结构。

3、公开号为cn114924741a的中文专利文献公开了一种基于结构特征和序列特征的代码补全方法。该方法将源代码转换为抽象语法树,采用字节对编码方式建立对应词表。代码转换部分使用扩展的注意力机制抽取代码的结构特征和序列特征。最后采用transfomer解码器作为基本网络模型,扩展注意力机制,经过softmax层计算概率,并输出结果。通过从代码的两个维度上考虑了代码的语义信息,使得代码补全的准确度提高,帮助用户得到更为准确的候选。

4、公开号为cn115167863a的中文专利文献公开了一种基于代码序列和代码图融合的代码补全方法。该方法使用特殊字符串代替需要补全的代码片段待补全位置,将原始代码数据集中的代码片段分别转换为代码序列和代码图,并分别作为所述序列编码器和图编码器的输入,将目标代码作为所述解码器的输入。当解码结束时,获取代码补全的结果。

5、公开号为cn114296787a的中文专利文献公开了一种基于图神经网络的智能合约代码补全方法。该方法根据智能合约源代码的版本号构建多个智能合约源代码数据集,将各数据集中的各智能合约源代码解析成对应的抽象语法树,将抽象语法树中的结点作为代码表示图的结点,根据智能合约源代码的语义信息在代码表示图中添加多种类型的语义边,筛选出符合业界安全实践的代码片段,在代码表示图中为代码片段中的结点间添加特征边。代码表示图嵌入到训练好的门控图神经网络中,进行代码补全预测。


技术实现思路

1、本发明的目的是针对上述背景技术中存在的问题:①只关注ast结构信息,而忽略了其他语义信息。②对层次结构信息的提取不足。③功能相同而ast结构不同的代码片段带来的模型泛化能力不足,提出一种基于逐层融合抽象语法树的代码补全方法。

2、本发明还提供了一种基于逐层融合抽象语法树的代码补全装置,将待补全代码输入到该系统后,该系统即可借助补全模型预测并输出代码补全的结果,可用于辅助代码的编写。

3、术语解释:

4、待补全源程序:需要进行代码补全的源程序。

5、补全代码:由代码补全模型生成的代码,用于插入至待补全源程序中需要进行代码补全的位置。

6、控制流程图(control flow graph,cfg):是一个过程或程序的抽象表现,使用图的形式表示一个过程内所有基本块执行的可能流向,包含了源程序的控制流信息。

7、控制流边:根据cfg中表示的控制流关系,在s-ast上添加的一种边,包含了待补全源程序的控制流信息。

8、数据流图(data flow graph,dfg):一种反映程序执行时各种数据信息在程序中的流动、处理和存储情况的图,包含了源程序的数据流信息。

9、数据流边:根据dfg中表示的数据流关系,在s-ast上添加的一种边,包含了待补全源程序的数据流信息。

10、函数调用图(call graph,cg):是源程序中函数之间调用关系的图形化表示,包含了源程序的函数调用信息。在cg中,结点表示函数,边表示调用关系。

11、图注意力网络(graph attention networks,gat):一种基于注意力的体系结构来执行图结构数据结点分类的网络,利用隐藏的自我注意层(self-attention layer)来解决基于图卷积或其近似方法的不足。

12、基于树的卷积神经网络(tree-based convolutional neural network,tbcnn):一种基于ast的卷积神经网络,该卷积神经网络设计了卷积核用于捕获ast的结构信息。

13、异构图:包含多种类型结点或边的图。

14、异构图变换模型(heterogeneous graph transformer,hgt):一种用于处理异构图数据和动态异构图数据的变换模型。该变换模型引入了与节点和边类型相关的注意力机制来为不同类型的结点和边生成专用的表示;另外还引入了相对时间编码机制来捕获任意时间段内的动态结构依赖关系。

15、子树根结点类型集合:待补全源程序的每一条语句在ast中都对应一棵子树,所有子树的根结点类型构成一个子树根结点类型集合。

16、子树集合:待补全源程序的每一条语句在ast中都对应一棵子树,所有子树构成一个子树集合。

17、占位结点:一个代表某棵子树的符号,各棵子树对应的占位结点均不相同。

18、语句级抽象语法树(sentence-abstract syntax tree,s-ast):一种对待补全源程序的每一条语句对应ast的子树进行融合后得到的树形数据结构,包含了待补全源程序的层次结构信息。

19、bert模型(bidirectional encoder representations from transformers):是一种面向自然语言处理的无监督预训练语言模型(pre-trained language model,plm)。

20、路径集合:由s-ast中所有从根结点到终端结点的路径构成的集合。

21、路径向量集合:将路径集合中所有路径编码为向量得到的集合。

22、源结点:若结点a和结点b之间存在一条有向边,且该有向边是从a指向b,则称结点a为源结点。

23、路径相似边:在最相似的两条路径向量对应的两个终端结点之间添加的边。

24、语义信息:本发明涉及的语义信息包括控制流信息、数据流信息、语义相似信息和函数调用信息。

25、语义相似信息:代表路径相似边两端的结点对应的路径语义是相似的。

26、增强语句级抽象语法树(augmented sentence-abstract syntax tree,as-ast):一种在s-ast上添加控制流边、数据流边和路径相似边后得到的树形数据结构。as-ast不仅包含s-ast中的层次结构信息,还包含了控制流信息、数据流信息和语义相似信息。

27、信息增强函数调用图(information augmented call graph,ia-cg):一种根据as-ast和cg构建而成的图,包含了语义信息和层次结构信息。相比于as-ast,ia-cg包含了更深的层次结构信息,ia-cg包含了cg中的函数调用信息,使得其包含的语义信息更加丰富。

28、实现本发明目的的思路是,首先对数据集中每一份待补全源程序进行预处理:解析待补全源程序,生成与待补全源程序对应的ast、cfg、dfg和cg,并将预处理后的数据集进行划分;其次搭建一个基于逐层融合抽象语法树的代码补全模型:根据ast构建s-ast,根据cfg和dfg,对s-ast进行语义信息增强得到as-ast,根据as-ast和cg构建ia-cg,并使用gat提取ia-cg特征,根据ia-cg特征提取后得到的特征向量,生成补全代码;然后设置模型所有的初始参数以及超参数,将训练集和验证集加载至该模型中进行训练,得到对于该模型最优的参数;最后将该模型应用于代码补全任务中。实现流程如图1所示,模型框架如图2所示。

29、s100:对数据集中的每一份待补全源程序进行预处理:对待补全源程序进行解析,生成与待补全源程序对应的ast、cfg、dfg和cg;将经过预处理后的数据集划分为训练集、验证集和测试集。

30、s200:搭建一个基于逐层融合抽象语法树的代码补全模型:首先根据ast构建s-ast,接着根据cfg和dfg,对s-ast进行语义信息增强得到as-ast,然后根据as-ast和cg构建ia-cg,使用gat提取ia-cg包含的层次结构信息和语义信息,其中语义信息包括as-ast中含有的语义相似信息、控制流信息、数据流信息和cg中含有的函数调用信息;最后根据ia-cg特征提取后得到的特征向量,生成补全代码。

31、s300:设置基于逐层融合抽象语法树的代码补全模型的所有初始参数,设置词向量的维度、批处理的大小、学习率的大小、优化器的选择等与该模型相关的超参数;将训练集和验证集加载至该模型中进行训练,训练结束后得到对于该模型最优的参数。

32、s400:运用该代码补全模型,对待补全源程序进行代码补全,将测试集输入到训练好的代码补全模型中进行测试,使用机器学习中的准确率和mrr作为该代码补全模型在执行代码补全任务时的评估指标,然后将该代码补全模型运用于不同数据集的代码补全任务当中。

33、进一步地,步骤s200中所述的搭建一个基于逐层融合抽象语法树的代码补全模型过程如图3所示,具体步骤如下:

34、s210:构建s-ast:使用tbcnn,分别对待补全源程序的每一条语句对应ast的子树进行融合,得到对应于每一棵子树的唯一的特征向量,根据得到的子树特征向量构建s-ast。

35、进一步地,构建s-ast的具体步骤如下:

36、s211:待补全源程序的每一条语句在ast中都对应一棵子树,提取所有子树根结点的类型,并添加到一个子树根结点类型集合q中。

37、s212:在得到子树根结点类型集合q后,对ast进行先序遍历,同时构建子树集合s:对于每一个ast中的结点i,如果i所属的类型存在于q,则使用一个占位结点替换以i为根的整棵子树,同时将加入至s中;上述过程递归执行,直到所有子树全部被替换为占位结点,其中占位结点是一个代表某棵子树的符号,各棵子树对应的占位结点均不相同。

38、s213:将s中的所有子树编码为向量。

39、s214:使用tbcnn分别对编码后的每一棵子树进行融合,得到与每一棵子树对应的、唯一的特征向量;使用上述特征向量替换对应的占位结点,重复上述操作直至所有的占位结点均被替换,最终构建得到s-ast。

40、s220:构建as-ast:基于cfg和dfg,在s-ast上添加控制流边、数据流边和路径相似边,构建得到as-ast。其中控制流边包含了待补全源程序的控制流信息,数据流边包含了待补全源程序的数据流信息,路径相似边包含了待补全源程序的语义相似信息。

41、进一步地,构建as-ast的具体步骤如下:

42、s221:在最相似的两条路径向量对应的两个终端结点之间添加路径相似边。

43、进一步地,添加路径相似边的具体步骤如下:

44、(1)先序遍历s-ast,获取所有从根结点到终端结点的路径,将所有路径构成一个路径集合r。

45、(2)对r中的每一条路径,使用bert对路径进行编码,得到每一条路径对应的特征向量,将所有特征向量构成一个路径向量集合。

46、(3)对于中的任意一条路径向量,将与中其他路径向量都进行相似度比较,得到与最相似的路径向量,然后在所代表的路径的终端结点和所代表的路径的终端结点之间添加一条无向边,这条边称为路径相似边,它包含了和之间的语义相似信息,即对应的路径和对应的路径语义是相似的;其中和的相似度计算公式如下:

47、

48、其中d为路径向量和的欧几里得距离;

49、重复上述操作,直至为所有路径都找到与其最相似的路径,并添加路径相似边。

50、s222:根据cfg中表示的控制流关系和dfg表示的数据流关系,在s-ast的结点间添加控制流边和数据流边,得到as-ast。

51、s230:构建ia-cg:将as-ast按函数拆分,拆分得到的每一棵子树与每一个函数一一对应,使用hgt分别对每一棵子树进行融合,得到与每一棵子树对应的、唯一的特征向量,使用上述特征向量分别替换cg中对应的结点,构建出ia-cg。

52、进一步地,构建ia-cg的具体步骤如下:

53、首先遍历as-ast,当遇到结点类型为functiondef 的结点n时,将以n为根的整棵子树进行拆分,拆分得到的每一棵子树与每一个函数一一对应。然后将各棵子树编码为向量,将上述向量转换为有向的异构图后输入到hgt中,使用hgt分别融合每一棵子树信息,得到与每一棵子树对应的、唯一的特征向量,这些子树特征向量构成一个集合。最后根据中的子树特征向量所代表的函数,替换cg中对应结点即可构建出ia-cg。

54、s240:提取ia-cg特征:使用gat提取ia-cg包含的层次结构信息和语义信息,得到与ia-cg中的每一个结点对应的、唯一的特征向量。在待补全源程序中,将需要插入补全代码的函数记为fun_p,使用注意力机制提升与fun_p相关的所有函数的重要程度;将所有结点的特征向量进行加权平均,得到表示ia-cg的特征向量。

55、进一步地,提取ia-cg特征的具体步骤如下:

56、对于有n个结点的ia-cg,其结点集为,其中每一个结点都代表一个函数。首先使用gat提取ia-cg包含的层次结构信息和语义信息,得到与ia-cg中的每一个结点对应的、唯一的特征向量,所有结点的特征向量构成特征向量集。在待补全源程序中,将需要插入补全代码的函数记为fun_p,记fun_p对应的特征向量为,然后使用注意力机制提升与fun_p相关的所有函数的重要程度:对于任意特征向量,计算与的相关程度:

57、

58、其中、和为权重矩阵,为注意力打分函数。

59、最后将所有结点的特征向量进行加权平均:

60、

61、得到表示ia-cg的特征向量。

62、s250:根据ia-cg特征提取后得到的特征向量,生成补全代码。

63、进一步地,根据特征向量生成补全代码的具体步骤如下:

64、在得到表示ia-cg的特征向量后,使用sigmoid函数,将映射为一个表示词汇表中的词汇出现概率的向量,的维度与词汇表的维度相同,其计算公式如下式所示:

65、

66、其中为权重矩阵;

67、选取中概率最高的值对应词汇表中的词汇,得到补全代码。

68、本发明还提供了一种基于逐层融合抽象语法树的代码补全装置,包括:

69、数据集的预处理和划分模块,被配置为,对数据集中的每一份待补全源程序进行预处理,解析待补全源程序,生成对应的ast、cfg、dfg和cg,并将预处理后的数据集划分为训练集、验证集和测试集。

70、构建基于逐层融合抽象语法树的代码补全模型模块,被配置为,首先根据ast构建s-ast,接着根据cfg和dfg,对 s-ast进行语义信息增强得到as-ast,然后根据as-ast和cg构建ia-cg,使用gat提取ia-cg包含的层次结构信息和语义信息,最后根据ia-cg特征提取后得到的特征向量,生成补全代码。

71、模型训练模块,被配置为,设置基于逐层融合抽象语法树的代码补全模型的所有初始参数,设置词向量的维度、批处理的大小、学习率的大小、优化器的选择等与该模型相关的超参数;将训练集和验证集加载至该模型中进行训练,训练结束后得到对于该模型最优的参数。

72、代码补全模型应用模块,被配置为,运用该代码补全模型,对待补全的源程序进行代码补全,将测试集输入到训练好的代码补全模型中进行测试,使用机器学习中的准确率和mrr作为该代码补全模型在执行代码补全任务时的评估指标,然后将该代码补全模型运用于不同数据集的代码补全任务当中。

73、本发明与现有技术相比具有以下优点:

74、(1)本发明能够提取ast的层次结构信息。相比与其他提取ast信息的技术,本发明通过逐层融合ast的信息,逐步构建得到s-ast、as-ast以及ia-cg,能够提取出ast的层次结构信息。

75、(2)本发明能够提取出s-ast的语义相似信息。本发明在s-ast上添加了路径相似边,相比于其他提取ast信息的技术,本发明能够使模型对于语义相似的代码片段有更好的泛化能力。

76、(3)本发明结合了语义相似信息、控制流信息、数据流信息和函数调用信息。相比于其他将ast转化为序列或ast构建为图的现有技术,本发明不仅提取了ast的层次结构信息,同时还结合了语义相似信息、控制流信息、数据流信息和函数调用信息,可以帮助模型更好地理解代码,做出更加准确的预测和补全。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1