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

文档序号:29639351发布日期:2022-04-13 18:02阅读:177来源:国知局
一种代码补全方法、模型和工具

1.本发明涉及计算机领域,尤其涉及一种代码补全方法、代码补全模型和代码补全工具。


背景技术:

2.随着各行业信息化的不断加深,定制软件、商业软件、嵌入式软件的需求变得愈发强烈,软件开发已经成为一项普遍的工作。在软件开发过程中,开发人员需要大量使用前人实现的软件包。若开发人员不使用代码补全而是机械化地记忆并重复书写代码,会使得开发者的负担大大增加,同时开发效率降低。因此软件开发的普遍性问题和代码编写效率问题使得代码补全俨然成为一个待解决的问题。
3.早期的代码补全技术主要基于统计语言模型(statistical language model)。统计语言模型通过对源代码出现频率进行统计,使用n-gram模型结合辅助组件得到需要补全的代码文本或者结合程序分析的方法得到符合语法的代码补全结果。亦或将将传统的代码补全问题转换为下一条代码语句可能出现的概率分布问题,直接预测api调用序列提供给用户进行选择。或者在其中使用中间表示法,利用词素和变量的相对顺序将代码标识符放入组中处理长的代码标识符组序列。
4.近年来的技术大多基于神经网络语言模型(neural network language model)。最初的模型基于循环神经网络(recurrent neural network)对源代码进行词向量编码并使用长时记忆网络(long short-term memory)和注意力机制来生成需要补全的词汇。后来引入序列到序列(seq2seq)神经网络架构,使用编码器(encoder)和解码器(decoder)进行源代码信息学习。此外相关研究还将源代码转换为抽象语法树(abstract syntax tree)进行语义捕获学习,最终生成复合语义的代码补全语句。
5.在目前的技术中,统计语言模型虽然可以通过频率统计学习到开发人员编码中使用的高频模板进行预测,但无法学习代码的长时依赖性。而且,基于神经网络语言模型的代码补全任务可以有效的利用长时依赖特性但对于低频词的预测仍然具有挑战,并且根据神经网络预测的代码标识符有可能不符合语法,需要进行语法语义融合的方法进行代码补全。


技术实现要素:

