CN117992572A - 一种基于预训练模型的代码搜索系统及方法 - Google Patents

一种基于预训练模型的代码搜索系统及方法 Download PDF

Info

Publication number
CN117992572A
CN117992572A CN202410155275.6A CN202410155275A CN117992572A CN 117992572 A CN117992572 A CN 117992572A CN 202410155275 A CN202410155275 A CN 202410155275A CN 117992572 A CN117992572 A CN 117992572A
Authority
CN
China
Prior art keywords
natural language
sequence
code segment
code
vector
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.)
Pending
Application number
CN202410155275.6A
Other languages
English (en)
Inventor
印莹
杨四海
赵宇海
Original Assignee
东北大学
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by 东北大学 filed Critical 东北大学
Priority to CN202410155275.6A priority Critical patent/CN117992572A/zh
Publication of CN117992572A publication Critical patent/CN117992572A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供一种基于预训练模型的代码搜索系统及方法,涉及代码搜索技术领域。该系统及方法首先提取每段代码的自然语言描述序列以及每一段代码片段的Token序列;再提取Token序列T中的特征,得到Token序列的特征向量;并对每段代码对应的自然语言描述序列N进行特征提取,从而生成对应的自然语言描述的特征向量;然后计算代码片段的特征向量和自然语言描述的特征向量之间的相似度;迭代执行以上过程最终产出每个代码片段的特征向量;再将各代码片段的特征向量通过聚类算法聚类成M个向量簇;对于用户的查询语句,在经过训练后的CodeBERT模型、聚类后的特征向量以及代码库中存储的代码片段序列P的基础上进行代码搜索工作。

Description

