CN109522011A - 一种基于编程现场上下文深度感知的代码行推荐方法 - Google Patents
一种基于编程现场上下文深度感知的代码行推荐方法 Download PDFInfo
- Publication number
- CN109522011A CN109522011A CN201811206811.1A CN201811206811A CN109522011A CN 109522011 A CN109522011 A CN 109522011A CN 201811206811 A CN201811206811 A CN 201811206811A CN 109522011 A CN109522011 A CN 109522011A
- Authority
- CN
- China
- Prior art keywords
- code
- code line
- name
- programming
- context
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/33—Intelligent editors
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于编程现场上下文深度感知的代码行推荐方法,利用了深度学习技术在编程语言处理中的作用及其在上下文隐含模式感知中的优势。基于已有的海量源码数据,利用深度学习析取代码行的相关上下文因子,挖掘隐含上下文信息,为精准推荐提供基础。利用编程现场已有的源码数据和任务数据对当前代码行进行预测,并推荐最准确的、由高到低排好序的N个代码行。本方法不仅能够推荐准确度较高的代码行,还具有较好的自动性,不需要手动输入查询,实现自动检测已有的代码行上文。
Description
技术领域
本发明属于无查询的代码推荐的技术领域,具体涉及一种基于编程现场上下文深度感知的代码行推荐方法。
背景技术
由于人们对于软件的功能需求日益丰富,软件的规模越来越大,结构日益复杂。在这样的情况下,程序开发人员很可能遇到一些软件编写困难的情况,比如某些不常见的功能如何实现。此时,如果开发人员能够获得当前代码行的可能情况,就能进行参考、改进或直接复用。这样就能够给开发人员节省大量时间和精力。在软件开发过程中,开发者通常会选择搜索引擎查询需要的代码。但是利用搜索引擎搜索通常需要确切的功能性描述,而对一个单一代码行而言并不具备一个完整功能。
在软件开发的编程现场,有大量与当前开发任务相关的信息,比如代码上下文信息、用户开发意图等。因此,在开发过程中,如果开发人员能够充分利用编程现场的已有信息,对提高程序编写的准确率和效率会有很大的帮助。近年来,由于深度学习的广泛应用,语言处理领域也取得了突破性进展,使得对编程语言进行代码行上下文隐含模式挖掘也能取得很好的效果。所以,将深度学习技术与编程现场相结合进行代码推荐是一种新型有效的推荐方法。
发明内容
针对于上述现有技术的不足,本发明的目的在于提供一种基于编程现场上下文深度感知的代码行推荐方法,使用深度学习技术和编程现场信息支持面向无查询的代码行推荐;本发明能够根据已有的海量源码数据,利用深度学习析取代码行的相关上下文因子,挖掘隐含上下文信息;然后,利用编程现场抽取的任务数据和源码数据,推荐最匹配的代码行。
为达到上述目的,本发明采用的技术方案如下:
本发明的一种基于编程现场上下文深度感知的代码行推荐方法,包括如下步骤:
步骤1):对收集到的代码进行统一化处理,处理完成后得到代码段集S1;
步骤2):抽取代码段集S1中每个代码段的类名、方法名和注释信息,以类名#方法名#注释信息的形式保存在磁盘中,得到数据集D1;
步骤3):利用代码段集S1中每个方法块,构建训练数据集S2;
步骤4):以训练数据集S2中每个代码行上下文实例作为输入和输出,训练得到Encoder-Decoder代码行生成器模型M;
步骤5):根据实时采集到的编程现场数据,利用模型M预测得到根据优先级排好序的N个推荐结果。
进一步地,所述步骤1)具体包括:
11)从开源软件平台获取具体项目,所述具体项目为Java项目或Android项目,对具体项目中源代码文件以方法为单位进行切割,得到代码段集S1,每个代码段的名称形式为类名&方法名。
进一步地,所述步骤1)具体还包括:
12)为Java项目时,对于同一个类的不同对象,用对应类的类型替换所有的对象类型,用类名的小写形式替换不同的对象名;
13)为Java项目时,对于基本数据类型,即byte、short、int、long、float、double、char和boolean,对其变量名和值都进行统一化处理。
进一步地,所述步骤5)具体包括:
51)采集开发人员已键入的代码行上文,并按照上述步骤12和13中统一化规则进行处理,并将其作为模型输入,利用训练好的模型M预测最可能的当前N个代码行;
52)采集用户当前的任务数据,包括类名、方法名及注释信息,以获取开发人员当前可能的开发意图,并以类名#方法名#注释信息的格式保存;
53)利用已有的类名#方法名#注释信息和数据集D1中的数据进行相似度比较,若存在相似度高于指定阈值的代码段,且该代码段中含有推荐结果中优先级为k的推荐结果,则将该推荐结果重新排序为第一优先级结果,相似度越高,优先级越高。
进一步地,所述步骤53)中的相似度比较使用LSA潜在语义分析。
进一步地,所述步骤3)具体包括:
31)对代码段集S1中每个方法块,忽略其第一行的方法声明,从第n+1行开始,以前n行为代码行上文、第n+1行为代码行下文,n≥1,且为变量参数,构建一个代码行上下文实例;依次向下直至方法块最后一行,构建训练数据集S2。
本发明的有益效果:
本发明利用深度学习技术在语言处理中的作用,以及其在隐含上下文信息挖掘中的优势,用于解决如何根据已有的编程现场数据推荐高质量的代码行问题,具有以下优点:
(1)利用深度学习能够真正析取代码行的相关上下文因子,挖掘隐含上下文信息,为精准推荐提供基础,而不是仅仅利用文本关键词进行匹配,提高了推荐的准确性。
(2)利用编程现场任务数据捕捉开发者意图,并利用语义相似度匹配对推荐结果进行优先级调整,更好地对推荐结果进行排序,使得开发人员需要的推荐项在n个推荐结果中更加靠前的位置。
附图说明
图1为本发明的整体结构图。
图2为本发明中所使用的Encoder-Decoder模型应用于代码行的示例图。
图3为本发明中所使用编程现场数据处理模块结构图。
图4为本发明的流程图。
具体实施方式
为了便于本领域技术人员的理解,下面结合实施例与附图对本发明作进一步的说明,实施方式提及的内容并非对本发明的限定。
下面结合附图1-图4以Java代码段推荐为例对发明的技术方案进行详细说明:
步骤1:构造大规模的、每个代码段具有独立完整功能的代码段集S’;其中,
11)在开源的软件平台(比如GitHub)上获取Java项目,对项目中Java文件按照方法为单位进行切割,写入类名&方法名为文件名的文件中;
12)对初步得到的带方法描述信息的代码段集S进行筛选,将劣质(比如没有完整功能)或无用(比如测试方法)代码段删除,得到精简的代码段集S’。
步骤2:对代码段集S’进行统一化处理,处理完成之后得到代码段集S1;其中,
21)以Java为例;对于同一个类的不同对象,用对应类的类型替换所有的对象类型,用类名的小写形式替换不同的对象名;
22)对于基本数据类型,即byte、short、int、long、float、double、char和boolean,对其变量名和值进行统一化处理得到代码段集S1,具体规则见表1,其为Java基本数据类型的统一化处理规则,如下:
表1
步骤3:抽取代码段数据集S1中每个代码段的类名、方法名和注释信息,以类名#方法名注释信息的形式保存在磁盘中,得到数据集D1;
步骤4:对代码段数据集S1中每个方法块,忽略其第一行的方法声明,从第n+1行开始,以前n行为代码行上文、第n+1行为代码行下文,n≥1,且为变量参数;构建一个代码行上下文实例,依次向下直至方法块最后一行(忽略无意义代码行及符号),构建训练数据集S2;
步骤5:以练数据集S2中每个代码行上下文实例作为输入和输出,训练得到Encoder-Decoder代码行生成器模型M;
步骤6:根据实时采集到的编程现场数据,利用模型M预测得到根据优先级排好序的N个推荐结果,根据采集到的当前任务数据对推荐结果的优先级进行二次排序。其中,
61)采集开发人员已经键入的代码行上文,并按照前述步骤中21和22中统一化规则进行处理;并将其作为模型输入,利用训练好的模型M预测最可能的当前N个代码行;
62)采集用户当前的任务数据,以获取开发人员当前可能的开发意图,主要包括类名、方法名以及注释信息,以类名#方法名#注释信息的格式保存;
63)利用已有的类名#方法名#注释信息和数据集D1中数据进行相似度比较,如果有相似度高于指定阈值(根据经验0.7-0.8较为合适)的代码段,并且该代码段中含有推荐结果中优先级为k的推荐结果,则将该推荐结果重新排序为第一优先级结果,相似度越高,优先级越高;
64)相似度衡量使用LSA潜在语义分析。
实施例:
首先对开源的软件平台GitHub上获取的Java项目进行切割,得到具有独立完整功能的代码段,并将其写入文件。以项目ASTGeneration为例,切割后得到单个代码段形式如下:
在利用上述步骤2所述的对象处理方法以及表1给出的基本数据类型的处理方式对源码进行处理之后,得到具有统一化格式的代码段集S1。
抽取代码段集S1中每个代码段的类名、方法名和注释信息,以类名#方法名注释信息的形式保存在磁盘中,得到数据集D1。
从上述代码段集S1中获取已经处理完成、具有同一格式的每个方法块,忽略其第一行的方法声明,从第n+1行开始,以前n行为代码行上文、第n+1行为代码行下文,构建一个代码行上下文实例。依次向下直至方法块最后一行。取代码行上文数n为3,从上述getMostList方法构建训练实例数据集S2,实例如下:
1:<int int_type=1int int_type=1for int int_type=1int_type<list<integer>.size()int_type++,if int_type<list<integer>.get(int_type)>
2:<int int_type=1for int int_type=1int_type<list<integer>.size()int_type++if int_type<list<integer>.get(int_type),int_type=list<integer>.get(int_type)>
3:<for int int_type=1int_type<list<integer>.size()int_type++if int_type<list<integer>.get(int_type)int_type=list<integer>.get(int_type),int_type=int_type>
4:<int_type<list<integer>.size()int_type++if int_type<list<integer>.get(int_type)int_type=list<integer>.get(int_type)int_type=int_type,returnint_type>
实例数据集构建完成后,以一对代码行上下文分别作为输入和输出训练编码器—解码器模型,即Encoder-Decoder代码行生成器模型M。
推荐阶段,首先利用开发现场数据采集模块(其结构如图3)的采集器采集源代码数据,即开发人员已经键入的代码行上文,现场数据清洗模块按照前述步骤中统一化规则对其进行处理。处理完成后如下:
String string=list<string>.get(int_type)
if(string.equals("stringValue"))
将其作为模型输入,利用训练好的模型预测最可能的当前N个代码行。为了得到N个优先级最高的代码行,具体使用的算法是集束搜索。为了方便表示,这里指定推荐代码行数目N为2,如下所示:
1、continue
2、string=string+string.trim()+"stringValue"
推荐代码行优先级调整阶段,利用开发现场数据采集模块(结构如图3)的采集器实时捕获用户当前的软件任务数据,获取开发人员当前可能的开发意图,主要包括类名、方法名以及注释信息,现场数据组织管理模块处理之后以类名#方法名#注释信息的格式将其保存。将其和已有的数据集D1中的类名#方法名#注释信息数据进行相似度比较,如果存在相似度高于阈值为0.7的代码段,并且该代码段中含有推荐结果中优先级为k的推荐结果,则将该推荐结果重新排序为第一优先级结果,相似度越高,优先级越高。相似度衡量使用LSA潜在语义分析。重排后推荐结果被最终推荐给用户。如下:
1、string=string+string.trim()+"stringValue"
2、continue
此外,为了不断的对代码行生成器模型M进行优化,会将用户对推荐结果的接受情况进行收集,用户成功采纳的代码行连同其对应上文会以个人数据的形式添加到数据库中,为定期改进模型M提供数据支撑。
本发明具体应用途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进,这些改进也应视为本发明的保护范围。
Claims (6)
1.一种基于编程现场上下文深度感知的代码行推荐方法,其特征在于,包括如下步骤:
步骤1):对收集到的代码进行统一化处理,处理完成后得到代码段集S1;
步骤2):抽取代码段集S1中每个代码段的类名、方法名和注释信息,以类名#方法名#注释信息的形式保存在磁盘中,得到数据集D1;
步骤3):利用代码段集S1中每个方法块,构建训练数据集S2;
步骤4):以训练数据集S2中每个代码行上下文实例作为输入和输出,训练得到Encoder-Decoder代码行生成器模型M;
步骤5):根据实时采集到的编程现场数据,利用模型M预测得到根据优先级排好序的N个推荐结果。
2.根据权利要求1所述的基于编程现场上下文深度感知的代码行推荐方法,其特征在于,所述步骤1)具体包括:
11)从开源软件平台获取具体项目,所述具体项目为Java项目或Android项目,对具体项目中源代码文件以方法为单位进行切割,得到代码段集S1,每个代码段的名称形式为类名&方法名。
3.根据权利要求2所述的基于编程现场上下文深度感知的代码行推荐方法,其特征在于,所述步骤1)具体包括:
12)为Java项目时,对于同一个类的不同对象,用对应类的类型替换所有的对象类型,用类名的小写形式替换不同的对象名;
13)为Java项目时,对于基本数据类型,即byte、short、int、long、float、double、char和boolean,对其变量名和值都进行统一化处理。
4.根据权利要求3所述的基于编程现场上下文深度感知的代码行推荐方法,其特征在于,所述步骤5)具体包括:
51)采集开发人员已键入的代码行上文,并按照上述步骤12和13中统一化规则进行处理,并将其作为模型输入,利用训练好的模型M预测最可能的当前N个代码行;
52)采集用户当前的任务数据,包括类名、方法名及注释信息,以获取开发人员当前可能的开发意图,并以类名#方法名#注释信息的格式保存;
53)利用已有的类名#方法名#注释信息和数据集D1中的数据进行相似度比较,若存在相似度高于指定阈值的代码段,且该代码段中含有推荐结果中优先级为k的推荐结果,则将该推荐结果重新排序为第一优先级结果,相似度越高,优先级越高。
5.根据权利要求4所述的基于编程现场上下文深度感知的代码行推荐方法,其特征在于,所述步骤53)中的相似度比较使用LSA潜在语义分析。
6.根据权利要求1所述的基于编程现场上下文深度感知的代码行推荐方法,其特征在于,所述步骤3)具体包括:
31)对代码段集S1中每个方法块,忽略其第一行的方法声明,从第n+1行开始,以前n行为代码行上文、第n+1行为代码行下文,n≥1,且为变量参数,构建一个代码行上下文实例;依次向下直至方法块最后一行,构建训练数据集S2。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811206811.1A CN109522011B (zh) | 2018-10-17 | 2018-10-17 | 一种基于编程现场上下文深度感知的代码行推荐方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811206811.1A CN109522011B (zh) | 2018-10-17 | 2018-10-17 | 一种基于编程现场上下文深度感知的代码行推荐方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109522011A true CN109522011A (zh) | 2019-03-26 |
CN109522011B CN109522011B (zh) | 2021-05-25 |
Family
ID=65772517
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811206811.1A Active CN109522011B (zh) | 2018-10-17 | 2018-10-17 | 一种基于编程现场上下文深度感知的代码行推荐方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109522011B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111459491A (zh) * | 2020-03-17 | 2020-07-28 | 南京航空航天大学 | 一种基于树形神经网络的代码推荐方法 |
CN111831259A (zh) * | 2020-04-15 | 2020-10-27 | 中国人民解放军军事科学院战争研究院 | 一种引导式的智能处理定制方法 |
CN111857660A (zh) * | 2020-07-06 | 2020-10-30 | 南京航空航天大学 | 一种基于查询语句的情境感知api推荐方法及终端 |
CN111966818A (zh) * | 2020-07-26 | 2020-11-20 | 复旦大学 | 一种基于深度学习的交互式api代码片段推荐方法 |
CN112114791A (zh) * | 2020-09-08 | 2020-12-22 | 南京航空航天大学 | 一种基于元学习的代码自适应生成方法 |
CN112114795A (zh) * | 2020-09-18 | 2020-12-22 | 北京航空航天大学 | 开源社区中辅助工具停用的预测方法及装置 |
CN112115362A (zh) * | 2020-09-21 | 2020-12-22 | 中山大学 | 一种基于相似代码识别的编程信息推荐方法及装置 |
CN112667286A (zh) * | 2020-12-24 | 2021-04-16 | 南京航空航天大学 | 一种基于编程现场环境上下文的搜索方法 |
CN113761162A (zh) * | 2021-08-18 | 2021-12-07 | 浙江大学 | 一种基于上下文感知的代码搜索方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107506414A (zh) * | 2017-08-11 | 2017-12-22 | 武汉大学 | 一种基于长短期记忆网络的代码推荐方法 |
CN107832047A (zh) * | 2017-11-27 | 2018-03-23 | 北京理工大学 | 一种基于lstm的非api函数实参推荐方法 |
CN108388425A (zh) * | 2018-03-20 | 2018-08-10 | 北京大学 | 一种基于lstm自动补全代码的方法 |
US10528607B2 (en) * | 2016-07-29 | 2020-01-07 | Splunk Inc. | Syntax templates for coding |
-
2018
- 2018-10-17 CN CN201811206811.1A patent/CN109522011B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10528607B2 (en) * | 2016-07-29 | 2020-01-07 | Splunk Inc. | Syntax templates for coding |
CN107506414A (zh) * | 2017-08-11 | 2017-12-22 | 武汉大学 | 一种基于长短期记忆网络的代码推荐方法 |
CN107832047A (zh) * | 2017-11-27 | 2018-03-23 | 北京理工大学 | 一种基于lstm的非api函数实参推荐方法 |
CN108388425A (zh) * | 2018-03-20 | 2018-08-10 | 北京大学 | 一种基于lstm自动补全代码的方法 |
Non-Patent Citations (1)
Title |
---|
郭昱慧: "基于模型的BP网络辨识算法代码快速生成", 《电子设计工程》 * |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111459491A (zh) * | 2020-03-17 | 2020-07-28 | 南京航空航天大学 | 一种基于树形神经网络的代码推荐方法 |
CN111459491B (zh) * | 2020-03-17 | 2021-11-05 | 南京航空航天大学 | 一种基于树形神经网络的代码推荐方法 |
CN111831259A (zh) * | 2020-04-15 | 2020-10-27 | 中国人民解放军军事科学院战争研究院 | 一种引导式的智能处理定制方法 |
CN111857660A (zh) * | 2020-07-06 | 2020-10-30 | 南京航空航天大学 | 一种基于查询语句的情境感知api推荐方法及终端 |
CN111966818A (zh) * | 2020-07-26 | 2020-11-20 | 复旦大学 | 一种基于深度学习的交互式api代码片段推荐方法 |
CN111966818B (zh) * | 2020-07-26 | 2024-03-08 | 复旦大学 | 一种基于深度学习的交互式api代码片段推荐方法 |
CN112114791A (zh) * | 2020-09-08 | 2020-12-22 | 南京航空航天大学 | 一种基于元学习的代码自适应生成方法 |
CN112114791B (zh) * | 2020-09-08 | 2022-03-25 | 南京航空航天大学 | 一种基于元学习的代码自适应生成方法 |
CN112114795B (zh) * | 2020-09-18 | 2022-02-11 | 北京航空航天大学 | 开源社区中辅助工具停用的预测方法及装置 |
CN112114795A (zh) * | 2020-09-18 | 2020-12-22 | 北京航空航天大学 | 开源社区中辅助工具停用的预测方法及装置 |
CN112115362A (zh) * | 2020-09-21 | 2020-12-22 | 中山大学 | 一种基于相似代码识别的编程信息推荐方法及装置 |
CN112115362B (zh) * | 2020-09-21 | 2022-01-11 | 中山大学 | 一种基于相似代码识别的编程信息推荐方法及装置 |
CN112667286A (zh) * | 2020-12-24 | 2021-04-16 | 南京航空航天大学 | 一种基于编程现场环境上下文的搜索方法 |
CN113761162A (zh) * | 2021-08-18 | 2021-12-07 | 浙江大学 | 一种基于上下文感知的代码搜索方法 |
CN113761162B (zh) * | 2021-08-18 | 2023-12-05 | 浙江大学 | 一种基于上下文感知的代码搜索方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109522011B (zh) | 2021-05-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109522011A (zh) | 一种基于编程现场上下文深度感知的代码行推荐方法 | |
CN109492077B (zh) | 基于知识图谱的石化领域问答方法及系统 | |
CN106649260B (zh) | 基于评论文本挖掘的产品特征结构树构建方法 | |
CN103491205B (zh) | 一种基于视频搜索的关联资源地址的推送方法和装置 | |
CN110298033A (zh) | 关键词语料标注训练提取工具 | |
CN108121829A (zh) | 面向软件缺陷的领域知识图谱自动化构建方法 | |
CN105159715A (zh) | 一种基于抽象语法树节点变更抽取的Python代码变更提示方法 | |
CN106537370A (zh) | 在存在来源和翻译错误的情况下对命名实体鲁棒标记的方法和系统 | |
CN103729402A (zh) | 一种基于图书目录的知识图谱的构建方法 | |
CN103077164A (zh) | 文本分析方法及文本分析器 | |
CN112051986B (zh) | 基于开源知识的代码搜索推荐装置及方法 | |
CN102053974A (zh) | 一种汉字输入方法和装置 | |
CN109492106A (zh) | 一种文本代码相结合的缺陷原因自动分类方法 | |
CN106503256B (zh) | 一种基于社交网络文档的热点信息挖掘方法 | |
CN105550169A (zh) | 一种基于字符长度识别兴趣点名称的方法和装置 | |
CN106649557A (zh) | 一种缺陷报告与邮件列表语义关联挖掘方法 | |
CN105718585A (zh) | 文档与标签词语义关联方法及其装置 | |
CN103678499A (zh) | 一种基于多源异构专利数据语义集成的数据挖掘方法 | |
CN102737045B (zh) | 一种相关度计算方法和装置 | |
CN104346382A (zh) | 使用语言查询的文本分析系统和方法 | |
CN105404677A (zh) | 一种基于树形结构的检索方法 | |
CN109446277A (zh) | 基于中文自然语言的关系型数据智能搜索方法及系统 | |
CN111008285B (zh) | 一种基于论文关键属性网络的作者消歧方法 | |
CN112905746A (zh) | 一种基于知识图谱技术的制度档案知识挖掘处理方法 | |
CN105138708A (zh) | 一种兴趣点名称的识别方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |