一种代码补全方法、模型和工具技术

技术编号:33042094 阅读:8 留言:0更新日期:2022-04-15 09:23
本公开的实施例涉及一种代码补全方法,包括:从真实代码仓库获取真实项目并且基于真实项目的项目源码进行数据集分类,同时通过选择工作中使用的真实项目集合构建代码补全数据集;构建基于语义的代码补全模型,其包括搭建带有注意力机制的序列到序列神经网络,通过BPE分词算法进行源代码分词,通过双向长短时记忆神经网络进行上下文依赖学习,利用注意力机制进行文本权重的学习,并且根据不同预测场景进行基于序列到序列的神经网络模型用于多任务的适配;构建基于语法的代码补全模型;以及重排序预测结果得到目标预测文本和排列顺序。通过上述布置,使得基于神经网络的技术中的低频词被更加有效地预测,并且使得神经网络预测的结果更加符合语法。预测的结果更加符合语法。预测的结果更加符合语法。

【技术实现步骤摘要】
一种代码补全方法、模型和工具


[0001]本专利技术涉及计算机领域,尤其涉及一种代码补全方法、代码补全模型和代码补全工具。

技术介绍

[0002]随着各行业信息化的不断加深,定制软件、商业软件、嵌入式软件的需求变得愈发强烈,软件开发已经成为一项普遍的工作。在软件开发过程中,开发人员需要大量使用前人实现的软件包。若开发人员不使用代码补全而是机械化地记忆并重复书写代码,会使得开发者的负担大大增加,同时开发效率降低。因此软件开发的普遍性问题和代码编写效率问题使得代码补全俨然成为一个待解决的问题。
[0003]早期的代码补全技术主要基于统计语言模型(Statistical Language Model)。统计语言模型通过对源代码出现频率进行统计,使用N

gram模型结合辅助组件得到需要补全的代码文本或者结合程序分析的方法得到符合语法的代码补全结果。亦或将将传统的代码补全问题转换为下一条代码语句可能出现的概率分布问题,直接预测API调用序列提供给用户进行选择。或者在其中使用中间表示法,利用词素和变量的相对顺序将代码标识符放入组中处理长的代码标识符组序列。
[0004]近年来的技术大多基于神经网络语言模型(Neural Network Language Model)。最初的模型基于循环神经网络(Recurrent Neural Network)对源代码进行词向量编码并使用长时记忆网络(Long Short

Term Memory)和注意力机制来生成需要补全的词汇。后来引入序列到序列(Seq2Seq)神经网络架构,使用编码器(Encoder)和解码器(Decoder)进行源代码信息学习。此外相关研究还将源代码转换为抽象语法树(Abstract Syntax Tree)进行语义捕获学习,最终生成复合语义的代码补全语句。
[0005]在目前的技术中,统计语言模型虽然可以通过频率统计学习到开发人员编码中使用的高频模板进行预测,但无法学习代码的长时依赖性。而且,基于神经网络语言模型的代码补全任务可以有效的利用长时依赖特性但对于低频词的预测仍然具有挑战,并且根据神经网络预测的代码标识符有可能不符合语法,需要进行语法语义融合的方法进行代码补全。

技术实现思路

