代码补全的方法、装置、设备及存储介质与流程

文档序号:37429832发布日期:2024-03-25 19:21阅读:11来源:国知局
代码补全的方法、装置、设备及存储介质与流程

本技术涉及软件工程,具体而言,涉及一种代码补全的方法、装置、设备及存储介质。


背景技术:

1、在软件工程领域,如何提高软件的开发效率以及如何提升所构建软件的质量是研究人员一直思考的问题。其中,增加软件开发过程中的自动化水平是提高软件开发效率的重要手段之一。

2、在github和stack overflow等网站为代表的开源社区网站中存在数量众多且高质量的源代码,这些海量的程序代码为研究人员使用深度学习技术对源代码进行分析理解提供了可能。研究人员从自然语言处理中获取灵感,建立可以对源代码进行分析的语言模型,分析了规模从数以百计到数以百万计的软件项目的源代码,利用了软件的“自然性”来协助完成软件工程的下游任务,包括代码补全、提高代码可读性、程序修复等。使用深度学习中的自然语言处理技术对源代码进行建模是人工智能在软件工程领域的一个挑战,其中,代码补全作为对源代码建模中较为重要的下游任务成为了较为研究人员比较热衷的研究方向。

3、随着深度学习的出现以及发展,使用nlp技术对源代码建模具有非常广阔的前景,但也存在一些其特有的问题。首先是所预测的标识符(token)不在词库(out ofvocabulary,oov)的问题,程序语言相较人类语言具有更多的自定义性,token中包含大量自定义变量,当前大部分模型无法预测出不在词库中的token。其次是当前基于深度学习的语言模型对于捕获远距离依赖关系的能力较差,当需要预测的token上次出现的位置距离当前位置较远时,模型可能无法“想起”之前的token,从而没有办法预测出正确的答案,进一步影响模型预测的准确性。最后是语言模型的训练通常需要大量的语料库才能获得较好的性能,当前基于深度学习的代码补全模型训练速度较慢,在大规模的数据集下模型训练时间非常久。


技术实现思路

1、本技术实施例提供了一种代码补全的方法、装置、设备及存储介质,以至少解决相关技术中难以自动进行代码补全的技术问题。

2、根据本技术实施例的一个方面,提供了一种代码补全的方法,包括:

3、获取代码库文件,通过预设的分词算法将程序代码从标识符序列转换为子标识符序列,根据所述子标识符序列得到训练数据集;

4、构建基于子标识符的代码补全模型,所述代码补全模型包括自注意力机制,基于所述训练数据集训练所述代码补全模型,得到训练好的代码补全模型;

5、将待预测代码输入所述训练好的代码补全模型,得到输出的子标识符,根据输出的子标识符组合成待补全代码的完整标识符。

6、在一个可选地实施例中,通过预设的分词算法将程序代码从标识符序列转换为子标识符序列,根据所述子标识符序列得到训练数据集,包括:

7、基于bpe分词算法得到开放式词表以及分割模式文件;

8、基于所述分割模式文件对代码库文件中的程序代码进行分割处理,将程序代码从标识符序列转换为子标识符序列;

9、根据分割后的子标识符序列以及所述开放式词表中的子标识符序列,得到训练数据集。

10、在一个可选地实施例中,构建基于子标识符的代码补全模型,包括:

11、构建基于子标识符的代码补全模型,所述代码补全模型包括输入模块、转换模块以及输出模块;

12、其中,所述输入模块包括词嵌入层和位置编码层;

13、所述转换模块包括遮掩多头自注意力层、前馈网络层、归一化层和残差网络层;

14、所述输出模块包括线性全连接层、softmax层和argmax层。

15、在一个可选地实施例中,基于所述训练数据集训练所述代码补全模型,包括:

16、采用静态模式训练所述代码补全模型;

17、所述静态模式为获取训练数据集,根据所述训练数据集训练所述代码补全模型。

18、在一个可选地实施例中,基于所述训练数据集训练所述代码补全模型,包括:

19、采用动态模式训练所述代码补全模型;

20、所述动态模式为获取训练数据集,根据所述训练数据集训练所述代码补全模型,得到初始代码补全模型;

21、读取用户编辑的代码数据,每读取预设数量个字符,就将读取的字符作为一个小训练集输入到代码补全模型中进行训练,动态改变模型参数。

22、在一个可选地实施例中,基于所述训练数据集训练所述代码补全模型,包括:

23、采用维护模式训练所述代码补全模型;

24、所述维护模式为获取训练数据集,根据所述训练数据集训练所述代码补全模型,得到初始代码补全模型;

25、读取当前项目中的其他代码文件,作为中训练集输入到代码补全模型中进行二次训练,得到二次训练的代码补全模型;

26、读取用户编辑的代码数据,每读取预设数量个字符,就将读取的字符作为一个小训练集输入到代码补全模型中进行三次训练,动态改变模型参数。

27、在一个可选地实施例中,将待预测代码输入所述训练好的代码补全模型,得到输出的子标识符,根据输出的子标识符组合成待补全代码的完整标识符,包括:

28、对所述待预测代码进行分词处理,得到待预测代码的子标识符序列;

29、将待预测代码的子标识符序列输入代码补全模型,得到输出的子标识符,所述输出的子标识符包含结尾标识;

30、将模型输出的所有子标识符按顺序进行拼接,去掉中间的结尾标识,形成待补全代码的完整标识符。

31、根据本技术实施例的另一方面,还提供了一种代码补全的装置,包括:

32、分割模块,用于获取代码库文件,通过预设的分词算法将程序代码从标识符序列转换为子标识符序列,根据所述子标识符序列得到训练数据集;

33、模型训练模块,用于构建基于子标识符的代码补全模型,所述代码补全模型包括自注意力机制,基于所述训练数据集训练所述代码补全模型,得到训练好的代码补全模型;

34、代码补全模块,用于将待预测代码输入所述训练好的代码补全模型,得到输出的子标识符,根据输出的子标识符组合成待补全代码的完整标识符。

35、根据本技术实施例的又一方面,还提供了一种电子设备,包括存储器和处理器,上述存储器中存储有计算机程序,上述处理器被设置为通过上述计算机程序执行上述的代码补全的方法。

36、根据本技术实施例的又一方面,还提供了一种计算机可读的存储介质,该计算机可读的存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述代码补全的方法。

37、本技术实施例提供的技术方案可以包括以下有益效果:

38、本技术实施例提供了一种代码补全的方法,训练基于注意力机制的代码补全模型,代码补全模型输入输出都是子标识符(subtoken)序列,根据训练的代码补全模型自动进行代码补全。该方法提出了基于自注意力机制的subtoken语言模型,解决了传统深度学习模型在代码补全上缺乏远距离上下文依赖的问题,以及模型训练速度较慢的问题,给出了在subtoken粒度上进行代码补全,即预测完整token的方法,提高代码补全的准确性和质量。

39、进一步地,本技术采用了开放式词表训练模型,解决了传统深度学习模型无法解决的超词库问题。

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