6.为了解决基于神经网络的技术中存在的低频词无法进行有效预测且传统神经网络预测的结果可能不符合语法的问题,本公开提供了一种代码补全方法和代码补全模型,以至少部分地解决现有技术中存在的上述问题。
7.根据本公开的第一方面,一种代码补全方法,包括:从真实代码仓库获取真实项目并且基于真实项目的项目源码进行数据集分类,同时通过选择工作中使用的真实项目集合构建代码补全数据集;构建基于语义的代码补全模型,其包括基于循环神经网络搭建带有注意力机制的序列到序列神经网络,通过bpe分词算法进行源代码分词,通过双向长短时记
忆神经网络进行上下文依赖的学习,利用注意力机制进行文本权重的学习,并且根据不同预测场景进行基于序列到序列的神经网络模型用于多任务的适配;构建基于语法的代码补全模型,其包括使用抽象语法树代码推荐、template模板代码推荐、统计代码推荐和子词补全进行;以及将神经网络模型预测得到的结果优选地进行概率获取,然后将基于语法的代码补全模型预测得到的结果融合该概率分布得到重排序的语法预测结果,最终与基于语义的代码补全模型预测得到的结果进行融合得到目标预测文本和排列顺序。
8.在一些实施例中,基于真实项目的项目源码进行数据集分类包括将数据集分为训练集、验证集和测试集中的一种或多种。
9.在一些实施例中,构建基于语义的代码补全模型包括对构建出的基于语义的代码补全模型进行验证;以及重排序预测结果得到目标预测文本和排列顺序包括通过对得到的预测文本和排列顺序进行分析并且验证。
10.在一些实施例中,还包括设计和实现代码补全工具,代码补全工具数据采集模块、数据传输模块、数据处理模块和可视化补全展示模块,其中:数据采集模块被配置为采集当前开发人员编写代码段且对文本进行预处理;数据传输模块被配置为将文本传输至服务端并从服务端接收响应数据;数据处理模块被配置为在服务端使用代码补全模型进行补全文本预测得到代码补全结果;以及可视化补全展示模块被配置为进行语法语义融合的代码补全结果概率重排序显示以供开发人员进行选择。
11.在一些实施例中,bpe分词算法用于代码标识符的分割以便低频词的预测。
12.根据本公开的第二方面,一种代码补全模型,其特征在于,包括:基于语义的代码补全模型,基于语义的代码补全模型包括编码器和解码器,编码器包括双向长短时记忆架构,以对代码标识符信息进行语义的捕获,解码器包括将编码器阶段处理的最终的代码标识符向量输出和隐藏层状态信息作为生成的代码序列的第一个代码标识符向量,以逐个生成代码标识符向量的方式来生成代码补全语句;基于语法的代码补全模型,包括抽象语法树依赖代码推荐模块、template模板代码推荐模块、统计代码推荐模块和代码子词补全推荐模块,抽象语法树依赖代码推荐模块用于对项目中打开的java文件提供抽象语法树视图,template模板代码推荐模块用于固定模板信息的代码补全,统计代码推荐模块用于通过提供的类型进行基于频率统计方式的代码补全提示,代码子词补全推荐模块用于对代码标识符进行代码补全预测;以及语法语义融合的代码补全模型,语法语义融合的代码补全模型被配置为用于得到符合语法和语义的代码补全结果。
13.在一些实施例中,基于语义的代码补全模型包括global attention注意力机制。
14.在一些实施例中,在基于语义的代码补全模型中,解码器将编码器阶段处理的最终的定长代码标识符向量输出和隐藏层状态信息作为生成的代码序列的第一个代码标识符向量,以逐个生成代码标识符向量的方式来生成代码补全语句,解码器根据代码标识符词表逐步生成对应的索引,直到遇到预先定义的表示代码补全语句已预测完成的终止符。
15.在一些实施例中,语法语义融合的代码补全模型被配置为选取当前神经网络语言模型输出的概率分布值,其中包括《subtoken,probability》组,其中subtoken表示预测到的代码标识符子词,并且probability表示该代码标识符子词在神经网络语言模型下的预测概率。
16.在一些实施例中,其特征在于,所述语法语义融合的代码补全模型还被配置为:对
基于语法的代码补全结果进行bpe算法分词;对基于语义的神经网络代码补全预测结果进行概率排序,并对得到的分词后的结果进行《subtoken,probability》组构造;将《subtoken,probability》组映射至经所述bpe算法分词后的结果,通过匹配前缀进行代码补全代码标识符查询,并且保持原有排列顺序;以及对新的匹配结果概率重排序,最终结合token概率分布和行概率分布得到语法语义融合的代码补全结果。
17.根据本公开的第三方面,提供了一种代码补全工具,该代码补全工具包括根据本公开第二方面的代码补全模型,代码补全模型被配置为在代码补全过程中执行代码补全。
18.在一些实施例中,该代码补全工具包括数据采集模块、数据传输模块、数据处理模块和可视化补全展示模块,其中:数据采集模块被配置为采集当前开发人员编写代码段且对文本进行预处理;数据传输模块被配置为将文本传输至服务端并从服务端接收响应数据;数据处理模块被配置为在服务端使用代码补全模型进行补全文本预测得到代码补全结果;以及可视化补全展示模块被配置为进行语法语义融合的代码补全结果概率重排序显示以供所述开发人员进行选择。
19.本发明所要实现的技术效果在于:
20.本公开能够通过语法语义融合的方法进行代码补全,使得基于神经网络的技术中的低频词被更加有效地预测,并且同时使得神经网络预测的结果更加符合语法。具体地,对于数据集(百万级别)下的实验表明,使用bpe算法分词后的token预测准确率比不使用bpe算法的模型准确率提升了8.99%。对于语法语义融合的代码补全模型的实验对比显示top-1准确率从纯基于语法的7%和纯基于语义的46%提升到了语法语义融合的53%,证明了融合方法的有效性。
附图说明
21.图1示例性地示出了系统整体架构和流程图。
22.图2示例性地示出了基于语义的代码补全模型的global attention注意力机制的结构图。
具体实施方式
23.为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
24.图1示例性地示出了系统整体架构和流程图。参考图1,首先构建代码补全数据集。针对开源的真实代码仓库进行真实项目的获取,通过获取项目源码进行数据集分类,包括训练集、验证集和测试集。在采取过程中,选择相关工作中使用的项目集合进行代码补全数据集的构建。根据不同的代码补全需求进行不同代码段输入输出提取。针对源代码的特殊性进行数据预处理,包含替换、过滤等操作。
25.参考图1,提出了基于神经网络的代码补全模型。首先进行基于语义的代码补全模型构建。基于循环神经网络搭建带有注意力机制的序列到序列神经网络。通过bpe分词算法进行源代码分词以此提高低频词预测来增强泛化性。通过双向长短时记忆神经网络进行上
下文依赖的学习,并利用注意力机制进行文本权重的学习以进行有效预测。根据提出的不同预测场景,提出基于序列到序列的神经网络模型用于多任务的适配。将提出的方法与其他已有方法进行对比,验证提出的方法的有效性。其次使用抽象语法树代码推荐、template模板代码推荐、统计代码推荐和子词补全进行基于语法的代码补全模型搭建。最终进行语法语义融合的代码补全模型构建。将神经网络模型预测得到的结果进行概率获取,然后将基于语法的代码补全模型预测得到的结果融合该概率分布得到重排序的语法预测结果,最终与基于语义的代码补全模型预测得到的结果进行融合得到目标预测文本和排列顺序。通过对得到的结果进行实验分析并验证,最终表明该融合方式的有效性。
26.继续参考图1,设计和实现代码补全工具。代码补全工具可以包括数据采集模块、数据传输模块、数据处理模块和可视化补全展示模块。数据采集模块负责采集当前开发人员编写代码段且对文本进行预处理。数据传输模块负责将文本传输至服务端并从服务端接收响应数据。数据处理模块在服务端使用代码补全模型进行补全文本预测得到代码补全结果。可视化补全展示模块进行语法语义融合的代码补全结果概率重排序显示以供开发人员进行选择。
27.下面将对bpe的代码分词算法进行详细介绍。源代码因为具有人为定义的较为复杂的连词而导致大量低频词的出现。例如方法名readtext是一个人为定义的组合词,由read和text组合而成。在代码预测的词表中可以得知readtext是一个低频词,神经网络语言模型无法对低频词进行有效预测。所以需要将低频词readtext拆分为两个高频词read和text进行方法名子词的预测,最终合并生成低频词readtext方法名。为了将低频词拆分为高频词,需要使用一种算法来对低频词进行拆分。使用bpe(byte pair encoding)算法来对预处理后的源代码进行分词。
28.bpe算法可以通过将出现频率最高的一对字节替换为一个从未使用过的字节来进行数据压缩。在本发明的工作中,我们将bpe算法用于代码标识符的分割以便低频词的预测。首先将每一个代码标识符识别为一系列的字符串序列,对于每个标识符都在字符串序列后加一个特殊符号表示代码标识符终止符。每一个字符将表示为一个组合符号。然后对出现频率最高的符号对进行合并,例如将出现频率最高的符号对(

a’,

b’)合并为新的符号