一种基于预训练模型的代码搜索系统及方法
技术领域
本发明涉及代码搜索技术领域,尤其涉及一种基于预训练模型的代码搜索系统及方法。
背景技术
代码搜索任务是帮助开发人员可以通过搜索一个大规模的代码库来重用以前编写的代码片段的行为。代码搜索需要用户输入一段描述代码功能的自然语言,然后模型输出相对应的编程语言供用户使用。代码搜索技术可以大大降低开发人员编写代码的时间,提升工作效率,并且提升软件质量。
在早期,编程语言和自然语言的搜索主要通过检索技术实现。CODEnn模型第一次将代码片段和自然语言描述联合嵌入到高维向量空间中,这样代码片段及其相应的描述就具有相似的向量。使用统一的向量表示,可以根据其向量检索与自然语言查询相关的代码片段。语义相关的单词也可以被识别,在查询中可以处理无关/有噪声的关键字。其性能相比于传统的检索技术有较大提升。更为重要的是,CODEnn提出了统一编程语言和自然语言到同一维度的概念,为后来的模型指出一条新的方向。
如今基于转换器的预训练语言模型,如BERT模型、RoBERTa模型等,在自然语言处理(NLP)任务中取得了巨大的成功。CodeBERT模型是一个结合了源代码和自然语言描述的双峰预训练模型。该模型包含了替换的令牌检测的训练前任务,即检测从生成器中采样的可信的备选方案。这使模型能够同时利用NL-PL对的“双峰”数据和“单峰”数据,其中前者为模型训练提供了输入令牌,而后者有助于学习更好的生成器。GraphCodeBERT模型,通过在数据流图上引入边缘掩蔽技术来保留源代码的语法结构。GraphCodeBERT模型是第一个考虑预训练代码表示的代码结构的预训练模型。
CODnn模型在提取代码片段特征的过程中只关注了代码的文本信息,却遗漏了代码独有的图形结构特征。这种遗漏造成了特征提取的不完整性,进而影响了代码搜索技术的准确性。
CodeBERT和GraphCodeBERT预训练模型在精确度层面为代码搜索技术带来了显著的提升,但它未能充分考虑编程语言中语义信息和结构信息。这个遗漏的细节可能会导致模型的表现出现波动,例如当两个功能相同的代码段存在微小的变量名或代码结构的差异时,模型对它们的评分可能会受到影响。同时,这些建模方法侧重于提高代码搜索的精准度,却未充分考虑在庞大的代码数据库中进行代码搜索所需的时间问题。在处理高维度的编程语言向量和自然语言向量时,经常会面临一个挑战,即模型可能需要较长的时间来执行搜索操作。因此,软件工程领域迫切需要寻求一种既迅速又准确的代码搜索技术,以满足开发人员日益增长的需求。
发明内容
本发明要解决的技术问题是针对上述现有技术的不足,提供一种基于预训练模型的代码搜索系统及方法,实现代码的高效搜索。
为解决上述技术问题,本发明所采取的技术方案是:
一方面,本发明提供一种基于预训练模型的代码搜索系统,包括数据采集模块、代码片段预处理模块、Token特征提取模块、自然语言预处理模块、自然语言特征提取模块、自注意力嵌入模块、句子相似度计算模块、相似度计算模块和聚类模块;
所述数据采集模块采集原始代码片段数据集,并将该数据集划分为训练集、验证集和测试集;所述原始代码片段数据集包括原始代码片段集合以及原始代码片段所对应的自然语言描述;
所述代码片段预处理模块将数据采集模块获取的原始代码片段数据集进行预处理,提取每个代码片段的关键特征;所述每个代码片段的关键特征是分割代码片段的Token序列;
所述Token特征提取模块接受代码片段预处理模块输出的Token序列,并将这些序列输入到多层感知机中,提取Token序列中内在的特征信息,产生一系列Token特征向量;
所述自然语言预处理模块利用分词工具分别对用户输入的查询语句和原始代码片段所对应的自然语言描述进行分词处理,同时去除其中的特殊字符,得到用户输入的查询语句对应的自然语言序列Q和原始代码片段所对应的自然语言描述序列N;
所述自然语言特征提取模块接收来自自然语言预处理模块的查询语句对应的自然语言序列Q以及原始代码片段所对应的自然语言描述序列N,并将序列Q和序列N输入至CodeBERT模型中以抽取其中含有的特征,得到代表查询语句对应的自然语言序列Q的自然语言特征向量QV以及原始代码片段所对应的自然语言描述序列N的自然语言特征向量VN
所述自注意力嵌入模块接收Token特征提取模块输出的Token特征向量以及自然语言特征提取模块输出的自然语言特征向量;通过编码器的掩蔽语言建模和替换令牌检测两个预训练任务对CodeBERT模型进行训练;同时使用交叉熵损失以及对比学习损失函数对模型进行损失评估,直到相似度损失收敛;并且最后将接收的特征向量应用不同权重的注意力机制生成了一个综合特征表示,即得到代码片段的特征向量;
所述句子相似度计算模块利用词汇表将代码片段预处理模块生成的代码片段的Token序列以及自然语言预处理模块生成的用户输入的查询语句的自然语言序列Q转换成高维向量,然后通过句子相似度算法计算并得出代码片段的Token序列和自然语言序列Q的句子相似度得分;
所述相似度计算模块接收自注意力嵌入模块得到的代码片段的最终特征向量,以及自然语言特征提取模块得到的自然语言特征向量QV;计算自然语言特征向量QV与所有代码片段的最终特征向量之间的余弦相似度;然后,将这个余弦相似度得分与句子相似度计算模块得到的句子相似度得分进行加权计算以获得代码片段和自然语言序列的最终相似度得分,挑选出与自然语言查询最为相似的特征向量,并将相应的代码片段作为搜索结果返回给用户;
所述聚类模块利用聚类算法在高维空间中评估代码片段之间的相似性,并基于这些相似性把相近的代码片段归集成簇;在用户发起搜索请求时,首先确定用户的自然语言描述与哪个向量簇的相似度最高;然后,通过自注意力嵌入模块以及相似度计算模块将特定的向量簇进行相似度分析并识别出最匹配的代码片段,最后把最匹配的代码片段作为结果反馈给用户。
另一方面,本发明还提供一种基于预训练模型的代码搜索方法,包括以下步骤:
步骤1:采用数据采集模块采集不同编程语言对应的原始代码片段集合以及原始代码片段所对应的自然语言描述;
步骤2:通过自然语言预处理模块提取每段代码的自然语言描述序列N;
使用分词工具jieba对每一段代码片段对应的自然语言描述进行分词处理,并过滤掉分词结果中包含的特殊符号,得到每一代码片段的自然语言描述序列N;其中,N={n1,n2,...,nN}表示自然语言描述序列中所有单词的集合,自然语言描述序列的长度为N;
步骤3:通过代码片段预处理模块提取每一段代码片段的Token序列T;
首先根据不同编程语言的编码规范进行分词,得到代码片段序列P,其中P={p1,p2,...,pp}表示代码片段中所有单词的集合,p为代码片段的单词总数;移除关键词和停用词后得到代码片段的Token序列T,其中T={t1,t2,...tt}表示所述Token序列中所有单词的集合,t为Token序列的单词总数;
步骤4:利用Token特征提取模块,提取Token序列T中的特征,得到Token序列的特征向量VT
通过词汇表将Token序列T中的编程语言单词映射到高维向量,得到Token序列的特征向量VT
步骤5:利用自然语言特征提取模块,对每段代码对应的自然语言描述序列N进行特征提取,从而生成对应的自然语言描述的特征向量VN
通过词汇表将自然语言描述序列N中的自然语言单词映射到高维向量,得到自然语言描述序列的特征向量VN
步骤6:通过注意力机制嵌入模块计算代码片段的特征向量VT和自然语言描述的特征向量VN之间的相似度;
步骤7:重复执行步骤4到步骤6的过程,直到相似度损失函数趋于稳定,这一过程将最终产出每个代码片段的特征向量,并得到Token特征提取过程、注意力嵌入过程和自然语言特征提取过程的最佳参数;
通过交叉熵损失函数和对比学习损失函数对CodeBERT模型进行损失评估,当相似度损失趋于稳定后,产生最终Token序列的特征向量Tv,该特征向量即为代码片段的特征向量;
步骤8:采用DS-cluster聚类算法将各代码片段的特征向量聚类成M个向量簇;
步骤8.1:输入各代码片段对应的Token序列特征向量Tv={tv1,tv2,...tvn}和超参数距离阈值eps;
步骤8.2:针对特征向量Tv,计算每两个特征向量的欧氏距离,得到距离矩阵MN*N
步骤8.3:构造次序队列order和聚类队列cluster;
步骤8.4:新建初始值为0的变量i,j,执行双重循环,如果特征向量ti不存在于队列order中且Mi,j是当前矩阵M中的最小值,那么将ti加入队列order中,并且将Mi,j赋值为无穷大;
步骤8.5:重复执行步骤8.4,每次循环令i+1,j+1,直到i>=N且j>=N退出循环;
步骤8.6:新建初始值为0变量k和初始值为1的变量z,如果特征向量torderz与torderz-1的欧式距离Morderz,orderz-1<=eps,那么说明torderz与当前簇的当前结点torderz-1的欧式距离小于等于距离阈值eps,则认为torderz属于当前向量簇中,否则k+1;
步骤8.7:令z+1并且重复执行步骤8.6直到z>=N;
步骤8.8:输出聚类队列cluster;
步骤9:对于用户的查询语句q,在经过训练后的CodeBERT模型、聚类后的特征向量以及代码库中存储的代码片段序列P的基础上进行代码搜索工作;
步骤9.1:在用户输入查询语句q时,利用分词工具进行处理成为自然语言序列Q并过滤其中的特殊符号;
使用分词工具对每一段用户查询语句进行分词处理,并过滤掉分词结果中包含的特殊符号,得到用户查询语句对应的自然语言序列Q;其中,Q={q1,q2,...,qq}表示查询语句序列中所有单词的集合,其中查询语句的自然语言的长度为q;
步骤9.2:将查询语句对应的自然语言序列Q通过自然语言特征提取模块得到自然语言特征向量QV
步骤9.3:通过聚类算法定位到与自然语言特征向量QV最相似的聚类簇,并在该聚类簇中通过计算自然语言特征向量QV与各个代码片段最终的特征向量Tv之间的余弦相似度,得到余弦相似度分数集合S1;
步骤9.4:通过SRank句子相似性算法分别计算出每对查询语句序列Qi与代码片段序列Pi的句子相似性得分,并得到句子相似性分数集合S2;
步骤9.4.1:输入查询语句序列Q,以及代码片段序列P,并且新建初始值为0的变量match;
步骤9.4.2:分别将查询语句序列Q和代码片段序列P输入词汇表中得到对应的向量集Qc、Pc;
步骤9.4.3:依次比较向量集Qc和Pc中的每一个向量,如果存在向量集Qc中的向量qi等于向量集Pc中的向量pj,那么令match+1;
步骤9.4.4:计算句子相似性得分score=match/(log(len(Qc))+log(len(Pc)));
步骤9.4.5:对于每一组查询语句序列Q,以及代码片段序列P,重复步骤9.4.1到步骤9-4-4,得到句子相似性分数集合S2;
步骤9.5:通过对余弦相似度分数集合S1和句子相似性分数集合S2进行加权处理得到最优化的相似性分数集合S,将集合S中分数最靠前的若干代码片段返回给用户。
采用上述技术方案所产生的有益效果在于:本发明提供的一种基于预训练模型的代码搜索系统及方法,(1)在编码器阶段通过引入对比学习损失函数来增强模型对代码片段语义和结构方面的学习能力,并且提升了模型的泛化能力。(2)提出了SRank句子相似性计算算法。该算法首先使用词汇表将编程语言和自然语言转化为特征向量,然后再通过关键词匹配技术来进一步提升代码搜索的精确性。(3)提出了DS-cluster聚类算法。通过先使用DS-cluster聚类算法对代码库代码片段进行聚类,再在聚类簇上进行代码搜索的手段,加快了搜索速度,提升了搜索效率。
本发明通过将对比学习技术融入到CodeBERT模型中,然后使用句子相似性算法进一步优化CodeBERT模型的搜索准确性的性能,最后通过DS-cluster聚类算法加快模型进行代码搜索速度的创新策略,大幅度强化了代码搜索的性能。
附图说明
图1为本发明实施例提供的一种基于预训练模型的代码搜索系统的结构框图;
图2为本发明实施例提供的一种基于预训练模型的代码搜索方法的流程图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
本实施例中,一种基于预训练模型的代码搜索系统,如图1所示,包括数据采集模块、代码片段预处理模块、Token特征提取模块、自然语言预处理模块、自然语言特征提取模块、自注意力嵌入模块、句子相似度计算模块、相似度计算模块和聚类模块;
所述数据采集模块采集原始代码片段数据集,并将该数据集划分为训练集、验证集和测试集;所述原始代码片段数据集包括原始代码片段集合以及原始代码片段所对应的自然语言描述;
所述代码片段预处理模块将数据采集模块获取的原始代码片段数据集进行预处理,提取每个代码片段的关键特征;所述每个代码片段的关键特征是分割代码片段的Token序列;
所述Token特征提取模块接受代码片段预处理模块输出的Token序列,并将这些序列输入到多层感知机(MLP)中,提取Token序列中内在的特征信息,产生一系列Token特征向量;
所述自然语言预处理模块利用jieba分词工具分别对用户输入的查询语句和原始代码片段所对应的自然语言描述进行分词处理,同时去除其中的特殊字符,得到用户输入的查询语句对应的自然语言序列Q和原始代码片段所对应的自然语言描述序列N;
所述自然语言特征提取模块接收来自自然语言预处理模块的查询语句对应的自然语言序列Q以及原始代码片段所对应的自然语言描述序列N,并将序列Q和序列N输入至CodeBERT模型中以抽取其中含有的特征,得到代表查询语句对应的自然语言序列Q的自然语言特征向量QV原始代码片段所对应的自然语言描述序列N的自然语言特征向量VN
所述自注意力嵌入模块接收Token特征提取模块输出的Token特征向量以及自然语言特征提取模块输出的自然语言特征向量;通过编码器的掩蔽语言建模(MLM)和替换令牌检测(RTD)两个预训练任务对CodeBERT模型进行训练;同时使用交叉熵损失以及对比学习损失函数对模型进行损失评估,直到相似度损失收敛;并且最后将接收的特征向量应用不同权重的注意力机制生成了一个综合特征表示,即得到代码片段的特征向量;
所述句子相似度计算模块利用词汇表将代码片段预处理模块生成的代码片段的Token序列以及自然语言预处理模块生成的用户输入的查询语句的自然语言序列Q转换成高维向量,然后通过句子相似度算法计算并得出代码片段的Token序列和自然语言序列Q的句子相似度得分;
所述相似度计算模块接收自注意力嵌入模块得到的代码片段的最终特征向量,以及自然语言特征提取模块得到的自然语言特征向量QV;计算自然语言特征向量QV与所有代码片段的最终特征向量之间的余弦相似度;然后,将这个余弦相似度得分与句子相似度计算模块得到的句子相似度得分进行加权计算以获得代码片段和自然语言序列的最终相似度得分,挑选出与自然语言查询最为相似(即最终相似度得分最高)的特征向量,并将相应的代码片段作为搜索结果返回给用户;
所述聚类模块利用聚类算法在高维空间中评估代码片段之间的相似性,并基于这些相似性把相近的代码片段归集成簇;在用户发起搜索请求时,首先确定用户的自然语言描述与哪个向量簇的相似度最高;然后,通过自注意力嵌入模块以及相似度计算模块将特定的向量簇细致地进行相似度分析并识别出最匹配的代码片段,最后把最匹配的代码片段作为结果反馈给用户。
本实施例中,一种基于预训练模型的代码搜索方法,如图2所示,包括以下步骤:
步骤1:采用数据采集模块采集不同编程语言对应的原始代码片段集合以及原始代码片段所对应的自然语言描述;
本实施例中,从公开数据集CodesearchNet数据集中获取不同编程语言对应的原始代码片段集合以及原始代码片段所对应的自然语言描述。该数据集涵盖了6种编程语言,包括Java、Python、JavaScript、Ruby、Go和PHP,并提供了训练集、验证集和测试集。该数据集种各种语言在训练集上的统计信息如表1所示。
表1CodesearchNet数据集统计信息
训练集语言 数量
GO 319,256
JAVA 500,754
JAVASCRIPT 143,252
PHP 662,907
PYTHON 458,219
RUBY 52,905
所有 2,137,293
步骤2:通过自然语言预处理模块提取每段代码的自然语言描述序列N;
使用分词工具jieba对每一段代码片段对应的自然语言描述进行分词处理,并过滤掉分词结果中包含的特殊符号,得到每一代码片段的自然语言描述序列N;其中,N={n1,n2,...,nN}表示自然语言描述序列中所有单词的集合,自然语言描述序列的长度为N;
步骤3:通过代码片段预处理模块提取每一段代码片段的Token序列T;
首先根据不同编程语言的编码规范进行分词,例如Java代码片段的方法名是以驼峰规则来命名,因此对于代码片段的方法名和变量,使用驼峰规则进行分词,得到代码片段序列P,其中P={p1,p2,...,pp}表示代码片段中所有单词的集合,p为代码片段的单词总数;由于编程语言存在关键词和停用词,所以在并移除关键词和停用词后得到代码片段的Token序列T,其中T={t1,t2,...tt}表示所述Token序列中所有单词的集合,t为Token序列的单词总数;
步骤4:利用Token特征提取模块,提取Token序列T中的特征,得到Token序列的特征向量VT
通过词汇表将Token序列T中的编程语言单词映射到高维向量,得到Token序列的特征向量VT
步骤5:利用自然语言特征提取模块,对每段代码对应的自然语言描述序列N进行特征提取,从而生成对应的自然语言描述的特征向量VN
通过词汇表将自然语言描述序列N中的自然语言单词映射到高维向量,得到自然语言描述序列的特征向量VN
步骤6:通过注意力机制嵌入模块计算代码片段的特征向量VT和自然语言描述的特征向量VN之间的相似度;
本实施方式具体是,注意力计算公式如下:
其中,Q为查询矩阵;K为键矩阵;V为查询矩阵;dk表示矩阵K的维度大小,Q和K的注意力函数值为对权重/>经过softmax函数处理,作为查询矩阵V的权重,加权输出即为Attention(Q,K,V)的值;
步骤7:重复执行步骤4到步骤6的过程,直到相似度损失函数趋于稳定,这一过程将最终产出每个代码片段的特征向量,并得到Token特征提取过程、注意力嵌入过程和自然语言特征提取过程的最佳参数;
本实施方式具体是,首先损失函数公式如公式2表示:
L(θ)=L(θ1)+L(θ2) (2)
L(θ1)是二分类交叉熵损失函数,如公式3所示:
其中,si是CodeBERT模型的评估分数,yi是目标预测值,f(x)是sigmod激活函数,f(x)如公式(4)所示:
L(θ2)是对比学习损失函数,如公式(5)所示:
其中,q是查询语句即自然语言的特征向量,k+是正例的token序列的特征向量,k-是负例的token序列的特征向量,γ是损失函数的超参数;该损失函数通过对比学习策略拉近了正样本特征向量在高维空间的距离,并且推远了负样本特征向量在高维空间的距离。并且提升了模型对编程语言的泛化能力。
通过交叉熵损失函数和对比学习损失函数对CodeBERT模型进行损失评估,当相似度损失趋于稳定后,产生最终Token序列的特征向量Tv,该特征向量即为代码片段的特征向量;
步骤8:采用DS-cluster聚类算法将各代码片段的特征向量通过聚类算法聚类成M个向量簇;
本发明提出了DS-cluster聚类算法,并将原始代码片段集合中的代码片段通过DS-cluster聚类算法聚类成16个向量簇后,再进行代码搜索操作。DS-cluster聚类算法的引入大大提升了代码搜索的速度。
步骤8.1:输入各代码片段对应的Token序列特征向量Tv={tv1,tv2,...tvn}和超参数距离阈值eps;
步骤8.2:针对特征向量Tv,计算每两个特征向量的欧氏距离,得到距离矩阵MN*N
步骤8.3:构造次序队列order和聚类队列cluster;
步骤8.4:新建初始值为0的变量i,j,执行双重循环,如果特征向量ti不存在于队列order中且Mi,j是当前矩阵M中的最小值,那么将ti加入队列order中,并且将Mi,j赋值为无穷大;
步骤8.5:重复执行步骤8.4,每次循环令i+1,j+1,直到i>=N且j>=N退出循环;
步骤8.6:新建初始值为0变量k和初始值为1的变量z,如果特征向量torderz与torderz-1的欧式距离Morderz,orderz-1<=eps,则认为torderz属于当前向量簇中,否则k+1;
步骤8.7:令z+1并且重复执行步骤8.6直到z>=N;
步骤8.8:输出聚类队列cluster。
本实施例中,DS-cluster算法实现如表2所示。
表2DS-cluster算法实现
步骤9:对于用户的查询语句q,在经过训练后的CodeBERT模型、聚类后的特征向量以及代码库中存储的代码片段序列P的基础上进行代码搜索工作;
步骤9.1:在用户输入查询语句q时,利用分词工具进行处理成为自然语言序列Q并过滤其中的特殊符号,例如超链接http、https,分割词<s>,后缀词.doc、.png等词;
本实施方式中具体是,使用分词工具jieba对每一段用户查询语句进行分词处理,并过滤掉分词结果中包含的特殊符号,得到用户查询语句对应的自然语言序列Q;其中,Q={q1,q2,...,qq}表示所述查询语句序列中所有单词的集合,其中查询语句的自然语言的长度为q;
步骤9.2:将查询语句对应的自然语言序列Q通过自然语言特征提取模块得到自然语言特征向量QV
本实施方式中具体是,通过词汇表将自然语言序列Q中的自然语言单词映射到高维向量,得到自然语言序列的特征向量QV
步骤9.3:通过聚类算法定位到与自然语言特征向量QV最相似的聚类簇,并在该聚类簇中通过计算自然语言特征向量QV与各个代码片段最终的特征向量Tv之间的余弦相似度,得到余弦相似度分数集合S1;
步骤9.4:通过SRank句子相似性算法分别计算出每对查询语句序列Qi与代码片段序列Pi的句子相似性得分,并得到句子相似性分数集合S2;
步骤9.4.1:输入查询语句序列Q,以及代码片段序列P,并且新建初始值为0的变量match;
步骤9.4.2:分别将查询语句序列Q和代码片段序列P输入词汇表中得到对应的向量集Qc、Pc;
步骤9.4.3:依次比较向量集Qc和Pc中的每一个向量,如果存在向量集Qc中的向量qi等于向量集Pc中的向量pj,那么令match+1;
步骤9.4.4:计算句子相似性得分score=match/(log(len(Qc))+log(len(Pc)));
步骤9.4.5:对于每一组查询语句序列Q,以及代码片段序列P,重复步骤9.4.1到步骤9-4-4,得到句子相似性分数集合S2;
本发明提出了SRank句子相似性算法,并通过SRank算法评估每对自然语言序列和代码片段序列的句子相似性。SRank算法实现如表3所示;
表3SRank句子相似性算法实现
步骤9.5:通过对余弦相似度分数集合S1和句子相似性分数集合S2进行加权处理得到最优化的相似性分数集合S,将集合S中分数最靠前的若干代码片段返回给用户。
本实施例采用两个广泛用于代码搜索的评估指标,平均倒数秩MRR(MeanReciprocal Rank)和搜索时间t(单位:秒)来评估本发明的代码搜索方法的准确率和高效性。
其中,MRR是国际上通用的对搜索算法进行评估的指标,MRR的值越高,代码搜索的准确率越高;MRR的计算公式如公式(6)所示:
其中,q表示用户的一个查询,Qall是所有查询q的集合,|Qall|表示Qall中包含的查询q的数量,Frankq表示查询q的Frank值;查询q的Frank值指的是,查询q返回的代码检索结果中与查询q相符的结果第一次出现的位置,又称最佳命中排名。
为了表明本发明提出的代码搜索方法的准确性和高效性,本实施例还在数据集CodeSearchNet上评估了CodeBERT模型和本发明提出的代码搜索方法。MRR指标结果如表4所示,时间指标如表5所示,结果表明本发明提出的代码搜索方法在比起CodeBERT模型,在准确性和高效性都有了良好的提升。
表4在CodeSearchNet数据集上MRR指标
MRR Python Java Go Ruby PHP JavaScript
CodeBERT 85.59 72.61 82.06 70.12 69.21 66.02
本发明方法 86.28 75.30 82.11 70.51 70.92 67.58
表5在CodeSearchNet数据集上时间指标
检索时间t(单位:秒)
CodeBERT 22.47
本发明方法 2.30
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明权利要求所限定的范围。