[0006]为了解决基于神经网络的技术中存在的低频词无法进行有效预测且传统神经网络预测的结果可能不符合语法的问题,本公开提供了一种代码补全方法和代码补全模型,以至少部分地解决现有技术中存在的上述问题。
[0007]根据本公开的第一方面,一种代码补全方法,包括:从真实代码仓库获取真实项目并且基于真实项目的项目源码进行数据集分类,同时通过选择工作中使用的真实项目集合构建代码补全数据集;构建基于语义的代码补全模型,其包括基于循环神经网络搭建带有注意力机制的序列到序列神经网络,通过BPE分词算法进行源代码分词,通过双向长短时记
忆神经网络进行上下文依赖的学习,利用注意力机制进行文本权重的学习,并且根据不同预测场景进行基于序列到序列的神经网络模型用于多任务的适配;构建基于语法的代码补全模型,其包括使用抽象语法树代码推荐、Template模板代码推荐、统计代码推荐和子词补全进行;以及将神经网络模型预测得到的结果优选地进行概率获取,然后将基于语法的代码补全模型预测得到的结果融合该概率分布得到重排序的语法预测结果,最终与基于语义的代码补全模型预测得到的结果进行融合得到目标预测文本和排列顺序。
[0008]在一些实施例中,基于真实项目的项目源码进行数据集分类包括将数据集分为训练集、验证集和测试集中的一种或多种。
[0009]在一些实施例中,构建基于语义的代码补全模型包括对构建出的基于语义的代码补全模型进行验证;以及重排序预测结果得到目标预测文本和排列顺序包括通过对得到的预测文本和排列顺序进行分析并且验证。
[0010]在一些实施例中,还包括设计和实现代码补全工具,代码补全工具数据采集模块、数据传输模块、数据处理模块和可视化补全展示模块,其中:数据采集模块被配置为采集当前开发人员编写代码段且对文本进行预处理;数据传输模块被配置为将文本传输至服务端并从服务端接收响应数据;数据处理模块被配置为在服务端使用代码补全模型进行补全文本预测得到代码补全结果;以及可视化补全展示模块被配置为进行语法语义融合的代码补全结果概率重排序显示以供开发人员进行选择。
[0011]在一些实施例中,BPE分词算法用于代码标识符的分割以便低频词的预测。
[0012]根据本公开的第二方面,一种代码补全模型,其特征在于,包括:基于语义的代码补全模型,基于语义的代码补全模型包括编码器和解码器,编码器包括双向长短时记忆架构,以对代码标识符信息进行语义的捕获,解码器包括将编码器阶段处理的最终的代码标识符向量输出和隐藏层状态信息作为生成的代码序列的第一个代码标识符向量,以逐个生成代码标识符向量的方式来生成代码补全语句;基于语法的代码补全模型,包括抽象语法树依赖代码推荐模块、Template模板代码推荐模块、统计代码推荐模块和代码子词补全推荐模块,抽象语法树依赖代码推荐模块用于对项目中打开的Java文件提供抽象语法树视图,Template模板代码推荐模块用于固定模板信息的代码补全,统计代码推荐模块用于通过提供的类型进行基于频率统计方式的代码补全提示,代码子词补全推荐模块用于对代码标识符进行代码补全预测;以及语法语义融合的代码补全模型,语法语义融合的代码补全模型被配置为用于得到符合语法和语义的代码补全结果。
[0013]在一些实施例中,基于语义的代码补全模型包括Global Attention注意力机制。
[0014]在一些实施例中,在基于语义的代码补全模型中,解码器将编码器阶段处理的最终的定长代码标识符向量输出和隐藏层状态信息作为生成的代码序列的第一个代码标识符向量,以逐个生成代码标识符向量的方式来生成代码补全语句,解码器根据代码标识符词表逐步生成对应的索引,直到遇到预先定义的表示代码补全语句已预测完成的终止符。
[0015]在一些实施例中,语法语义融合的代码补全模型被配置为选取当前神经网络语言模型输出的概率分布值,其中包括<Subtoken,Probability>组,其中Subtoken表示预测到的代码标识符子词,并且Probability表示该代码标识符子词在神经网络语言模型下的预测概率。
[0016]在一些实施例中,其特征在于,所述语法语义融合的代码补全模型还被配置为:对
基于语法的代码补全结果进行BPE算法分词;对基于语义的神经网络代码补全预测结果进行概率排序,并对得到的分词后的结果进行<Subtoken,Probability>组构造;将<Subtoken,Probability>组映射至经所述BPE算法分词后的结果,通过匹配前缀进行代码补全代码标识符查询,并且保持原有排列顺序;以及对新的匹配结果概率重排序,最终结合To本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种代码补全方法,其特征在于,包括:从真实代码仓库获取真实项目并且基于所述真实项目的项目源码进行数据集分类,同时通过选择工作中使用的所述真实项目集合构建代码补全数据集;构建基于语义的代码补全模型,其包括基于循环神经网络搭建带有注意力机制的序列到序列神经网络,通过BPE分词算法进行源代码分词,通过双向长短时记忆神经网络进行上下文依赖的学习,利用注意力机制进行文本权重的学习,并且根据不同预测场景进行基于所述序列到序列的神经网络模型用于多任务的适配;构建基于语法的代码补全模型,其包括使用抽象语法树代码推荐、Template模板代码推荐、统计代码推荐和子词补全进行;以及将神经网络模型预测得到的结果优选地进行概率获取,然后将基于语法的代码补全模型预测得到的结果融合该概率分布得到重排序的语法预测结果,最终与基于语义的代码补全模型预测得到的结果进行融合得到目标预测文本和排列顺序。2.根据权利要求1所述的方法,其特征在于,基于所述真实项目的项目源码进行数据集分类包括将数据集分为训练集、验证集和测试集中的一种或多种。3.根据权利要求1所述的方法,其特征在于,构建基于语义的代码补全模型包括对构建出的所述基于语义的代码补全模型进行验证;以及重排序预测结果得到目标预测文本和排列顺序包括通过对得到的预测文本和排列顺序进行分析并且验证。4.根据权利要求1所述的方法,其特征在于,还包括设计和实现代码补全工具,所述代码补全工具包括数据采集模块、数据传输模块、数据处理模块和可视化补全展示模块,其中:所述数据采集模块被配置为采集当前开发人员编写代码段且对文本进行预处理;所述数据传输模块被配置为将文本传输至服务端并从服务端接收响应数据;所述数据处理模块被配置为在服务端使用代码补全模型进行补全文本预测得到代码补全结果;以及所述可视化补全展示模块被配置为进行语法语义融合的代码补全结果概率重排序显示以供所述开发人员进行选择。5.根据权利要求1所述的方法,其特征在于,所述BPE分词算法用于代码标识符的分割以便低频词的预测。6.一种代码补全模型,其特征在于,包括:基于语义的代码补全模型,所述基于语义的代码补全模型包括编码器和解码器,所述编码器包括双向长短时记忆架构,以对代码标识符信息进行语义的捕获,所述解码器包括将编码器阶段处理的最终的所述代码标识符向量输出和隐藏层状态信息作为生成的代码序列的第一个代码标识符向量,以逐个生成代码标识符向量的方式来生成代码补全语句;基于语法的代码补全模型,包括抽象语法树依赖代码推荐模块、Template模板代码推荐模块、统计代码推荐模块和代码子词补全推荐模块,所述抽象语法树依赖代码推荐模块用于对项目中打开的Java文件提供抽象语法树视图,所述Tem...

【专利技术属性】
技术研发人员:唐宇王旭严灏刘旭东
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:

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

1