ab’。根据算法设置的次数进行迭代,最终获取需要的分割效果。
29.下面继续结合图1介绍基于语义的代码补全模型。根据一些实施例,采用基于带有注意力机制的seq2seq网络架构对代码补全进行预测。
30.首先,神经网络模型搭建过程中,编码器encoder的核心是bilstm(bi-directional long short-term memory,双向长短时记忆)架构。虽然lstm可以沿着时序从前往后依次对代码文本信息进行数据处理得到相关代码特征信息,但它无法从后往前进行代码文本信息的获取。但由于代码补全任务的特殊性,在整个程序源代码中,当前时间步位置处的信息不仅可以通过前面已编写的代码获取相关元素,也可能与后面的代码标识符文本信息相关。介于代码补全任务的这种特性,bilstm模型可以很好的对相关的代码标识符信息进行语义的捕获。解码器decoder将编码器阶段处理的最终的定长代码标识符向量输出和隐藏层状态信息作为生成的代码序列的第一个代码标识符向量,以逐个生成代码标识符向量的方式来生成代码补全语句。解码器根据代码标识符词表逐步生成对应的索引直到遇到预先定义的表示代码补全语句已预测完成的终止符。
31.其次,神经网络模型搭建采用global attention注意力机制。由于传统的注意力机制只会考虑编码器encoder最后时间步的隐藏层状态,而不会查看以前时间步的隐藏层状态依次来对所有的编码器encoder状态进行获取。针对源代码文本的特性,即需要对前面所有出现的文本进行权重比例的学习。
32.图2示例性地示出了基于语义的代码补全模型的global attention注意力机制的结构图。
33.参考图2,对于每一时间步t模型均会基于当前时间步的目标状态h
t
和所有编码器encoder的隐藏层状态预测出对应的注意力权重a
t
,然后在解码器decoder层进行代码标识符的逐步预测。global attention模型通过将当前的每个隐藏层状态和生成目标的隐藏层状态h
t
进行比较得到与输入步长一致且对齐的全局权重a
t
用于不同状态的权重分配,其计算方式如
[0034][0035]
score函数计算编码器encoder输出和解码器decoder输出之间的注意力值,其主要分为dot点乘、general权值网络映射和concat映射三种对齐计算方式。其计算如公式如
[0036][0037]
我们将得到的编码器encoder的输出状态和隐藏层状态作为解码器decoder的输入,并通过lstm架构得到相应的输出状态o
t
和隐藏层状态h
t
。然后对得到的输出状态和隐藏层状态结合注意力权重进行计算,如
[0038]at
=attn(o
t
,h
t-1
)
[0039][0040][0041]at
表示当前状态对应的注意力数值,h
t-1
表示上一时间步隐藏层状态。使用公式(3.4)和公式(3.5)进行上下文向量的加权求和得到输出,并预测下一代码标识符向量。
[0042]
下面将详细介绍根据一些实施例的基于语法的代码补全模型。针对基于语法的代码补全模块,根据各模块功能以及应用主要分为抽象语法树依赖代码推荐、template模板代码推荐、统计代码推荐和代码子词补全推荐四部分。其中,抽象语法树依赖代码推荐可以包括针对特定的项目需要进行模型的构建,以此提取项目工作空间的架构图。主要包括对项目本身依赖进行判定,针对每个文件生成抽象语法树ast结构。并针对其依赖的外部引入包等信息进行检索匹配。基于语法的代码补全根据其依赖进行判断并提示相应的方法等代码标识符信息以供选择。设计一种可视化方式来对项目中打开的java文件提供抽象语法树视图。首先从文本选择导航到抽象语法树节点,然后从从节点导航到选择项进行解析抽取。
[0043]
template模板代码推荐可以包括针对java源代码进行基于检索的代码补全模块搭建。使用java template进行模板分类。其中包括控制流语句、数据流语句等信息。针对循环、判断等固定template模板结构进行模板检测。当用户进行模板关键词输入后,可以通过template设置的正则匹配算法进行有效补全。正则匹配算法通过用户自定义的不同类型的
java代码进行template模板匹配,当遇到符合预期的代码匹配片段,就会根据已定义的java模板代码进行推荐提供给用户进行选择。例如输入public关键词,模板自动检测可能需要进行补全的代码标识符,比如static静态方法、void方法返回类型等固定模板信息进行代码补全。
[0044]
统计代码推荐可以包括针对项目中或者当前文件已经定义或者出现过的代码标识符进行代码补全的预测,包括java关键字、已定义的变量、方法等相关代码标识符信息。通过基于频率的统计对出现过的代码标识符进行统计。基于当前用户语法模板预测下一代码标识符类型,结合抽象语法树信息明确符合语法的模板。通过提供的类型进行基于频率统计方式的代码补全提示。
[0045]
代码子词补全推荐可以包括针对java文件编写过程中已编写的子词对代码标识符进行代码补全预测。对于已经编写的部分代码子词,通过子词推荐匹配到所有可能推荐的代码标识符,通过筛选提供给用户进行选择。例如输入input代码标识符前缀,子词补全自动检测已有的代码补全结果提示stream等可能出现的代码标识符子词。
[0046]
下面将继续结合图1介绍根据一些实施例的语法语义融合的代码补全模型。
[0047]
基于神经网络的代码补全模型可以有效地利用上下文长时依赖关系,利用源代码的自然性进行代码补全预测得到有效输出。但神经网络语言模型预测的结果可能不符合语法导致开发人员对选择的结果需要进行二次修改或者自我进行查询编程。传统ide自带的代码补全插件有效地利用项目内文件的相互依赖以及固定模板和基于词频统计的方式可以有效地进行符合语法的代码补全。但因为其依赖的局限性、模板的不可变和基于词频推荐带来长时依赖无法获取等问题,往往不能给开发人员一个很好的体验。对上述两个工作进行分析学习得到语法语义融合的代码补全模型。既可以得到符合语法的代码补全结果保证代码的正确性,也可以得到符合语义的代码补全结果用来智能完成代码补全任务。
[0048]
对于单纯的神经网络语言模型,我们对其结果进行分析。神经网络语言模型不仅仅只是输出当前概率最高的代码补全预测结果,而是对当前模型的下一代码标识符的概率分布结果进行获取。选取当前神经网络语言模型输出的概率分布值,其中包括《subtoken,probability》组。subtoken可以表示某个预测到的代码标识符子词,probability可以表示该代码标识符子词在神经网络语言模型下的预测概率。例如对于代码语句s的子词预测结果有s1,s2…
sn,其对应的概率为则其结果满足一下公式:
[0049][0050]
其中p为所有预测结果的概率总和为1。得到上述概率分布进行存储。对基于语法的代码补全模型预测的结果,进行收集获取,并对其按当前的自推荐顺序进行排序。在该顺序上适配神经网络语言模型得到的概率分布进行概率分布重排序。出现重合预测结果并且概率较高的代码标识符置于列表前面。这样使得基于语法的代码补全结果可以根据其在神经网络语言模型预测的概率进行位置的切换提供给用户进行选择。主要流程如下所示:
[0051]
对基于语法的代码补全结果进行bpe算法分词(适配神经网络模型预处理时的bpe分词模型以及相应的参数);
[0052]
对基于语义的神经网络代码补全预测结果进行概率排序,并对得到的分词后的结果进行《subtoken,probability》组构造;
[0053]
将《subtoken,probability》组映射至(1)分词后的结果,通过匹配前缀进行代码
补全代码标识符查询,并保持原有排列顺序;
[0054]
对新的匹配结果概率重排序,最终结合token概率分布和行概率分布得到语法语义融合的代码补全结果。
[0055]
综上所述,本公开的代码补全方法包括:从真实代码仓库获取真实项目并且基于真实项目的项目源码进行数据集分类,同时通过选择工作中使用的真实项目集合构建代码补全数据集;构建基于语义的代码补全模型,其包括基于循环神经网络搭建带有注意力机制的序列到序列神经网络,通过bpe分词算法进行源代码分词,通过双向长短时记忆神经网络进行上下文依赖的学习,利用注意力机制进行文本权重的学习,并且根据不同预测场景进行基于序列到序列的神经网络模型用于多任务的适配;构建基于语法的代码补全模型,其包括使用抽象语法树代码推荐、template模板代码推荐、统计代码推荐和子词补全进行;以及将神经网络模型预测得到的结果优选地进行概率获取,然后将基于语法的代码补全模型预测得到的结果融合该概率分布得到重排序的语法预测结果,最终与基于语义的代码补全模型预测得到的结果进行融合得到目标预测文本和排列顺序。
[0056]
通过本公开的实施例,本公开能够通过语法语义融合的方法进行代码补全,使得基于神经网络的技术中的低频词被更加有效地预测,并且使得神经网络预测的结果更加符合语法。
[0057]
应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1