Claims (10)

1.一种基于预训练模型的代码搜索系统,其特征在于:包括数据采集模块、代码片段预处理模块、Token特征提取模块、自然语言预处理模块、自然语言特征提取模块、自注意力嵌入模块、句子相似度计算模块、相似度计算模块;
所述数据采集模块采集原始代码片段数据集,并将该数据集划分为训练集、验证集和测试集;所述原始代码片段数据集包括原始代码片段集合以及原始代码片段所对应的自然语言描述;
所述代码片段预处理模块将数据采集模块获取的原始代码片段数据集进行预处理,提取每个代码片段的关键特征;所述每个代码片段的关键特征是分割代码片段的Token序列;
所述Token特征提取模块接受代码片段预处理模块输出的Token序列,并将这些序列输入到多层感知机中,提取Token序列中内在的特征信息,产生一系列Token特征向量;
所述自然语言预处理模块利用分词工具分别对用户输入的查询语句和原始代码片段所对应的自然语言描述进行分词处理,同时去除其中的特殊字符,得到用户输入的查询语句对应的自然语言序列Q和原始代码片段所对应的自然语言描述序列N;
所述自然语言特征提取模块接收来自自然语言预处理模块的查询语句对应的自然语言序列Q以及原始代码片段所对应的自然语言描述序列N,并将序列Q和序列N输入至CodeBERT模型中以抽取其中含有的特征,得到代表查询语句对应的自然语言序列Q的自然语言特征向量QV原始代码片段所对应的自然语言描述序列N的自然语言特征向量VN
所述自注意力嵌入模块接收Token特征提取模块输出的Token特征向量以及自然语言特征提取模块输出的自然语言特征向量;通过编码器的掩蔽语言建模和替换令牌检测两个预训练任务对CodeBERT模型进行训练;同时使用交叉熵损失以及对比学习损失函数对模型进行损失评估,直到相似度损失收敛;并且最后将接收的特征向量应用不同权重的注意力机制生成了一个综合特征表示,即得到代码片段的特征向量;
所述句子相似度计算模块利用词汇表将代码片段预处理模块生成的代码片段的Token序列以及自然语言预处理模块生成的用户输入的查询语句的自然语言序列Q转换成高维向量,然后通过句子相似度算法计算并得出代码片段的Token序列和自然语言序列Q的句子相似度得分;
所述相似度计算模块接收自注意力嵌入模块得到的代码片段的最终特征向量,以及自然语言特征提取模块得到的自然语言特征向量QV;计算自然语言特征向量QV与所有代码片段的最终特征向量之间的余弦相似度;然后,将这个余弦相似度得分与句子相似度计算模块得到的句子相似度得分进行加权计算以获得代码片段和自然语言序列的最终相似度得分,挑选出与自然语言查询最为相似的特征向量,并将相应的代码片段作为搜索结果返回给用户。
2.根据权利要求1所述的一种基于预训练模型的代码搜索系统,其特征在于:还包括聚类模块;所述聚类模块利用聚类算法在高维空间中评估代码片段之间的相似性,并基于这些相似性把相近的代码片段归集成簇;在用户发起搜索请求时,首先确定用户的自然语言描述与哪个向量簇的相似度最高;然后,通过自注意力嵌入模块以及相似度计算模块将特定的向量簇进行相似度分析并识别出最匹配的代码片段,最后把最匹配的代码片段作为结果反馈给用户。
3.一种基于预训练模型的代码搜索方法,基于权利要求1所述系统实现,其特征在于:包括以下步骤:
步骤1:采用数据采集模块采集不同编程语言对应的原始代码片段集合以及原始代码片段所对应的自然语言描述;
步骤2:通过自然语言预处理模块提取每段代码的自然语言描述序列N;
步骤3:通过代码片段预处理模块提取每一段代码片段的Token序列T;
步骤4:利用Token特征提取模块,提取Token序列T中的特征,得到Token序列的特征向量VT
步骤5:利用自然语言特征提取模块,对每段代码对应的自然语言描述序列N进行特征提取,从而生成对应的自然语言描述的特征向量VN
步骤6:通过注意力机制嵌入模块计算代码片段的特征向量VT和自然语言描述的特征向量VN之间的相似度;
步骤7:重复执行步骤4到步骤6的过程,直到相似度损失函数趋于稳定,这一过程将最终产出每个代码片段的特征向量,并得到Token特征提取过程、注意力嵌入过程和自然语言特征提取过程的最佳参数;
步骤8:将各代码片段的特征向量通过聚类算法聚类成M个向量簇;
步骤9:对于用户的查询语句q,在经过训练后的CodeBERT模型、聚类后的特征向量以及代码库中存储的代码片段序列P的基础上进行代码搜索工作。
4.根据权利要求3所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤2使用分词工具对每一段代码片段对应的自然语言描述进行分词处理,并过滤掉分词结果中包含的特殊符号,得到每一代码片段的自然语言描述序列N;其中,N={n1,n2,...,nN}表示自然语言描述序列中所有单词的集合,自然语言描述序列的长度为N。
5.根据权利要求4所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤3的具体方法为:
首先根据不同编程语言的编码规范进行分词,得到代码片段序列P,其中P={p1,p2,...,pp}表示代码片段中所有单词的集合,p为代码片段的单词总数;移除关键词和停用词后得到代码片段的Token序列T,其中T={t1,t2,...tt}表示所述Token序列中所有单词的集合,t为Token序列的单词总数。
6.根据权利要求5所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤4通过词汇表将Token序列T中的编程语言单词映射到高维向量,得到Token序列的特征向量VT;所述步骤5通过词汇表将自然语言描述序列N中的自然语言单词映射到高维向量,得到自然语言描述序列的特征向量VN
7.根据权利要求6所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤7通过交叉熵损失函数和对比学习损失函数对CodeBERT模型进行损失评估,当相似度损失趋于稳定后,产生最终Token序列的特征向量Tv,该特征向量即为代码片段的特征向量。
8.根据权利要求6所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤8采用DS-cluster聚类算法将各代码片段的特征向量聚类成M个向量簇,具体包括:
步骤8.1:输入各代码片段对应的Token序列特征向量Tv={tv1,tv2,...tvn}和超参数距离阈值eps;
步骤8.2:针对特征向量Tv,计算每两个特征向量的欧氏距离,得到距离矩阵MN*N
步骤8.3:构造次序队列order和聚类队列cluster;
步骤8.4:新建初始值为0的变量i,j,执行双重循环,如果特征向量ti不存在于队列order中且Mi,j是当前矩阵M中的最小值,那么将ti加入队列order中,并且将Mi,j赋值为无穷大;
步骤8.5:重复执行步骤8.4,每次循环令i+1,j+1,直到i>=N且j>=N退出循环;
步骤8.6:新建初始值为0变量k和初始值为1的变量z,如果特征向量torderz与torderz-1的欧式距离Morderz,orderz-1<=eps,则认为torderz属于当前向量簇中,否则k+1;
步骤8.7:令z+1并且重复执行步骤8.6直到z>=N;
步骤8.8:输出聚类队列cluster。
9.根据权利要求6所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤9的具体方法为:
步骤9.1:在用户输入查询语句q时,利用分词工具进行处理成为自然语言序列Q并过滤其中的特殊符号;
使用分词工具对每一段用户查询语句进行分词处理,并过滤掉分词结果中包含的特殊符号,得到用户查询语句对应的自然语言序列Q;其中,Q={q1,q2,...,qq}表示查询语句序列中所有单词的集合,其中查询语句的自然语言的长度为q;
步骤9.2:将查询语句对应的自然语言序列Q通过自然语言特征提取模块得到自然语言特征向量QV
步骤9.3:通过聚类算法定位到与自然语言特征向量QV最相似的聚类簇,并在该聚类簇中通过计算自然语言特征向量QV与各个代码片段最终的特征向量Tv之间的余弦相似度,得到余弦相似度分数集合S1;
步骤9.4:通过句子相似性算法分别计算出每对查询语句序列Qi与代码片段序列Pi的句子相似性得分,并得到句子相似性分数集合S2;
步骤9.5:通过对余弦相似度分数集合S1和句子相似性分数集合S2进行加权处理得到最优化的相似性分数集合S,将集合S中分数最靠前的若干代码片段返回给用户。
10.根据权利要求9所述的一种基于预训练模型的代码搜索方法,其特征在于:所述步骤9.4通过SRank句子相似性算法分别计算出每对查询语句序列Qi与代码片段序列Pi的句子相似性得分,具体包括:
步骤9.4.1:输入查询语句序列Q,以及代码片段序列P,并且新建初始值为0的变量match;
步骤9.4.2:分别将查询语句序列Q和代码片段序列P输入词汇表中得到对应的向量集Qc、Pc;
步骤9.4.3:依次比较向量集Qc和Pc中的每一个向量,如果存在向量集Qc中的向量qi等于向量集Pc中的向量pj,那么令match+1;
步骤9.4.4:计算句子相似性得分score=match/(log(len(Qc))+log(len(Pc)));
步骤9.4.5:对于每一组查询语句序列Q,以及代码片段序列P,重复步骤9.4.1到步骤9-4-4,得到句子相似性分数集合S2。
CN202410155275.6A 2024-02-02 2024-02-02 一种基于预训练模型的代码搜索系统及方法 Pending CN117992572A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410155275.6A CN117992572A (zh) 2024-02-02 2024-02-02 一种基于预训练模型的代码搜索系统及方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410155275.6A CN117992572A (zh) 2024-02-02 2024-02-02 一种基于预训练模型的代码搜索系统及方法

