一种基于深度语义挖掘的代码段推荐方法转让专利

申请号 : CN201810371788.5

文献号 : CN108717423B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陶传奇包盼盼黄志球周宇王铁鑫

申请人 : 南京航空航天大学

摘要 :

本发明公开了一种基于深度语义挖掘的代码段推荐方法,利用了深度学习技术在自然语言处理中的作用及其在自然语言语义挖掘中的优势,并且结合了有查询代码段推荐的特点。根据输入的自然语言搜索和代码段自身及其所带的注释,深度挖掘自然语言语义和代码段具体功能,生成句向量和段落向量,使得语义属性一致的代码段和自然语言查询因此被映射到相似的向量空间,为给定的查询推荐最匹配的、相似度由高到低排好序的N个代码段。本方法不仅提高了推荐的准确度,还能提高推荐的查全率,并对输入的自然语言查询查询具有较好的容错能力。

权利要求 :

1.一种基于深度语义挖掘的代码段推荐方法,其特征在于,包括如下步骤:

步骤1):构造大规模的带方法描述信息的代码段集S;

步骤2):构造方法描述信息集D1和方法主体集D2,构造注释集合D1’,并利用构造好的数据集训练Encoder-Decoder自然语言句向量生成器模型M1,训练Encoder-Decoder编程语言段落向量生成器模型M2;

步骤3):抽取代码段集S中每个代码段的方法名称Name,并和该代码段映射后向量表示α’构成键值对形式,作为推荐时所用的索引文件;

步骤4):对一个给定的自然语言查询,得到其对应的自然语言句向量,然后在带方法描述信息的代码段集S中对每个查询推荐最匹配的N个排好序的代码段;其中,对一个给定的自然语言查询,使用训练好的Encoder-Decoder自然语言句向量生成器模型M1来计算得到自然语言查询所对应的查询语句句向量β;

以两个向量的夹角cosθ表示两个向量之间的相似度,对给定的自然语言查询计算得到查询语句句向量β和索引文件中各个代码段的映射后向量表示α’的相似度,再根据索引文件推荐与其最相近的N个代码段,并按照相似度由高到低排序。

2.根据权利要求1所述的基于深度语义挖掘的代码段推荐方法,其特征在于,所述步骤

1)具体包括:从开源软件平台获取具体项目,对具体项目中源代码文件按方法为单位进行切割,得到带方法描述信息的代码段集S,每个代码段的名称形式为包名&类名&方法名。

3.根据权利要求2所述的基于深度语义挖掘的代码段推荐方法,其特征在于,所述步骤

1)具体还包括:所述具体项目为Java项目或Android项目。

4.根据权利要求1所述的基于深度语义挖掘的代码段推荐方法,其特征在于,所述步骤

2)具体包括:

21)以方法描述信息集D1为训练集对Encoder-Decoder自然语言句向量生成器模型M1进行训练,收敛到指定状态,完成自然语言句向量生成器的训练;将方法描述信息集D1中每个代码段注释的第一个句子抽取出来作为输入,然后生成自然语言句子向量α1并将其作为对应带注释代码段向量表示的一部分;

22)以方法主体集D2为训练集对Encoder-Decoder编程语言段落向量生成器模型M2进行训练,在训练到指定收敛状态时完成模型训练,并且同时生成每个代码段主体的段向量α2;

23)将自然语言句子向量α1和代码段主体的段向量α2加权相加,得到向量α并将其作为最终能够表征整个带注释代码段的向量,然后将所有向量α的集合和注释集合D1’的自然语言句子向量表示作为训练集来训练神经网络映射模型M3,并在训练完成后经过神经网络映射模型M3的映射将向量α映射得到带注释代码段映射后向量表示α’。

说明书 :

一种基于深度语义挖掘的代码段推荐方法

技术领域

[0001] 本发明属于有查询的代码推荐的技术领域,具体指代一种基于深度语义挖掘的代码段推荐方法。

背景技术

