一种基于字符的代码补全方法及系统与流程

文档序号:17396647发布日期:2019-04-13 00:52阅读:351来源:国知局
一种基于字符的代码补全方法及系统与流程

本发明涉及计算机软件工程技术领域,尤其是涉及一种基于字符的代码补全方法及系统。



背景技术:

计算机自动生成代码是近年来软件工程的研究热点之一。代码自动生成极大的减少了程序员的工作量,提高了开发效率。随着开源社区的发展,可以通过分析大量的代码从而进行代码生成。代码自动生成的一大困难在于源代码本身具有诸多的约束和限制。近年来,在原有的基于组合优化方法进行程序综合研究的基础上,产生了一些新的基于机器学习技术进行程序生成的方法。

按照所采取的技术及应用场景的不同,可将当前的程序生成方法分成两类:一类为基于程序输入输出结果的程序生成,一类为基于程序代码语言特性的代码生成。基于输入输出结果的程序综合主要基于机器学习模型,利用程序输入输出结果之间的对应关系构造训练数据集,并利用该数据集对机器学习模型进行训练,以达到在输入输出效果上模拟程序行为的目的。该类方法尤以基于深度神经网络的方法为代表。基于程序设计语言模型的程序生成主要利用程序设计语言自身所具有的的统计特性,通过对已有大量程序代码的学习建立相应程序设计语言的机器学习模型,并基于该模型在已有程序代码的基础上通过自动补全的方式生成新的代码。

lstm(longshort-termmemory)是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。lstm已经在科技领域有了多种应用。基于lstm的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等等任务。

中国发明专利申请号201710687197.4,涉及一种基于长短期记忆网络(lstm)的代码推荐方法,针对现有代码推荐技术普遍存在推荐准确率低、推荐效率低等问题,该发明先将源代码提取成api序列,利用长短期记忆网络构建一个代码推荐模型,学习api调用之间的关系,然后进行代码推荐。并使用了dropout技术防止模型过拟合。同时提出运用relu函数代替传统饱和函数,解决梯度消失问题加快模型收敛速度,提高模型性能,充分发挥神经网络的优势。

然而,上述专利实际上进行的是api推荐,与代码级推荐或者自动补全的目标仍有较大差距。不能实现在任意地点对任意代码的推荐。

绝大多数的程序员在进行软件开发的过程中会使用框架或库api来复用代码。但程序员几乎不可能记住所有的api,因为现有的api数量已经很庞大。因此,代码自动补全机制已经成为现代集成开发环境(integrateddevelopmentenvironment,ide)中的不可或缺的组成部分。据统计,代码补全是开发者最常使用的十个指令之一。代码补全机制在程序员输入代码时会尝试补全程序的剩余部分。智能的代码补全可以通过消除编程时的输入错误和推荐合适的api来加快软件开发过程。



技术实现要素:

为解决以上问题,本发明利用深度学习模型中的循环神经网络(rnn)来构建大规模代码语料库上的语言模型以预测后续的代码。本发明提出了一个受限制的字符级循环神经网络并将其用于在java语言中补全方法调用。

具体的,本发明提供了一种基于字符的代码补全方法,包括:

源代码处理步骤,使用抽象语法树和标识符化工具解析源代码;

模型训练步骤,使用lstm模型训练语言模型;

预测补全步骤,根据训练过的语言模型补全代码。

优选的,在源代码处理步骤中,所述源代码被解析为不同形式,以获得代码的类、方法列表、代码标识符。

优选的,所述lstm模型为串联的lstm模型,所述lstm模型位于rnn模型的隐藏层。

优选的,在预测补全步骤中,将部分代码片段输入已经训练过的语言模型,从而根据上下文输出推荐的代码元素。

优选的,所述方法进一步包括:通过遍历部分程序的抽象语法树提取进行方法调用的对象以及其所属的类。

优选的,所述方法进一步包括:依靠静态分析获取所述类的所有成员方法。

根据本发明的另一个方面,还提供了一种基于字符的代码补全系统,包括顺序连接的如下模块:

源代码处理模块,使用抽象语法树和标识符化工具解析源代码;

模型训练模块,使用lstm模型训练语言模型;

预测补全模块,用于根据训练过的语言模型补全代码。

优选的,所述源代码处理模块将所述源代码解析为不同形式,以获得代码的类、方法列表、代码标识符。

本发明实现了在编程过程中,不仅可以对程序句子进行补全,也可以对单个关键词进行补全。本发明的技术方案具有简单、快速的特点,能够较好地提高代码推荐的准确率和推荐效率。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1为本发明基于字符的代码补全方法流程图。

图2为本发明基于字符的代码补全系统结构图。

具体实施方式

下面将参照附图更详细地描述本发明的示例性实施方式。虽然附图中显示了本发明的示例性实施方式,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。

