一种基于结构特征和序列特征的代码补全方法技术

技术编号:34612629 阅读:41 留言:0更新日期:2022-08-20 09:18
本发明专利技术公开了一种基于结构特征和序列特征的代码补全方法,包括预处理部分、代码部分转换和训练部分;在预处理部分,从开源平台收集源代码,将源代码转换为抽象语法树形式;采用字节对编码方式建立对应词表;代码转换部分使用扩展的注意力机制抽取代码的结构特征和序列特征;最后采用Transfomer解码器作为基本网络模型,扩展注意力机制,经过softmax层计算概率,并输出结果;本发明专利技术引入字节对编码算法为值建立词表,使得构建的语言模型的未登录词问题大大减小;此外,通过从代码的两个维度上考虑了代码的语义信息,使得代码补全的准确度提高,帮助用户得到更为准确的候选。帮助用户得到更为准确的候选。帮助用户得到更为准确的候选。

【技术实现步骤摘要】
一种基于结构特征和序列特征的代码补全方法


[0001]本专利技术涉及计算机软件工程
,主要涉及一种基于结构特征和序列特征的代码补全方法。

技术介绍

[0002]随着软件开发规模的不断扩大,代码补全协助开发人员在软件开发中获得了越来越多的关注。它通过在集成开发环境(IDE)中对现有代码的基础上提出下一个可能的标记来加速软件开发过程。它可以成为方便的文档和开发人员的输入方法。代码补全已经成为许多代码智能任务的一个重要组成部分,在自动程序生成和软件产品的快速迭代中发挥了重要作用。
[0003]基于神经网络的代码补全模型通常将代码片段转换为源代码序列或抽象语法树(AST),或基于图,然后选择合适的神经网络来构建语言模型。
[0004]现有技术大多数关注于抽象语法树抽取特征并对部分抽象语法树进行编码来完成任务。抽象语法树不仅仅代表源代码和层次信息。它还准确地描绘了源代码中的逻辑和代码结构。这些方法关注在AST上的代码特征,但在序列信息挖掘上还不够。AST反映了代码的结构或层次,遍历的方式使得提取代码结构或节点之间的路径变得容易。树上结点可以包含任意信息,这意味着将代码片段转换为AST后有更多特征可以帮助提高模型性能。代码序列表示法是最简单、最有效的输入模型的方式,可以直接表示代码片段的语义,但是代码的结构特征还是被遗漏了。虽然不同编程语言的语法可能存在差异,例如,Java使用大括号来组织一个代码块,而Python使用缩进来使几个语句成为一个代码块,但都包含顺序、循环和选择结构。这些都是编程语言的基本组成部分,也是构建代码块的基础。序列表示将其忽略并把代码作为自然语言处理。与专注于描绘代码层次的结构特征相比,序列特征包含更多反映代码语义逻辑和过程的潜在规律性。
[0005]在为基于源代码的软件工程任务建立模型时,关键问题之一是如何对词汇进行建模,但只有少数方法考虑了未登录词问题。与自然语言不同,开发者可以用任何长度的单词组合来创建变量和函数名称,这就不可避免地导致了词表无法为新的词串编码的问题,称为未登录词。一些词在训练集中没有观察到,但在测试集中出现,这会严重降低模型的预测精度和性能。另外的方法通过保留经常出现的词来创建词表,同时用一个特殊的占位符来标记未知的词,或者引入一个缓存机制或指针网络来缓解,但并没有完全解决这个问题。

技术实现思路

[0006]专利技术目的:针对上述
技术介绍
中存在的问题,本专利技术提供了一种基于结构特征和序列特征的代码补全方法,能够为神经网络模型提供更多的代码特征,使得学习效果提升以提供更加准确的候选,补全效果更好。
[0007]技术方案:为实现上述目的,本专利技术采用的技术方案为:
[0008]一种基于结构特征和序列特征的代码补全方法,包括以下步骤:
[0009]步骤S1、代码预处理;从开源平台收集源代码,将源代码转换为抽象语法树形式;采用字节对编码方式建立对应词表;
[0010]步骤S2、代码转换;使用扩展的注意力机制抽取代码的结构特征和序列特征;
[0011]步骤S3、训练部分;将收集的源代码数据经过上文描述的预处理之后转换为抽象化语法树的数据格式;将抽象语法树序列和抽取结点与结点的相对路径构成的矩阵送入模型计算;模型采用Transfomer解码器作为基本神经网络并扩展注意力机制,其中扩展内容为在计算查询Q与键K时引入新的值R,R代表了结点间的相对层次的遍历路径,以此来捕捉相对结构信息;引入新的变量和计算一个结点注意力分数时考虑与另一个节点的分数权重,以此抽取代码序列的相对位置关系;最后经过softmax层计算概率,并输出结果。
[0012]进一步地,所述步骤S1中将源代码转换为抽象语法树形式;其中每个树上结点包括结点类型和结点值两部分;当某一树上结点无结点值时,用占位符[empty]填充;为了保证语料库的数据可用,采取一系列步骤,包括去除非ASCII编码的字符、去处注释、对驼峰式和下划线式命名的变量做分词处理;接着分别为结点类型和结点值建立词表,其中采用字节对编码方式为结点值建立词表。
[0013]进一步地,所述步骤S1中采用字节对编码方式为结点值构建词表的具体方法如下:
[0014]字节对编码算法是迭代操作:首先切分语料库中的每一个词,得到单个字符添加到初始词表中;接着统计连续出现的两个字符的频率,将频率最高的字符对(t1,t2)合并为一个新的字符(t1t2),此过程称之为合并操作;重复此过程直至没有可以合并的字符对或合并的操作次数达到预设值。最终字节对编码后的词表包括所有的初始字符和合并后的字符对以及可合并对。
[0015]进一步地,所述步骤S2中代码转换具体步骤包括:
[0016]步骤S2.1、基于步骤S1获取的抽象语法树形式进行转换处理,抽取抽象语法树的结构特征;考查树上的每一对结点,通过遍历的方式找到唯一路径,所有路径共同表征了所述抽象语法树的相对结构信息和层次信息;
[0017]步骤S2.2、在先序遍历后得到抽象语法树序列,考查序列上的每对结点的相对位置关系,抽取序列特征。
[0018]进一步地,所述步骤S2.1中路径表示方式如下:
[0019]UD
path
(a,b)=U
i
D
j
[0020]其中U
i
表示从结点a到结点b向上移动的次数,D
j
表示从结点a到结点b向下移动的次数;
[0021]在神经网络计算中引入矩阵R代表UD
path
构成的矩阵:
[0022][0023]其中Q,K,V代表输入元素的查询、键和值向量组成的矩阵;采用softmax函数计算出决定V的表达程度的权重;为了避免QK乘积过大导致梯度消失,结果除以缓解梯度消失问题,是为输入元素创建查询、键和值向量的维度。
[0024]进一步地,所述步骤S2.2中抽取序列特征具体方法如下:
[0025]代码序列特征表现为重复模式和规律性信息,抽取序列特征即序列上结点的相对位置编码,具体表示如下:
[0026][0027][0028]其中z
i
是x
i
的注意力得分,W
V
、W
Q
、W
K
是可训练矩阵,a
ij
是x
i
对当前位置x
j
的关注度,是扩展注意力机制的两个可训练参数;a
ij
的计算是通过softmax函数得到概率分布。
[0029]有益效果:
[0030]本专利技术提供的基于结构特征和序列特征的代码补全方法,通过挖掘代码的结构特征和序列特征增强代码语义表达能力,使得模型能学到更多的代码特征。此外,本专利技术还引入了字节对编码算法为结点值建立词表,使得构建的语言模型的未登录词问题大大减小。本专利技术从代码的两个维度上考虑了代码的语义信息,使得代码补全的准确度提高,帮助用户得到较为准确的候选。
附图说明...

【技术保护点】

【技术特征摘要】
1.一种基于结构特征和序列特征的代码补全方法,其特征在于,包括以下步骤:步骤S1、代码预处理;从开源平台收集源代码,将源代码转换为抽象语法树形式;采用字节对编码方式建立对应词表;步骤S2、代码转换;使用扩展的注意力机制抽取代码的结构特征和序列特征;步骤S3、训练部分;采用Transfomer解码器作为基本网络模型,并扩展注意力机制,其中扩展内容为引入新的矩阵的和变量分别捕捉代码的相对结构信息和相对位置关系;最后经过softmax层计算概率,并输出结果。2.根据权利要求1所述的一种基于结构特征和序列特征的代码补全方法,其特征在于,所述步骤S1中将源代码转换为抽象语法树形式;其中每个树上结点包括结点类型和结点值两部分;当某一树上结点无结点值时,用占位符[empty]填充;分别为结点类型和结点值建立词表,其中采用字节对编码方式为结点值构建词表。3.根据权利要求2所述的一种基于结构特征和序列特征的代码补全方法,其特征在于,所述步骤S1中采用字节对编码方式为结点值构建词表的具体方法如下:字节对编码算法是迭代操作:首先切分语料库中的每一个词,得到单个字符添加到初始词表中;接着统计连续出现的两个字符的频率,将频率最高的字符对(t1,t2)合并为一个新的字符(t1t2);重复此操作,直至没有可以合并的字符对或合并的操作次数达到预设值;最终字节对编码后的词表包括所有的初始字符、合并后的字符对和可合并对。4.根据权利要求1所述的一种基于结构特征和序列特征的代码补全方法,其特征在于,所述步骤S2中代码转换具体步骤包括:步骤S2.1、基于步骤S1获取的抽象语法树形式进行转换处理,抽取抽象语法树的结构特征;考查树上的每一对结点,通过遍历的方式...

【专利技术属性】
技术研发人员:黄志球刘亚鹏李伟湋
申请(专利权)人:南京航空航天大学
类型:发明
国别省市:

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

1