[0002] 在实际的代码编写过程中,开发人员经常会遇到不熟悉的编程任务或者需要实现某些特定的功能,在这样的情况下,开发人员如果能找到已有的类似代码段来学习其使用方法或者是直接复制粘贴然后进行修改完善来进行代码复用,这样一来能够给开发人员节省大量时间、精力以及无意义的重复工作;然而,如何基于开发者实际需求推荐高质量的代码段则是软件复用的重要问题。
[0003] 在实际开发过程中,开发者通常会选择使用搜索引擎来查询需要的代码段。但是由于软件代码具有整体性,代码段中的关键词并不能准确的描述一段代码的功能,所以查询结果通常不能尽如人意。另外,已有的推荐方法通常仅关注代码段本身而忽视其描述信息,而代码段的描述信息最简单直观的用自然语言描述了该代码段的功能。近年来,由于深度学习的广泛应用,语言处理领域也取得了突破性进展,使得对自然语言和编程语言进行深度语义和信息挖掘也能取得很好的效果。所以,将语言处理技术与代码推荐相结合是一种新型有效的推荐方法。

发明内容

[0004] 针对于上述现有技术的不足,本发明的目的在于提供一种基于深度语义挖掘的代码段推荐方法,使用深度学习技术支持面向自然语言查询的代码段推荐;本发明能够根据用户的自然语言搜索和代码段自身所带的注释及代码段本体,深度挖掘自然语言语义和代码段具体功能,使得语义属性一致的带注释代码段和自然语言查询因此被映射到相似的向量空间,为给定的查询推荐最匹配的代码段。
[0005] 为达到上述目的,本发明采用的技术方案如下:
[0006] 本发明的一种基于深度语义挖掘的代码段推荐方法,包括如下步骤:
[0007] 步骤1):构造大规模的带方法描述信息的代码段集S;
[0008] 步骤2):构造方法描述信息集D1和方法主体集D2,构造注释集合D1’,并利用构造好的数据集训练Encoder-Decoder自然语言句向量生成器模型M1,训练Encoder-Decoder编程语言段落向量生成器模型M2;
[0009] 步骤3):抽取代码段集S中每个代码段的方法名称Name,并和该代码段映射后向量表示α’构成键值对形式,作为推荐时所用的索引文件;
[0010] 步骤4):对一个给定的自然语言查询,得到其对应的自然语言句向量,然后在带方法描述信息的代码段集S中对每个查询推荐最匹配的N个排好序的代码段。
[0011] 优选地,所述步骤1)具体包括:从开源软件平台获取具体项目,对具体项目中源代码文件按方法为单位进行切割,得到带方法描述信息的代码段集S,每个代码段的名称形式为包名&类名&方法名;。
[0012] 优选地,所述步骤1)具体还包括:所述具体项目为Java项目、Android项目以及其它项目。
[0013] 优选地,所述步骤2)具体包括:
[0014] 21)以方法描述信息集D1为训练集对Encoder-Decoder自然语言句向量生成器模型M1进行训练,收敛到指定状态,完成自然语言句向量生成器的训练;将方法描述信息集D1中每个代码段注释的第一个句子抽取出来作为输入,然后生成自然语言句子向量α1并将其作为对应带注释代码段向量表示的一部分;
[0015] 22)以方法主体集D2为训练集对Encoder-Decoder编程语言段落向量生成器模型M2进行训练,在训练到指定收敛状态时完成模型训练,并且同时生成每个代码段主体的段向量α2;
[0016] 23)将自然语言句子向量α1和代码段主体的段向量α2加权相加,得到向量α并将其作为最终能够表征整个带注释代码段的向量,然后将所有向量α的集合和注释集合D1’的自然语言句子向量表示作为训练集来训练神经网络映射模型M3,并在训练完成后经过神经网络映射模型M3的映射将向量α映射得到带注释代码段映射后向量表示α’。
[0017] 优选地,所述步骤4)具体包括:
[0018] 41)对于训练好的Encoder-Decoder自然语言句向量生成器模型M1,给定一个自然语言输入计算得到一个指定维度的查询语句句向量β;
[0019] 42)以两个向量的夹角cosθ表示这两个向量之间的相似度,计算映射后向量表示α’和查询语句句向量β之间的相似度值,对给定的自然语言查询推荐与其最相近的N个代码段,并按照相似度由高到低排序。
[0020] 本发明的有益效果:
[0021] 本发明利用深度学习技术在自然语言处理中的作用,以及其在语言语义挖掘中的优势,用于解决如何根据给定的自然语言查询推荐高质量的带注释代码段问题;具有以下优点:
[0022] (1)利用深度学习进行自然语言处理能够真正深入挖掘自然语言语义,而不是仅仅利用文本关键词进行匹配,使得语义相同的语句所对应的句向量在语义空间距离更近,这样就能真正挖掘出查询所要表达的含义,进而使推荐时的匹配更加准确,提高了推荐的准确性。
[0023] (2)利用深度学习对代码段主体进行段落向量化的处理方法能够挖掘代码段结构信息以及在编程语言层次的语义信息,而不仅仅是简单的特征词提取,这样就充分挖掘了代码段主体本身所包含的信息,进而能够改进代码段推荐的效果。
[0024] (3)利用深度语义匹配得到注释语义最相近的N个代码段作为推荐结果,并按照语义相似度由高到低排序,这样即使输入的查询表达不够清晰明了或有些许偏差,也能够在相对较低的位置找到合适的推荐结果,不仅提高了查全率,还有一定的容错能力。

