一种基于结构化嵌入的交互式代码搜索方法及装置与流程

文档序号:20768732发布日期:2020-05-15 19:21阅读:146来源:国知局
一种基于结构化嵌入的交互式代码搜索方法及装置与流程
本发明涉及软件工程的代码
技术领域
,具体涉及一种基于结构化嵌入的交互式代码搜索方法及装置。
背景技术
:代码搜索是软件开发实践中常见的开发人员活动,几十年来一直是软件开发的重要组成部分。先前的研究显示,超过60%的开发者每天搜索源代码。由于在线公共代码存储库(例如,stackoverflow,github,krugle)包含数百万个开源项目,许多设计的搜索引擎可帮助开发人员用自然语言在软件问答社区中查询相关的代码片段用以维护或修复代码。但不幸的是,即使重构这些查询的描述,大多数现有的搜索引擎也会经常会返回不相关代码或示例代码。因而目前在学术领域和工业界越来越关注代码搜索技术。早期方法是应用信息检索(ir)技术,但大多数方法在很大程度上依赖于自然语言查询和源代码中包含的术语匹配的质量。但是,由于自然语言查询和源代码是异构的,因此它们可能无法共享足够的通用标识符来有效地匹配术语,尤其是在文本较短的代码查询中。尽管一些现有方法为查询重构提供了有效的方法(例如,查询扩展,文本重构),但过于具体查询的文本匹配仍然不会返回相应的结果。此外,这些抽取式的代码搜索方法无法有效地处理查询中不相关关键字。事实上,自然语言查询和源代码作为异构语言可能是语义相关的,就像机器翻译一样。因此,在近期的工作中,引入了神经方法来解决在理解自然语言查询和源代码语义方面的困难。在以前的工作中,许多基于深度学习的方法被应用于查询和源代码的统一表示学习任务,如代码摘要,代码缺陷定位,代码克隆监测等等。同样,对于代码搜索,最近有研究提出了一个用于搜索java方法体的双模式深度神经网络模型(codenn),它能将代码以及其自然语言描述映射对统一转换到高维矢量空间以进行相似匹配。本申请发明人在实施本发明的过程中,发现现有技术的方法,至少存在如下技术问题:codenn依赖于代码分解,需要从受限的方法类型代码段中提取子元素(包括方法名称、token和api序列)。而每个子元素需要单独嵌入到神经网络中,然后合并到一个表示代码的矢量中。但是,这种基于代码拆分的嵌入方法可能不适合其他程序类型或多结构代码片段。因而最近提出了一些有监督的双模式神经代码搜索方法如coacor,ncs,unif等模型,这些模型可学习到了自然语言查询和整体代码片段的联合嵌入表示,以进一步扩展其应用的代码类型范围。但这些模型大多简单的采用word2vec或one-hot词嵌入,在网络的预训练中并没有融入额外的结构化嵌入信息。由此可知,现有技术中的方法存在搜索性能不够的技术问题。技术实现要素:有鉴于此,本发明提供了一种基于结构化嵌入的交互式代码搜索方法及装置,用以解决或者至少部分解决现有技术中的方法存在搜索性能不够的技术问题。为了解决上述技术问题,本发明第一方面提供了一种基于结构化嵌入的交互式代码搜索方法,包括:步骤s1:收集原始数据,对原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,在抽取过程中获取每条代码-描述匹配对的社交属性值;步骤s2:对模型语料进行结构化分词以及预处理,得到处理后的语料;步骤s3:采用预设工具对处理后的语料进行词嵌入训练,构建预训练的结构化词嵌入;步骤s4:对模型语料进行结构化分词以及预处理后,根据代码-描述匹配对的社交属性值筛选出预设数量的语料进行采样作为代码搜索模型的语料,并划分为训练集、验证集和测试集;步骤s5:构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型nics,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度;步骤s6:将预训练结构化词嵌入加载至交互式代码搜索nics模型,设置初始化参数并利用训练集来训练拟合模型的参数,在验证集上迭代预设次直到合页损失函数收敛,得到训练好的nics模型;步骤s7:利用训练好的nics模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。在一种实施方式中,步骤s1中抽取出的软件存储库包含不同的程序语言,步骤s1具体包括:步骤s1.1:收集原始数据,原始数据包括软件问答社区的问答帖子;步骤s1.2:根据收集的程序问答帖子,对c#、java、sql和python四种程序语言类型的代码库进行解析与匹配,抽取出四种不同程序语言类型的软件存储库及代码-描述匹配对的模型语料。在一种实施方式中,步骤s2具体包括:步骤s2.1:采用不同的程序语法解析器对软件存储库及代码-描述匹配对的模型语料中的文本进行解析,实现结构化分词;步骤s2.2:依次对分词后的文本进行词还原、词统一化以及去冗余处理。在一种实施方式中,步骤s3具体包括:采用基于word2vec工具实现的负采样的skip-gram模型,在三种代码粒度中训练代码的结构化嵌入。在一种实施方式中,步骤s4具体包括:步骤s4.1:依次采用小波时频变换、em融合、小波逆变换操作,对所有匹配对语料的社交属性值进行融合评分;步骤s4.2:根据融合评分值对每条语料进行分值排序,筛选出预设数量的语料进行采样作为代码搜索模型的语料;步骤s4.3:将筛选出的语料按照预设比例进行划分。在一种实施方式中,步骤s5具体包括:步骤s5.1:构建特征抽取模块;在给定代码段c=c1,...,c|c|和相应的查询q=q1,...,q|c|时,首先在步骤s2中得到的处理后的语料查询相应的编码向量,查询公式如下:其中,e∈rd×v是预训练的结构嵌入的矩阵,和是单词qi和ci的嵌入矢量,其中v是固定大小的词汇,d是单词嵌入的维度,改进后的bi-lstm包含正向lstm和反向lstm,从两个方向捕获每个步骤的历史和未来信息,顺序输入向量的正向和向后隐藏状态可以按如下方式表示:最后,将两种隐藏状态和串联,以形成最终隐藏状态ht:其中表示两个向量的串联,让每个单向lstm的隐藏单位编号为u,基于bi-lstm的嵌入矢量从长度的为n的输入xt更新的公式写作h∈rn×2u:h=[h1,...ht,...,hn]按照将长度为n的输入向量转换为嵌入向量序列h的过程,这些基于bilstm的嵌入式矢量集和被表示为h∈r|c|×2u,用于保留更多的历史信息;步骤s5.2:构建交互注意力模块;采用双向交互方法来进行交互信息抽取,给定在每个时间步t上查询序列hq中的嵌入矢量以及给定每个时间步t上的代码序列hc中的嵌入矢量使用注意机制为qc的交互表示构造注意矩阵m,注意矩阵如下:其中,wq∈r2u×a,wc∈r2u×a,v∈ra是注意力参数,a是注意力维度,矩阵m∈r|q|×|c|中包含了查询q和代码c之间的交互信息;接下来,采用注意力池化操作,从代码方向和查询方向推导出基于池的投影向量,使用按行和按列值在m上的最大池,可以分别获取重要的分数向量mq∈r|q|和mc∈r|c|,矢量mq和mc的第k个元素的计算方式如下:每个元素被视为第k个“查询-代码”单词对的重要性分数,同样,每个元素都被视为第k个“代码-查询”单词对的重要性分数,为给查询与代码分配特定的权重,计算权重向量δq∈r|q|和δc∈r|c|如下所示:δq=softmax(mq);δc=softmax(mc)最后,本发明通过权重向量δq∈r|q|和δc∈r|c|以及基于bilstm的嵌入矢量hc和hq的计算得到交互向量表示vq∈r2u和vc∈r2u:vq=δqhq;vc=δchc;步骤s5.3:构建相似度匹配模块;使用cosine相似度cos(vq,vc)测量源代码和自然查询之间的相关性,并共同嵌入其向量表示,cosine相似度的计算方式为:其中的表示两个矩阵通过其转置的乘法,相似性越高,代码片段与自然查询的关系越大,本发明以查询代码对<q,c>作为输入,并预测其cosine相似度cos(vq,vc);步骤s5.4:构建网络的合页损失函数,构造一个三元组样本对<q,c+,c->作为训练实例,该实例由一个查询以及对应的正代码c+和负代码c-组成,c+表示q对应的正确的代码,c-表示q对应的不正确的代码,三元组来自本发明收集的语料,目标是学习一个具有可训练参数的函数f,使得这个函数能够实现对<q,c+>的评分高于<q,c->:当在一组<q,c+,c->三元组训练时,本发明分别预测<q,c+>和<q,c->样本对的cosine相似度,并减少损失函数的值:其中,θ表示模型参数,ε>0是边距超参数,λ∈[0,1]是正则化参数,和分别是q,c+和c-的交互式表示形式。在一种实施方式中,在步骤s6之后,所述方法还包括:保存训练得到的nics模型超参数文件,并在测试集上进行模型性能验证。基于同样的发明构思,本发明第二方面提供了一种基于结构化嵌入的交互式代码搜索方法,包括:收集模块,用于收集原始数据,对原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,在抽取过程中获取每条代码-描述匹配对的社交属性值;结构化分词模块,用于对模型语料进行结构化分词以及预处理,得到处理后的语料;结构化词嵌入模块,用于采用预设工具对处理后的语料进行词嵌入训练,构建预训练的结构化词嵌入;高质量语料抽取及划分模块,用于对模型语料进行结构化分词以及预处理后,根据代码-描述匹配对的社交属性值筛选出预设数量的语料进行采样作为代码搜索模型的语料,并划分为训练集、验证集和测试集;交互式代码搜索模型构建模块,用于构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型nics,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度;训练模块,用于将预训练结构化词嵌入加载至交互式代码搜索nics模型,设置初始化参数并利用训练集来训练拟合模型的参数,在验证集上迭代预设次直到合页损失函数收敛,得到训练好的nics模型;搜索模块,用于利用训练好的nics模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。基于同样的发明构思,本发明第三方面提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被执行时实现第一方面所述的方法。基于同样的发明构思,本发明第四方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述的方法。本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:本发明提供的一种基于结构化嵌入的交互式代码搜索方法,首先从收集的原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,然后对代码存储库及模型语料的分词,接着采用预设工具构建预训练的结构化嵌入;接下来抽取高质量模型语料并划分;然后构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型nics,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度;再将预训练结构化词嵌入加载至交互式代码搜索nics模型,并对nics模型进行训练,最后利用训练好的nics模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。通过这种结构化嵌入以及交互信息相结合的方法,本发明将自然查询和对应的代码片段映射到高位向量空间中的相邻位置,根据相似度分数度量自然查询与代码片段在高维空间中的距离,最终得到训练好的基于结构化嵌入的交互式代码搜索模型,从而可以提高代码搜索的性能。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明提供的一种基于结构化嵌入的交互式代码搜索方法的实现流程图;图2(包括a和b)为发明实施例的模型结构主框架图及细节结构图;图3(包括a、b、c和d)为发明实施例的不同程序语言的结构化词嵌入的二维展示图;图4为本发明实施例的结构化词嵌入与其他词嵌入在验证集上的效果比较图;图5为本发明实施例中基于结构化嵌入的交互式代码搜索装置的结构框图;图6为本发明实施例中一种计算机可读存储介质的结构框图;图7为本发明实施例中计算机设备的结构图。具体实施方式本申请发明人通过大量的研究与实践发现:现有技术中的一些有监督的双模式神经代码搜索方法如coacor,ncs,unif等模型,大多简单的采用word2vec或one-hot词嵌入,在网络的预训练中并没有融入额外的结构化嵌入信息。但实际上,代码存储库中包含大量的结构化源代码语料,类似于自然语言处理中的bert或xlnet预训练模型,训练和融入代码的结构化嵌入能够提升软件任务甚至代码搜索的性能。另外,coacor,ncs,unif这些现有的神经代码搜索方法,大多复用了自然语言处理中一些现有的双模式神经网络模型,而不是专门为自然查询和源代码交互式搜索建模而设计的。这些模型仅利用lstm(长短期记忆网络)或cnn(卷积神经网络)网络框架来联合学习自然查询和源代码嵌入的序列文本表示并训练两者的语义相似性。但它们无法融合代码及其查询描述的交互信息,从而有效地捕获异构语言中更深层次的语义匹配信号。同时自然语言查询中不同的词对于搜索的代码片段中不同令牌的关注程度是不同,通常称之为注意力机制。而事实证明,在大多数自然语言处理及程序语言理解任务中,如机器翻译和代码自动摘要研究中,注意力机制在代码搜索中能够捕获更多查询所关注代码不同部分的信息。整体来说,现有的这些提取方法受到自然查询和代码片段之间的术语不匹配的影响,因为它们主要依赖于文本相似性。此外,大多数现有的神经方法没有考虑到源代码的结构信息,这些结构信息除了词汇术语之外,还带有额外的语义信息。基于以上考虑,本发明提出了基于结构化嵌入的交互代码搜索方法,它是一种用于检索代码片段的新型双向交互神经网络,它动态的匹配查询与相应的代码的结构性信息较多的部分,并嵌入到相应的向量表示中。本发明首先使用基于lstm的双向神经网络,以及预定义的代码结构将自然查询及其对应的代码映射到统一矢量表示。然后学习查询代码交互的对齐注意矩阵,最后得到不同方向的注意力投影向量,从而引导查询与代码之间的嵌入表示学习。本发明根据从stackoverflow收集的四种大规模代码库进行实证评估。结果表明,本发明可以有效地检索代码片段,并在所有基准测试中取得最先进的性能。本发明的创新点包括:1)基于注意力机制的交互嵌入方法;与传统的基于表示的模型不同,本发明采用基于双向交互的网络,而不是基于lstm的rnn来对匹配信号进行足够完善的建模。同时,本发明使用注意力机制来训练并学习代码和查询的重要性权重。这种新颖的权值加权模型能够对自然语言查询和代码术语在各自的方向上给予不同的关注,从而对自然语言查询描述产生不同的关注。2)基于代码结构序列的代码嵌入方法;与文本文档相比,源代码具有它们自己的唯一属性,如代码结构和代码标识符。大多数c#片段包含循环和条件,sql查询通常包含一个或多个子查询。此外,大多数标记(如表示其类型的变量名称)通常对代码的语义表达式没有意义。因此,本发明将代码片段规范化为一个结构序列,以减少数据的稀疏性并维护代码片段的同源性。3)基于代码结构嵌入的神经网络模型训练方法;word2vec和bert在自然语言处理中取得了巨大成功,提高了下游学习任务(如答案选择和机器翻译)的准确性。本发明受到自然语言处理领域的启发创新性的使用了基于代码结构嵌入的神经网络模型训练方法,与使用标准的one-hot编码嵌入或word2vec词嵌入学习到的代码序列的表示形式相比,本发明的代码向量表示会提高代码搜索的性能。为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。实施例一本实施例提供了一种基于结构化嵌入的交互式代码搜索方法,请参见图1,该方法包括:步骤s1:收集原始数据,对原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,在抽取过程中获取每条代码-描述匹配对的社交属性值。具体来说,原始数据可以来自于不同的开源数据库,软件存储库可以为不同的程序语言,例如从软件问答社区中stackoverflow爬取包含c#、java、sql和python四种程序语言类型的软件存储库及代码-描述匹配对的模型语料。步骤s2:对模型语料进行结构化分词以及预处理,得到处理后的语料。具体来说,s2是对代码存储库及模型语料的分词。具体可以采用程序序列化语法解析器对步骤1中获取的不同软件存储库中的代码及其描述文本实现结构化分词,并依次进行词还原、词统一化及其他去冗处理。步骤s3:采用预设工具对处理后的语料进行词嵌入训练,构建预训练的结构化词嵌入。具体来说,s3是构建预训练的结构化嵌入,预设工具为词向量嵌入工具,例如word2vec工具等。步骤s4:对模型语料进行结构化分词以及预处理后,根据代码-描述匹配对的社交属性值筛选出预设数量的语料进行采样作为代码搜索模型的语料,并划分为训练集、验证集和测试集。具体来说,s4是抽取高质量模型语料并进行数据集划分,预设数量和划分比例可以根据情况设置。步骤s5:构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型nics,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度。具体来说,s5是构建交互式代码搜索模型nics。如图2所示,本发明提供的基于结构化嵌入的交互式代码搜索方法,整体结构如图2的a部分所示,包括结构化嵌入模块、特征抽取模块、交互注意力模块、相似度匹配模块;细节结构如图2的b部分所示,其中结构化嵌入模块用于训练针对软件存储库的结构化词嵌入;特征抽取模块用于捕获并编码代码段和查询的特征信息;交互注意力模块用于捕获并编码代码段和查询的交互信息;相似度匹配模块用于计算查询与代码段之间的相似度。步骤s6:将预训练结构化词嵌入加载至交互式代码搜索nics模型,设置初始化参数并利用训练集来训练拟合模型的参数,在验证集上迭代预设次直到合页损失函数收敛,得到训练好的nics模型。具体来说,s6是训练nics模型的超参数,利用验证集进行模型性能的验证。步骤s7:利用训练好的nics模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。具体来说,步骤s7是对模型的应用,得到训练好的模型后,则可以对待处理的查询进行代码预测,得到与查询对应的代码段。在一种实施方式中,步骤s1中抽取出的软件存储库包含不同的程序语言,步骤s1具体包括:步骤s1.1:收集原始数据,原始数据包括软件问答社区的问答帖子;步骤s1.2:根据收集的程序问答帖子,对c#、java、sql和python四种程序语言类型的代码库进行解析与匹配,抽取出四种不同程序语言类型的软件存储库及代码-描述匹配对的模型语料。具体来说,本实施例以在stackoverflow问答社区为例,通过其收集的程序问答帖子来解析c#、java、sql和python四种程序语言类型的代码库,而匿名版本的帖子可以从stackexchange免费下载。使用正则表达式(例如,tags=“.*c#.*”)来匹配不同的标记(c#、java、sql、python),可解析四种不同程序语言类型的软件存储库及代码-描述匹配对的模型语料。另外,在解析代码-描述匹配对的模型语料时同时获取每条匹配对的所有社交属性值(如评论量、浏览量、点赞量等社交指标)。在一种实施方式中,步骤s2具体包括:步骤s2.1:采用不同的程序语法解析器对软件存储库及代码-描述匹配对的模型语料中的文本进行解析,实现结构化分词;步骤s2.2:依次对分词后的文本进行词还原、词统一化以及去冗余处理。具体实施过程中,分别采用不同的程序语法解析器(antlr解析器、python-sqlparse解析器、python内置解析器)对解析软件存储库及代码-描述匹配对的模型语料中的文本实现结构化分词,并依次进行词还原、词统一化及其他去冗处理。如附表1所示,本发明分别为c#、sql、java、python软件存储库保留了642662、602405、699700、434597对分词后的问答文本对,总计包含词的词典大小为238344608、234480598、180891654、178602792,可覆盖所有代码-描述匹配对的模型语料,以作为训练代码结构化词嵌入的语料。如附表2所示,是一个python语言问答对用于结构化词嵌入训练语料库的示例,其中标识符“[c]...[/c]”表示代码片段,标识符“\n”表示换行符。表1不同语言结构化词嵌入训练语料库表2用于结构化词嵌入训练的python语言问答文本对示例在一种实施方式中,步骤s3具体包括:采用基于word2vec工具实现的负采样的skip-gram模型,在三种代码粒度中训练代码的结构化嵌入。在具体的实施过程中,收集c#、java、sql和python四种程序语言类型的嵌入语料库后,本发明使用word2vec工具实现的sgns(使用负采样的skip-gram)模型,在三种代码粒度(即类、包和库级别)中训练代码的结构化嵌入。如附表3所示,本发明列出的结构化词嵌入训练时的超参数设置,其中窗口大小10表示距离10内的所有单词都被视为附近的单词。此外,本发明收集的代码搜索语料库也来自这四个代码库,所以这些嵌入语料库可以完全覆盖后续的语料。表3结构化词嵌入训练时的超参数窗口大小迭代次数维度1020300下采样值最小词频数负采样个数1e-525由于本发明的嵌入空间包含数十亿个点(词典中的每个词),为了探索每个词及其局部邻域的空间分布,本发明使用t-sne将嵌入空间投影到两个维度中,t-sne是一种尺寸缩减技术,旨在保留点之间的局部距离。为了更好地呈现结构嵌入的分布效果,本发明选择一些特定的标识符来展示这种效果,例如python的关键字("lambda"、"while"、"break")。如图3所示,展示了c#、java、sql和python的代码结构嵌入的2d可视化示例。图3的(d)部分中的两组关键字("while"、"break"和"continue")以及("if"、"elif"和"else")是非常接近的邻域,在程序或自然描述中经常一起使用。本发明能够将含义相近的程序关键词结构化地映射到高维空间的邻域。在一种实施方式中,步骤s4具体包括:步骤s4.1:依次采用小波时频变换、em融合、小波逆变换操作,对所有匹配对语料的社交属性值进行融合评分;步骤s4.2:根据融合评分值对每条语料进行分值排序,筛选出预设数量的语料进行采样作为代码搜索模型的语料;步骤s4.3:将筛选出的语料按照预设比例进行划分。在具体的实施过程中,对代码-描述匹配对的模型语料中社交属性值,依次采用小波时频变换、em融合、小波逆变换操作(又称小波时频特征融合算法),对所有匹配对语料的社交属性值进行融合打分,并依据打分值对每条语料进行分值排序,作为语料质量的评估标准。在代码-描述匹配对的模型语料中去除长度小于20的代码片段以及一些没有查询描述或代码片段的帖子,最后分别抽取c#、java、sql、python的前top-k(k=237078、210904、256602、279695)条融合打分值的语料作为模型的数据集,且按8:1:1划分训练集、验证集和测试集。在一种实施方式中,步骤s5具体包括:步骤s5.1:构建特征抽取模块;在给定代码段c=c1,...,c|c|和相应的查询q=q1,...,q|c|时,首先在步骤s2中得到的处理后的语料查询相应的编码向量,查询公式如下:其中,e∈rd×v是预训练的结构嵌入的矩阵,和是单词qi和ci的嵌入矢量,其中v是固定大小的词汇,d是单词嵌入的维度,改进后的bi-lstm包含正向lstm和反向lstm,从两个方向捕获每个步骤的历史和未来信息,顺序输入向量的正向和向后隐藏状态可以按如下方式表示:最后,将两种隐藏状态和串联,以形成最终隐藏状态ht:其中表示两个向量的串联,让每个单向lstm的隐藏单位编号为u,基于bi-lstm的嵌入矢量从长度的为n的输入xt更新的公式写作h∈rn×2u:h=[h1,...ht,...,hn]按照将长度为n的输入向量转换为嵌入向量序列h的过程,这些基于bilstm的嵌入式矢量集和被表示为h∈r|c|×2u,用于保留更多的历史信息;步骤s5.2:构建交互注意力模块;采用双向交互方法来进行交互信息抽取,给定在每个时间步t上查询序列hq中的嵌入矢量以及给定每个时间步t上的代码序列hc中的嵌入矢量使用注意机制为qc的交互表示构造注意矩阵m,注意矩阵如下:其中,wq∈r2u×a,wc∈r2u×a,v∈ra是注意力参数,a是注意力维度,矩阵m∈r|q|×|c|中包含了查询q和代码c之间的交互信息;接下来,采用注意力池化操作,从代码方向和查询方向推导出基于池的投影向量,使用按行和按列值在m上的最大池,可以分别获取重要的分数向量mq∈r|q|和mc∈r|c|,矢量mq和mc的第k个元素的计算方式如下:每个元素被视为第k个“查询-代码”单词对的重要性分数,同样,每个元素都被视为第k个“代码-查询”单词对的重要性分数,为给查询与代码分配特定的权重,计算权重向量δq∈r|q|和δc∈r|c|如下所示:δq=softmax(mq);δc=softmax(mc)最后,本发明通过权重向量δq∈r|q|和δc∈r|c|以及基于bilstm的嵌入矢量hc和hq的计算得到交互向量表示vq∈r2u和vc∈r2u:vq=δqhq;vc=δchc;步骤s5.3:构建相似度匹配模块;使用cosine相似度cos(vq,vc)测量源代码和自然查询之间的相关性,并共同嵌入其向量表示,cosine相似度的计算方式为:其中的表示两个矩阵通过其转置的乘法,相似性越高,代码片段与自然查询的关系越大,本发明以查询代码对<q,c>作为输入,并预测其cosine相似度cos(vq,vc);步骤s5.4:构建网络的合页损失函数,构造一个三元组样本对<q,c+,c->作为训练实例,该实例由一个查询以及对应的正代码c+和负代码c-组成,c+表示q对应的正确的代码,c-表示q对应的不正确的代码,三元组来自本发明收集的语料,目标是学习一个具有可训练参数的函数f,使得这个函数能够实现对<q,c+>的评分高于<q,c->:当在一组<q,c+,c->三元组训练时,本发明分别预测<q,c+>和<q,c->样本对的cosine相似度,并减少损失函数的值:其中,θ表示模型参数,ε>0是边距超参数,λ∈[0,1]是正则化参数,和vc-分别是q,c+和c-的交互式表示形式。具体来说,步骤s5.1中采用了改进后的bi-lstm(双向长期短期记忆),由于以往的研究通常采用双向长期短期记忆(lstm)为基础的循环神经网络(rnn),通过总结两个方向的上下文信息来学习基础表示。但是lstm的隐藏状态只能从历史获取信息,对未来一无所知。与lstm相比,本发明改进后的bi-lstm包含正向lstm和反向lstm,可以从两个方向捕获每个步骤的历史和未来信息。通过特征抽取模块,将基于bilstm的嵌入式矢量集和表示为h∈r|c|×2u,从而可以保留更多的历史信息。步骤s5.2中,采用双向交互方法来进行交互信息抽取。由于代码片段的结构复杂性和代码片段长度过长,bilstm模型面临着长序列依赖性和固定宽度隐藏矢量编码的挑战。本发明引入注意力机制,通过动态对齐代码和查询向量相应的部分来解决此问题。此策略已用于其他自然语言处理任务,如机器翻译和非事实问题选择。在平均池化或最大池化操作之前,基于注意力的bilstm输出的嵌入矢量将乘以经过softmax操作的权重,该权重由bilsm中嵌入矢量序列确定。在模型的训练过程中,首先将s3中预训练得到的代码结构化词嵌入加载到步骤s5中的交互式代码搜索nics模型。然后在模型参数初始化中,设置查询和代码的最大长度分别20和200,填充的词或不在词表中的词嵌入的服从<-0.25,025>均匀分布,双向lstm的隐藏层大小为128,注意力维度为200,匹配模块中的正则化参数设为0.02,边距超参数设为0.5,按照0.5的概率在嵌入映射层和双向lstm编码层中进行采样。最后,根据s4中得到训练集,按照学习率为0.002和sgd随机梯度下降法来训练拟合nics模型的超参数,直到在验证集迭达50次后停止训练,并保存模型的超参数文件。在一种实施方式中,在步骤s6之后,所述方法还包括:保存训练得到的nics模型超参数文件,并在测试集上进行模型性能验证。为说明本发明nics模型在软件问答社区代码搜索上的实验效果,根据训练得到的nics模型超参数文件,在s4中得到的测试集上进行模型性能验证,以给出相应的mrr和recall代码搜索性能评价指标,并将其与现有的基准模型codeatt、codelstm、codecnn、codercnn、unif、deepcs进行比较,来说明本发明nics代码搜索模型的性能。实验结果如表4所示,本发明的实验效果要优于其他6种基准模型。结果表明,本发明的方法,因融合的代码结构化嵌入及交互式注意力信息后比其他方法更优越地代表了代码段和查询的潜在信息。因此,给定一个查询,本发明可以在软件问答社区中搜索更相关的代码。表4不同模型的性能指标除此之外,为了比较nics模型中采用结构化嵌入方法的有效性,本发明将结构化嵌入方法与其他词嵌入方法(随机初始化方法one-hot、普通词向量嵌入方法word2vec)在python验证数据集上对比,实验曲线如附图4所示。结果表明,本发明的结构化嵌入方法在验证集上的表现基本要优于其他词嵌入方法,因而能更好的捕获代码的结构信息,且取得最佳性能。本发明的创新点包括:1)基于注意力机制的交互嵌入方法;与传统的基于表示的模型不同,本发明采用基于双向交互的网络,而不是基于lstm的rnn来对匹配信号进行足够完善的建模。同时,本发明使用注意力机制来训练并学习代码和查询的重要性权重。这种新颖的权值加权模型能够对自然语言查询和代码术语在各自的方向上给予不同的关注,从而对自然语言查询描述产生不同的关注。2)基于代码结构序列的代码嵌入方法;与文本文档相比,源代码具有它们自己的唯一属性,如代码结构和代码标识符。大多数c#片段包含循环和条件,sql查询通常包含一个或多个子查询。此外,大多数标记(如表示其类型的变量名称)通常对代码的语义表达式没有意义。因此,本发明将代码片段规范化为一个结构序列,以减少数据的稀疏性并维护代码片段的同源性。3)基于代码结构嵌入的神经网络模型训练方法;word2vec和bert在自然语言处理中取得了巨大成功,提高了下游学习任务(如答案选择和机器翻译)的准确性。本发明受到自然语言处理领域的启发创新性的使用了基于代码结构嵌入的神经网络模型训练方法,与使用标准的one-hot编码嵌入或word2vec词嵌入学习到的代码序列的表示形式相比,本发明的代码向量表示会提高代码搜索的性能。此外,需要说明是,本实施例中对于代码的搜索还可以采用其他的神经网络架构,而本实施例对此不作具体的限定和说明。实施例二基于同样的发明构思,本实施例提供了,请参见图5,该装置包括:收集模块201,用于收集原始数据,对原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,在抽取过程中获取每条代码-描述匹配对的社交属性值;结构化分词模块202,用于对模型语料进行结构化分词以及预处理,得到处理后的语料;结构化词嵌入模块203,用于采用预设工具对处理后的语料进行词嵌入训练,构建预训练的结构化词嵌入;高质量语料抽取及划分模块204,用于对模型语料进行结构化分词以及预处理后,根据代码-描述匹配对的社交属性值筛选出预设数量的语料进行采样作为代码搜索模型的语料,并划分为训练集、验证集和测试集;交互式代码搜索模型构建模块205,用于构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型nics,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度;训练模块206,用于将预训练结构化词嵌入加载至交互式代码搜索nics模型,设置初始化参数并利用训练集来训练拟合模型的参数,在验证集上迭代预设次直到合页损失函数收敛,得到训练好的nics模型;搜索模块207,用于利用训练好的nics模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。由于本发明实施例二所介绍的装置,为实施本发明实施例一中基于结构化嵌入的交互式代码搜索方法所采用的装置,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的装置都属于本发明所欲保护的范围。实施例三请参见图6,基于同一发明构思,本申请还提供了一种计算机可读存储介质300,其上存储有计算机程序311,该程序被执行时实现如实施例一中所述的方法。由于本发明实施例三所介绍的计算机可读存储介质为实施本发明实施例一中基于结构化嵌入的交互式代码搜索方法所采用的计算机可读存储介质,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该计算机可读存储介质的具体结构及变形,故而在此不再赘述。凡是本发明实施例一中方法所采用的计算机可读存储介质都属于本发明所欲保护的范围。实施例四基于同一发明构思,本申请还提供了一种计算机设备,请参见图7,包括存储401、处理器402及存储在存储器上并可在处理器上运行的计算机程序403,处理器402执行上述程序时实现实施例一中的方法。由于本发明实施例四所介绍的计算机设备为实施本发明实施例一中基于结构化嵌入的交互式代码搜索方法所采用的计算机设备,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该计算机设备的具体结构及变形,故而在此不再赘述。凡是本发明实施例一中方法所采用的计算机设备都属于本发明所欲保护的范围。本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1