一种基于细粒度注意力对齐的多模态代码搜索方法

xiaoxiao1天前  4


本发明涉及一种基于细粒度注意力对齐的多模态代码搜索方法,属于软件工程。


背景技术:

1、软件工程是指在开发、维护和管理软件系统的过程中,应用工程学原理、技术和方法来规划、设计、构建、测试和维护软件的学科领域。软件工程旨在提高软件开发的效率、质量和可靠性,以满足用户的需求。在现代社会中,软件系统已经被应用于各个领域。在不同的软件系统中可能存在相似的功能,这意味着它们的实现代码是相似的。随着过去几年软件行业的快速发展,全球源代码数量达到前所未有的水平。显然,软件行业已经进入了大数据时代,代码重用也越来越重要。代码搜索作为软件工程技术领域的一项关键任务,其目的是快速而有效地找到与编程语义和开发人员在自然语言查询中所表达的意图相匹配的代码片段。

2、目前的研究表明,代码搜索主要利用信息检索或深度学习。现存的研究方法存在信息提取利用不完全、特征维度考虑不周等问题,这样的信息缺失对于代码搜索的结果会造成较大影响。代码和查询本身所使用的结构和语法具有较大差异,这意味着两者之间并不能直接或完全对齐;科学技术的快速进步使得代码量呈指数增长。综上,实现高效代码搜索的关键挑战在于:查询和代码的异构性、嵌入式空间的统一表示和代码数据库的爆炸性增长。


技术实现思路

1、发明目的:针对现有技术中存在的问题与不足,本发明提供一种基于细粒度注意力对齐的多模态代码搜索方法,能够在庞大代码数据库中较高效快速地提取利用代码的多模态信息并充分对齐,使得模型达到较好的搜索效果。本发明所提的基于细粒度注意力对齐的多模态代码搜索方法能够针对代码本身的不同模态特点设计不同的特征表示方法,使得表示更加精确,进而对查询和代码的匹配效果较好。

2、技术方案:一种基于细粒度注意力对齐的多模态代码搜索方法,本发明提出细粒度网络对代码和查询的文本和结构特征采用不同的特征表示方式,同时考虑到特征差异性,采用细粒度对齐机制对不同模态特征进行融合处理。所述方法包括如下步骤:

3、步骤1:从由代码和注释组成的代码库中选择代码片段。对代码和查询进行预处理,提取相应的文本和结构表示。

4、步骤2:对于代码和查询的文本特征,采用多头注意机制进行表示;对于代码的结构特征,在抽象语法树的基础上添加一些数据流,形成更详细的图结构;对于查询的结构特征,采用选区解析树来表示,并加上nexttoken边表示其语序。

5、步骤3:分别对齐代码和查询的文本和结构两种模态特征表示,计算不同模态特征之间的细粒度相关性,以增强代码和查询的特性。

6、步骤4:对于得到的不同模态特征分别进行连接获得代码和查询的最终表示,使用交叉熵进行优化,进而通过步骤5进行代码和查询的匹配。

7、步骤5:将步骤4中经过交叉熵优化的特征作为最终的代码和查询的特征表示,根据所有代码片段与相应查询的余弦相似度对所有代码片段进行排序。基于余弦相似度的大小,该方法最后通过排序得出对应于查询的推荐代码列表。

8、所述步骤1中,对于在规范化代码数据库中选取的代码片段,对其代码的文本和结构信息进行预处理和简单提取。一般来说,所有规范的代码片段的代码文本可以分为三个部分:方法名称、api序列和其他标记。从方法名的命名规范中可以看出,方法名在面向对象编程中起着重要的作用,可以准确地反映方法的功能和行为。为了降低方法处理的复杂性,创新地使用了一种新的提取方法,即代码文本只提取方法名作为特征而不是使用所有代码文本,并对提取的包含特定符号(如_)的令牌执行分词操作。代码的结构信息主要是使用工具提取其对应的抽象语法树。