附图说明

[0025] 图1为本发明中生成句子向量和段落向量所使用框架模型示意图。
[0026] 图2为本发明中所使用的Encoder-Decoder模型示意图。
[0027] 图3为本发明中所使用的Encoder-Decoder模型中的基本单元示意图。
[0028] 图4为本发明的原理图。

具体实施方式

[0029] 为了便于本领域技术人员的理解,下面结合实施例与附图对本发明作进一步的说明,实施方式提及的内容并非对本发明的限定。
[0030] 下面结合附图1-图4以Java代码段推荐为例对发明的技术方案进行详细说明:
[0031] 步骤1:构造大规模的带方法描述信息的代码段集S;其中,
[0032] 11)在开源的软件平台(比如GitHub)上获取Java项目,对项目中Java文件按照方法为单位进行切割,得到带有方法描述信息的方法,写入包名&类名&方法名为文件名的文件中。
[0033] 12)对初步得到的带方法描述信息的代码段集S进行筛选,将劣质(比如没有方法描述信息)或无用(比如测试方法)代码段删除,得到精简后的高质量的S集合。
[0034] 步骤2:构造方法描述信息集D1和训练编程语言段落向量所使用的方法主体集D2;
[0035] 抽取所有方法的描述信息,得到训练自然语言句向量所使用的方法描述信息集D1,抽取方法描述信息的第一句得到注释集合D1’,抽取所有方法的代码段本体,得到训练代码段的段向量所使用的方法主体集D2。
[0036] 步骤3:构造并训练自然语言句子向量生成器和编程语言段落向量生成器,并得到带注释代码段的向量表示α,然后通过训练好的神经网络映射模型将向量α映射得到向量α’;其中,
[0037] 31)自然语言的句向量生成器以方法描述信息集D1为训练集,然后对Encoder-Decoder自然语言句向量生成器模型M1进行训练直至收敛到指定状态,完成自然语言句向量生成器的训练;将方法描述信息集D1中每个代码段注释的第一个句子抽取出来作为M1的输入,生成自然语言句子向量α1并将其作为对应带注释代码段向量表示的一部分;
[0038] 32)编程语言的段落向量生成器以方法主体集D2为输入对Encoder-Decoder编程语言段落向量生成器模型M2进行训练,在训练到指定收敛状态的时训练完成,并在训练过程中生成每个代码段主体的段向量α2;
[0039] 33)将自然语言句子向量α1和代码段主体的段向量α2加权相加,得到向量α,并将其作为最终能够表征整个带注释代码段的向量,然后将每个带注释代码段所对应的α与该带注释代码段所对应注释的向量表示作为训练集,训练神经网络映射模型M3,并在训练完成后经过映射模型的映射将α映射得到映射后向量表示α’,该向量可以表征带注释代码段的语义向量α在自然语言语义空间的向量表示。
[0040] 步骤4:从带方法描述信息的代码段集S中抽取每个代码段的方法名称Name,也就是包名&类名&方法名的形式,并和该代码段的映射后向量表示α’构成键值对的形式,作为推荐时所用的索引文件。
[0041] 步骤5:对一个给定的自然语言查询,得到其对应的自然语言句向量,然后在带方法描述信息的代码段集S中对每个查询推荐最匹配的N个排好序的代码段;其中,
[0042] 51)对一个给定的自然语言查询,使用训练好的Encoder-Decoder自然语言句向量生成器模型M1来计算得到自然语言查询所对应的查询语句句向量β;
[0043] 52)以两个向量的夹角cosθ表示两个向量之间的相似度,对给定的自然语言查询计算得到查询语句句向量β和索引文件中各个代码段的映射后向量表示α’的相似度,再根据索引文件推荐与其最相近的N个代码段,并按照相似度由高到低排序。
[0044] 实施例:
[0045] 首先对开源的软件平台GitHub上获取的Java项目进行切割,得到一个个的带注释的代码段,并将其写入文件。以项目assertj-core-master为例,切割后得到“main.java.org.assertj.core.internal.Strings.java&Strings&doCommonCheckForCharSequence.java”、“main.java.org.assertj.core.util.diff.Delta.java&Delta&Delta.java”……,单个代码段形式如下:
[0046]
[0047] 在项目assertj-core-master中共得到35个具有独立功能的、高质量的代码段。
[0048] 数据集处理完成之后,进一步得到代码段的注释集D1’,D1’中注释语句为“Remove the first instance of a value if found in the list and replaces it with the last item”、“get file content”、“......”。方法描述信息集D1,D1中的描述语句为:
[0049] “Remove the first instance of a value if found in the list and replaces it with the last item in the list.This saves a copy down of all items at the expense of not preserving list order.”“......”之类,以及代码段方法主体集D2。
[0050] 所有模型训练完成之后,对任意自然语言查询可得到其对应的句子向量,以及带注释代码段的自然语言句子向量α1和每个代码段主体的段向量α2,并相加计算得到最终的α作为带注释代码段的向量表示,在如上代码段示例中:
[0051] α=[0.0501139,0.0799258,0.0690878,......]
[0052] 在映射模型转换之后为:
[0053] α’=[0.1001695,0.060278,0.0700396,......]
[0054] 输入查询语句y=(y1,y2,...,yt),具体为“remove the first instance of a list”,则在经过模型处理之后得到y对应的指定维度的句向量(“remove the first instance of a list”=[0.0703125,0.0869141,0.0878906,......])。
[0055] 数据集S中N个带注释的代码段的索引文件为,......,,具体如<“Remove the first instance of a value if found in the list and replaces it with the last item in the list”,M1>......<“Input and output of a file”,Mk>......,有cosθ(y,αi’)的值分别为0.0054、0.062、0.785......这样的数值,并且为S中最小的N个,且cosθ(y,α’1)
[0056] 1:
[0057] 2:<……,……>
[0058] ...
[0059] N:<……,……>
[0060] 这里的N个排好序的代码段在实际推荐时是索引,也就是代码段对应的链接,表现为S中的包名&类名&方法名的形式,当用户想要查看某个具体的代码段时,只需要点击即可查看真正的源码代码段,这样设计是基于用户舒适度和美观性的考虑。
[0061] 本发明具体应用途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进,这些改进也应视为本发明的保护范围。