Publications (1)

Publication Number Publication Date
CN117992572A true CN117992572A (zh) 2024-05-07

Family

ID=90894912

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410155275.6A Pending CN117992572A (zh) 2024-02-02 2024-02-02 一种基于预训练模型的代码搜索系统及方法

Country Status (1)

Country Link
CN (1) CN117992572A (zh)

Similar Documents

Publication Publication Date Title
CN112215013B (zh) 一种基于深度学习的克隆代码语义检测方法
CN112306494A (zh) 一种基于卷积和循环神经网络的代码分类及聚类方法
CN111291188A (zh) 一种智能信息抽取方法及系统
CN116719520B (zh) 代码生成方法及装置
CN112102813B (zh) 基于用户评论中上下文的语音识别测试数据生成方法
CN115408525B (zh) 基于多层级标签的信访文本分类方法、装置、设备及介质
CN115495555A (zh) 一种基于深度学习的文献检索方法和系统
CN112860898B (zh) 一种短文本框聚类方法、系统、设备及存储介质
CN113836896A (zh) 一种基于深度学习的专利文本摘要生成方法和装置
CN115858750A (zh) 基于自然语言处理的电网技术标准智能问答方法及系统
CN115759071A (zh) 基于大数据的政务敏感信息识别系统和方法
Mustafa et al. Optimizing document classification: Unleashing the power of genetic algorithms
CN112528653B (zh) 短文本实体识别方法和系统
CN117407532A (zh) 一种利用大模型与协同训练进行数据增强的方法
CN115203206A (zh) 数据内容搜索方法、装置、计算机设备及可读存储介质
CN115238705A (zh) 语义解析结果重排序方法及系统
CN115718791A (zh) 文本元素的特定性排序及其应用
CN117992572A (zh) 一种基于预训练模型的代码搜索系统及方法
CN114418033B (zh) 一种利用CodeBert各层表征信息的代码编程语言分类方法
CN114036946B (zh) 一种文本特征提取及辅助检索的系统及方法
CN117421392B (zh) 一种基于词级对齐的代码搜索方法及装置
CN117077688B (zh) 基于自然语言处理的信息分析方法及系统
CN112256838B (zh) 相似域名查找方法、装置及电子设备
CN117112738A (zh) 一种基于海量知识图谱的深度学习问答方法、装置和系统
CN118093776A (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