9、所述步骤2中,使用多头注意力来表示代码和查询的文本信息。多头注意机制基于自注意机制,且广泛应用于自然语言处理。transformer中的自注意机制公式可表达为:

10、

11、其中,是用于校正梯度的比例因子,q、k和v表示查询、键和值。

12、多头注意力机制是重复上述自注意机制过程h次,然后组合输出:

13、mutihead(q,k,v)=concat(head1,...,headh)wmodel

14、where headi=attention(qwiq,kwik,vwiv)

15、其中,是注意力机制的权重矩阵,是模型的计算参数,dmodel是wmodel对应的矩阵维度,h是头数。通过多头注意机制,可以学习基于同一注意机制的文本字词间的关系,然后将它们作为知识结合起来,以捕获序列内不同范围内的短期和长期依赖关系。

16、使用双向门控图神经网络来构建代码和查询的结构图表示。结构图属于异构图,是由不同类型的实体和关系组成的图,分别表示为节点和边。与传统的同构图相比,异构图提供了节点和边的附加类型信息,这样的特性可以有助于表示抽象语法树以及选区解析树中所包含的不同节点和关系。对于结构图中的每个节点,应用一个sum聚合函数,它以一组传入(或传出)的相邻节点向量作为输入,并输出一个后向(或前向)聚合向量,其计算公式如下:

17、

18、

19、其中,表示第u个邻接点的特征向量,和表示前向和后向的所有邻接点。

20、从前向和后向融合节点嵌入:

21、

22、这个fuse函数计算的是两个输入的门控和,最后将结果提供给门控循环单元(gated recurrent unit,gru)来更新节点表示:

23、

24、经过k跳计算,得到最终的节点表示然后在所有节点上应用最大池化,得到最终的图表示:

25、

26、其中maxpool表示最大池化层,fc表示全连接层。

27、所述步骤3中,利用步骤2所得到的代码和查询的两种模态特征进行细粒度对齐处理。主要步骤是将结构特征和文本特征分别对齐,从而完全解决匹配中特征异质性造成的误差。使用共同注意机制对输入序列进行加权,使模型能够关注不同程度的信息。这种机制的关键思想是探索每个代码和查询的同一模态特征之间更细粒度的语义相关性,以便分别丰富它们的表示。

28、就文本特征而言,计算过程如下:

29、attention=codetokent·querytoken

30、其中和分别表示代码和查询的文本嵌入表示,m和n表示矩阵的维数。经过如上计算后,attention矩阵的行列分别表示代码和查询的相关信息。

31、使用softmax函数分别对行列进行归一化:

32、αcode=softmax(attention)

33、αquery=softmax(attentiont)

34、归一化之后得到的αcode和αquery是代码和查询分别对应的权重系数,利用得到的权重系数进行点积计算获得新的最终文本特征表示:

35、new_querytoken=αquery·querytoken

36、new_codetoken=αcode·codetoken

37、就结构特征而言,计算过程如下:

38、attention=codestructuret·querystructure

39、其中和分别表示代码和查询的结构嵌入表示,m和n表示矩阵的维数。经过如上计算后,attention矩阵的行列分别表示代码和查询的相关信息。

40、使用softmax函数分别对行列进行归一化:

41、αcode=softmax(attention)

42、αquery=softmax(attentiont)

43、归一化之后得到的αcode和αquery是代码和查询分别对应的权重系数,利用得到的权重系数进行点积计算获得新的最终结构特征表示:

44、new_querystructure=αquery·querystructure

45、new_codestructure=αcode·codestructure

46、所述步骤4中,将查询的文本特征和结构特征生成一个联合特征表示queryfusion,将代码的文本特征和结构特征生成一个联合特征表示codefusion,并采用交叉熵作为损失函数对联合特征表示进行优化:

47、