本发明利用深度学习模型中的循环神经网络(rnn)来构建大规模代码语料库上的语言模型以预测后续的代码。通常,基于神经网络的语言模型接受一个固定大小的词汇表中的单词作为输入,并在输入时将这些单词映射为一个固定维度空间内的向量表示,即通常所说的词向量。词向量通常会作为神经网络第一层的参数,而词汇表越大则意味着神经网络需要的参数越多。不同于自然语言,程序语言中存在大量的用户自定义标识符。这些标识符可能由若干个有意义的单词拼接而成,也可能只是单个无语义的字母。

因此,降低语料库的词汇表规模可能会给模型的性能带来提升。基于这一点,本发明提出了一个受限制的字符级循环神经网络并将其用于在java语言中补全方法调用。

图1为本发明基于字符的代码补全方法流程图,包括如下步骤:

s1、源代码处理步骤,使用抽象语法树和token化工具来解析源代码。在这个步骤中,所述源代码被解析为不同形式,以获得代码的类、方法列表、代码标识符等。

抽象语法树(abstractsyntaxtree或者缩写为ast),或者语法树(syntaxtree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。和抽象语法树相对的是具体语法树(concretesyntaxtree),通常称作分析树(parsetree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦ast被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。

s2、模型训练步骤,使用lstm模型训练语言模型。步骤s1解析后得到的训练语料将被用于基于长短时记忆(longshorttermmemory,lstm)的循环神经网络语言模型。所述lstm模型为串联的lstm模型,所述lstm模型位于rnn模型的隐藏层。

s3、预测补全步骤,根据训练过的语言模型补全代码。在这个步骤中,将部分代码片段输入已经训练过的语言模型,从而根据上下文输出推荐的代码元素。

如图2所示,根据本发明的另一个方面,还提供了一种基于字符的代码补全系统100,包括顺序连接的如下模块:

源代码处理模块110,使用抽象语法树和标识符化工具解析源代码;优选的,所述源代码处理模块将所述源代码解析为不同形式,以获得代码的类、方法列表、代码标识符。

模型训练模块120,使用lstm模型训练语言模型;

预测补全模块130,用于根据训练过的语言模型补全代码。

本发明的工作原理如下:当开始进行逐个字符生成方法名时,本发明将在循环神经网络的生成过程中施加限制。首先,本发明通过遍历部分程序的抽象语法树(ast)提取进行方法调用的对象以及其所属的类。然后本发明依靠静态分析获取这一类的所有成员方法。通过以这一信息作为限制,生成空间被限定在这些可能的方法中。

本发明实现了在编程过程中,不仅可以对程序句子进行补全,也可以对单个关键词进行补全。例如,按照原来的方法,输入import后,可以生成java,再生成io,再生成iostream....;而按照字符补全的方法,可以实现:在输入im后,可以自动补全为import,输入j后,可以自动补全为java,输入ios后,可以自动补全为iostream。

本发明的技术方案具有简单、快速的特点,能够较好地提高代码推荐的准确率和推荐效率。

实验及结果

本发明使用eclipse3.5.2的源代码作为数据集,并关注于standardwidgettoolkit(swt)这一库的api调用。如上文所述,本发明使用带限制的字符级lstm这一模型进行实验,作为输入的部分代码行数的变化范围为1到12行。模型的词汇表大小为97,包含大写字母,小写字母,数字,以及代码中使用的一些其他字符。

为了验证模型是否有效,本发明同时进行了使用不带限制的字符级lstm模型和token级lstm模型作为对照。其中不带限制的字符级lstm模型实验设置与上述实验相同;token级lstm模型中作为输入的部分代码行数包括5,10,15,20,25行,模型的词汇表大小为20798,其他超参数设置与上述实验相同。

模型实现方面,本发明使用了keras,一个基于python语言实现的开源深度学习框架。模型在一块nvidiagtx1080gpu上进行训练,训练过程持续50轮迭代,花费10个小时左右。

本发明测试了对eclipse3.5.2中swt的api进行补全的准确率,并分别测试了top1,top3和top10上的准确率。表1展示了三种代码补全机制,包括一个token级lstm,一个不带限制的字符级lstm和一个带限制的lstm,取得的准确率,召回率和f值。括号中loc(lineofcode)表示模型以这一行数的代码作为输入可以取得最高的准确率。例如,带限制的字符级lstm在使用12行代码作为输入时可以得到最高表现。

表1对eclipse3.5.2中swt的api进行补全的结果

对于77.9%的方法调用,本发明的带限制字符级lstm可以直接生成准确的推荐。对于94.5%的方法调用,正确的方法可以被列在推荐列表的top10中。token级lstm取得的表现则略低,在top1正确预测的准确率降低了8.1%,本发明认为这与其大小达到20798的词汇表相关。与不带限制的字符级模型相比,加入限制后top1正确预测的准确率提升了11%。这一结果显示对于方法补全任务来说,生成空间比词汇表大小影响更大。

需要说明的是:

在此提供的算法和显示不与任何特定计算机、虚拟装置或者其它设备固有相关。各种通用装置也可以与基于在此的示教一起使用。根据上面的描述,构造这类装置所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本发明实施例的虚拟机的创建装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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