当前位置: 首页 > 专利查询>武汉大学专利>正文

一种基于结构化嵌入的交互式代码搜索方法及装置制造方法及图纸

技术编号:24168696 阅读:39 留言:0更新日期:2020-05-16 02:15
本发明专利技术提供了一种基于结构化嵌入的交互式代码搜索方法,首先从收集的原始数据中抽取出软件存储库以及代码‑描述匹配对的模型语料,然后对代码存储库及模型语料的分词,接着采用预设工具构建预训练的结构化嵌入;接下来抽取高质量模型语料并划分;然后构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型NICS,并设置训练网络的合页损失函数;再将预训练结构化词嵌入加载至交互式代码搜索NICS模型,并对NICS模型进行训练,最后利用训练好的NICS模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。本发明专利技术可以有效地检索代码片段,并在所有基准测试中取得最先进的性能。

An interactive code search method and device based on structured embedding

【技术实现步骤摘要】
一种基于结构化嵌入的交互式代码搜索方法及装置
本专利技术涉及软件工程的代码
,具体涉及一种基于结构化嵌入的交互式代码搜索方法及装置。
技术介绍
代码搜索是软件开发实践中常见的开发人员活动,几十年来一直是软件开发的重要组成部分。先前的研究显示,超过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之间的交互信本文档来自技高网
...

【技术保护点】
1.一种基于结构化嵌入的交互式代码搜索方法,其特征在于,包括:/n步骤S1:收集原始数据,对原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,在抽取过程中获取每条代码-描述匹配对的社交属性值;/n步骤S2:对模型语料进行结构化分词以及预处理,得到处理后的语料;/n步骤S3:采用预设工具对处理后的语料进行词嵌入训练,构建预训练的结构化词嵌入;/n步骤S4:对模型语料进行结构化分词以及预处理后,根据代码-描述匹配对的社交属性值筛选出预设数量的语料进行采样作为代码搜索模型的语料,并划分为训练集、验证集和测试集;/n步骤S5:构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型NICS,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度;/n步骤S6:将预训练结构化词嵌入加载至交互式代码搜索NICS模型,设置初始化参数并利用训练集来训练拟合模型的参数,在验证集上迭代预设次直到合页损失函数收敛,得到训练好的NICS模型;/n步骤S7:利用训练好的NICS模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。/n...

【技术特征摘要】
1.一种基于结构化嵌入的交互式代码搜索方法,其特征在于,包括:
步骤S1:收集原始数据,对原始数据中抽取出软件存储库以及代码-描述匹配对的模型语料,在抽取过程中获取每条代码-描述匹配对的社交属性值;
步骤S2:对模型语料进行结构化分词以及预处理,得到处理后的语料;
步骤S3:采用预设工具对处理后的语料进行词嵌入训练,构建预训练的结构化词嵌入;
步骤S4:对模型语料进行结构化分词以及预处理后,根据代码-描述匹配对的社交属性值筛选出预设数量的语料进行采样作为代码搜索模型的语料,并划分为训练集、验证集和测试集;
步骤S5:构建依次包含特征抽取模块、交互注意力抽取模块和相似度匹配模块的交互式代码搜索模型NICS,并设置训练网络的合页损失函数,其中,所述特征抽取模块用于捕获并编码代码段和自然查询的序列信息;所述交互注意力模块用于捕获并编码代码段和自然查询的交互信息;所述相似度匹配模块用于计算查询与代码段之间的相似度;
步骤S6:将预训练结构化词嵌入加载至交互式代码搜索NICS模型,设置初始化参数并利用训练集来训练拟合模型的参数,在验证集上迭代预设次直到合页损失函数收敛,得到训练好的NICS模型;
步骤S7:利用训练好的NICS模型对待处理的查询进行预测,获得与查询对应的代码搜索结果。


2.如权利要求1所述的方法,其特征在于,步骤S1中抽取出的软件存储库包含不同的程序语言,步骤S1具体包括:
步骤S1.1:收集原始数据,原始数据包括软件问答社区的问答帖子;
步骤S1.2:根据收集的程序问答帖子,对C#、Java、SQL和Python四种程序语言类型的代码库进行解析与匹配,抽取出四种不同程序语言类型的软件存储库及代码-描述匹配对的模型语料。


3.如权利要求1所述的方法,其特征在于,步骤S2具体包括:
步骤S2.1:采用不同的程序语法解析器对软件存储库及代码-描述匹配对的模型语料中的文本进行解析,实现结构化分词;
步骤S2.2:依次对分词后的文本进行词还原、词统一化以及去冗余处理。


4.如权利要求1所述的方法,其特征在于,步骤S3具体包括:
采用基于Word2Vec工具实现的负采样的Skip-Gram模型,在三种代码粒度中训练代码的结构化嵌入。


5.如权利要求1所述的方法,其特征在于,步骤S4具体包括:
步骤S4.1:依次采用小波时频变换、EM融合、小波逆变换操作,对所有匹配对语料的社交属性值进行融合评分;
步骤S4.2:根据融合评分值对每条语料进行分值排序,筛选出预设数量的语料进行采样作为代码搜索模型的语料;
步骤S4.3:将筛选出的语料按照预设比例进行划分。


6.如权利要求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...

【专利技术属性】
技术研发人员:彭敏黎芮彤胡刚刘进崔晓晖
申请(专利权)人:武汉大学
类型:发明
国别省市:湖北;42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1