48、其中,ci表示目标代码特征表示,cj表示其他干扰代码特征表示且i≠j,qi表示目标查询特征表示,log的底数是e。损失函数的主要目的是最小化qi与其对应代码ci之间的内积,同时最大化qi和其他干扰代码cj之间的内积。

49、损失函数的主要目的是最小化qi与其对应代码ci之间的内积,同时最大化qi和其他干扰代码cj之间的内积。

50、步骤5针对步骤4中所得的经过交叉熵优化后的代码和查询的最终联合特征表示对所有代码片段进行匹配排序。采用余弦相似度作为匹配指标,其计算公式如下:

51、

52、余弦相似度的分数值越高,即说明该代码片段与对应的查询越匹配,在返回的列表中排名越靠前。

53、有益效果:与现有技术相比,本发明提供的基于细粒度注意力对齐的多模态代码搜索方法,具有如下优点:

54、(1)所提出的用于代码搜索的细粒度共同注意力多模态表示学习框架首次在代码的文本特征提取中只使用了方法名,并证明对搜索结果的无破坏性,有助于在大型代码数据库中进行匹配简化。

55、(2)在对自然语言文本的结构表示中使用选区解析树,这更类似于代码结构对应的抽象语法树,从而促进了细粒度的对齐。

56、(3)所采用的细粒度对齐机制可以更加深入地对比代码和查询不同模态的特征,解决代码和查询的异构性所带来的信息重叠或冗余问题。

57、(4)本发明解决了代码搜索领域的信息特征提取不充分等问题,摆脱了结构和文本的本质差异带来的特征不对齐,能够在较大代码数据库中选取恰当的特征进行查询匹配并提高搜索质量,有效地解决了代码搜索领域存在的部分痛点问题。


技术特征:

1.一种基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,方法包括如下步骤:

2.根据权利要求1所述的基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,所述步骤1中,对于在代码数据库中选取的代码片段,代码片段的代码文本分为三个部分:方法名称、api序列和其他标记,只提取方法名作为特征,并对提取的包含特定符号的令牌执行分词操作;对于代码的结构信息提取其对应的抽象语法树。

3.根据权利要求1所述的基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,所述步骤2中,使用多头注意力来表示代码和查询的文本信息;transformer中的自注意机制公式表达为:

4.根据权利要求3所述的基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,就文本特征而言,计算过程如下:

5.根据权利要求3所述的基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,就结构特征而言,计算过程如下:

6.根据权利要求1所述的基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,所述步骤4中,将查询的文本特征和结构特征生成一个联合特征表示queryfusion,将代码的文本特征和结构特征生成一个联合特征表示codefusion,并采用交叉熵作为损失函数对联合特征表示进行优化:

7.根据权利要求1所述的基于细粒度注意力对齐的多模态代码搜索方法,其特征在于,步骤5针对步骤4中所得的经过交叉熵优化后的代码和查询的最终联合特征表示对所有代码片段进行匹配排序;采用余弦相似度作为匹配指标,其计算公式如下:


技术总结
本发明公开一种基于细粒度注意力对齐的多模态代码搜索方法,通过构建新机制从文本和结构两种模态学习源代码和自然语言查询的丰富语义,使用多模态特征网络构建代码搜索模型,对不同模态特征采用不同的构造方式,充分地表达相应代码与文本的不同特征;同时在模型训练过程中采用细粒度对齐机制,将同模态特征进行分别对齐,从而利于代码实体和文本实体的匹配;在完成所有特征的构造后,使用余弦相似度函数计算给定查询与所有代码库中代码样本之间的相似度,以此对代码样本进行相似度排序。本发明摆脱了现有代码搜索领域对代码表示和特征提取的不充分性,能够较完全地利用不同模态特征所包含的信息进行代码表示和匹配,并具有较高的识别精度与较好的收敛性能。

技术研发人员:戚荣志,张晟楠,李水艳,毛莺池,周晓峰
受保护的技术使用者:河海大学
技术研发日:
技术公布日:2024/9/23

最新回复(0)