一种基于重排序的代码搜索去偏差方法及系统

文档序号:37378236发布日期:2024-03-22 10:30阅读:9来源:国知局
一种基于重排序的代码搜索去偏差方法及系统

本发明涉及代码搜索,特别指一种基于重排序的代码搜索去偏差方法及系统。


背景技术:

1、目前,大多数的代码搜索技术为基于信息检索搜索技术,例如linstead等人提出了sourcerer,一种基于信息检索的代码搜索工具,可以用结构化信息对程序的文本内容进行搜索,sourcerer支持按程序实现方式以及按程序结构进行搜索。除此以外,研究者还提供了多种代码搜索方法,例如mcmillan等人提出了portfolio,它通过关键字匹配和pagerank返回一系列结果,研究者从1555个开源java项目,对应于25.4万个类等进行实验,最终确定了最优的代码搜索方法。

2、随着深度学习的发展,代码搜索结合神经网络,辅以自然语言处理技术,已成为趋势。在张开乐撰写的综述中,将代码搜索方法分为基于序列嵌入、基于图嵌入、基于机器学习的嵌入三大类。序列嵌入将查询和代码视为输入模型的序列数据,图嵌入则是将代码通过抽象语法树转换成具有图结构的数据,再作为模型的输入。张理想提出了一种基于多维标注信息的代码搜索技术,其从改进数据集标注方法以及改进搜索方法两个角度来提高代码搜索准确度。针对源代码,首先对其进行去噪,并通过特征融合得到多维度信息,再者利用同义词对数据进行重构,以增强模型搜索语句的理解能力。gu x等人提出了一种基于循环神经网络的代码搜索模型,核心思想是利用余弦相似度来计算搜索自然语言查询语句和程序代码段的语义相似度,由两个子网络组成,分别是代码表征子网络和描述表征子网络,前者的输入为代码的函数调用api,函数体字段tokens以及函数名,后者则是自然语言描述,二者的输出都是一个高维嵌入向量。feng z等人基于预训练模型bert提出codebert模型,传统的bert是面向自然语言的预训练模型,而codebert则是一个使用多模态数据进行训练、面向代码语言的新型预训练模型,codebert使用自然语言和6种编程语言进行预训练,并且通过一个混合目标函数进行优化,结合了mlm任务(masked language modeling)和rtd任务(replaced token detection);codebert能与多种代码下游子任务,如代码摘要生成等相结合,并取得较好成绩。

3、虽然代码搜索技术得到大力发展,但在实际进行代码检索过程中,还是难免出现偏差,导致搜索的结果不尽如人意,不利于开发人员对历史代码进行借鉴。

4、因此,如何提供一种基于重排序的代码搜索去偏差方法及系统,实现提升代码搜索的准确性,成为一个亟待解决的技术问题。


技术实现思路

1、本发明要解决的技术问题,在于提供一种基于重排序的代码搜索去偏差方法及系统,实现提升代码搜索的准确性。

2、第一方面,本发明提供了一种基于重排序的代码搜索去偏差方法,包括如下步骤:

3、步骤s1、定义代码搜索的偏差项,获取历史搜索语句以及所述历史搜索语句在代码搜索模型上的历史搜索结果,基于各所述历史搜索语句以及历史搜索结果组成的搜索数据构建数据集,将所述数据集结构化存储至数据库中;

4、步骤s2、从所述数据库中读取各所述搜索数据,计算各所述搜索数据的mrr分数,基于所述偏差项对数据集中的搜索数据进行分组;

5、步骤s3、通过所述历史搜索结果计算各历史搜索语句的重排序分数项;

6、步骤s4、通过搜索界面获取当前搜索语句,实时计算所述当前搜索语句在候选代码库搜索候选代码的mrr分数;所述候选代码库为一系列代码片段的结合,用于检索并返回对查询语句的代码;

7、步骤s5、实时计算所述当前搜索语句与数据集中,最相似的n条所述搜索数据,n为正整数;

8、步骤s6、基于mrr分数对最相似的各所述搜索数据进行聚类,得到高mrr代码区间以及低mrr分数代码区间;

9、步骤s7、基于选择的偏差项,通过所述低mrr分数代码区间中代码的先验偏差项特征,为所述候选代码库上具有相同偏差项的候选代码的mrr分数加上重排序分数项以进行去偏,不断重复直至所有的所述偏差项都完成去偏,基于去偏的各所述候选代码生成代码搜索结果,通过所述搜索界面显示代码搜索结果,基于所述代码搜索结果以及当前搜索语句生成搜索日志,对所述搜索日志进行备份;

10、所述先验偏差项特征为对候选代码库中每条代码计算各个偏差项得到的数值。

11、进一步的,所述步骤s1中,所述偏差项包括长度偏差、抽象语法树节点数据量偏差、ast深度偏差、保留字偏差、词汇重要性偏差以及重叠单词偏差;

12、所述长度偏差用于表征代码搜索模型偏好长度较长的代码片段或者搜索语句;所述抽象语法树节点数据量偏差用于表征代码搜索模型偏好候选代码中ast节点更多的代码;所述ast深度偏差用于表征代码搜索模型偏好候选代码中ast更深的代码;所述保留字偏差用于表征代码搜索模型偏好候选代码中包含更多当前编程语言保留字的代码;所述词汇重要性偏差用于表征代码搜索模型偏好候选代码中包含更多重要性词汇的代码;所述重叠单词偏差用于表征代码搜索模型偏好候选代码中与当前搜索语句重叠单词更多的代码。

13、进一步的,所述步骤s2中,所述基于所述偏差项对数据集中的搜索数据进行分组具体为:

14、与候选代码长度偏差、查询语句长度偏差相关的搜索数据按长度为4的区间进行分组;与词汇重要性偏差相关的搜索数据按长度为0.15的区间进行分组,即将词汇重要性分数升序排序后,将词汇重要性分数按0.15为区间进行划分;与抽象语法树节点数据量偏差、ast深度偏差、保留字偏差以及重叠单词偏差相关的搜索数据按长度为1的区间进行分组。

15、进一步的,所述步骤s3中,所述重排序分数项的计算公式为:

16、;

17、其中,r表示重排序分数项;表示历史搜索语句c的原始分数;所述原始分数为预设代码搜索模型对于给定查询语句,每条候选代码的置信度分数;表示代码搜索模型在训练搜索数据上的mrr分数;表示代码搜索模型在数据集上整体的mrr分数;表示在所有的搜索数据中,代码搜索模型显示低于整体的mrr分数的搜索数据的百分比。

18、进一步的,所述步骤s6具体为:

19、基于mrr分数对最相似的各所述搜索数据进行k-means聚类,得到高mrr代码区间以及低mrr分数代码区间;

20、所述步骤s7中,所述对所述搜索日志进行备份具体为:

21、对所述搜索日志进行哈希计算得到哈希值,随机生成一对称密钥,利用所述对称密钥对搜索日志进行加密,并备份至ipfs系统,将所述哈希值以及ipfs系统返回的索引地址绑定后上传至区块链。

22、第二方面,本发明提供了一种基于重排序的代码搜索去偏差系统,包括如下模块:

23、数据集构建模块,用于定义代码搜索的偏差项,获取历史搜索语句以及所述历史搜索语句在代码搜索模型上的历史搜索结果,基于各所述历史搜索语句以及历史搜索结果组成的搜索数据构建数据集,将所述数据集结构化存储至数据库中;

24、搜索数据分组模块,用于从所述数据库中读取各所述搜索数据,计算各所述搜索数据的mrr分数,基于所述偏差项对数据集中的搜索数据进行分组;

25、重排序分数项计算模块,用于通过所述历史搜索结果计算各历史搜索语句的重排序分数项;

26、候选代码分数计算模块,用于通过搜索界面获取当前搜索语句,实时计算所述当前搜索语句在候选代码库搜索候选代码的mrr分数;所述候选代码库为一系列代码片段的结合,用于检索并返回对查询语句的代码;

27、相似搜索数据计算模块,用于实时计算所述当前搜索语句与数据集中,最相似的n条所述搜索数据,n为正整数;

28、聚类模块,用于基于mrr分数对最相似的各所述搜索数据进行聚类,得到高mrr代码区间以及低mrr分数代码区间;

29、去偏模块,用于基于选择的偏差项,通过所述低mrr分数代码区间中代码的先验偏差项特征,为所述候选代码库上具有相同偏差项的候选代码的mrr分数加上重排序分数项以进行去偏,不断重复直至所有的所述偏差项都完成去偏,基于去偏的各所述候选代码生成代码搜索结果,通过所述搜索界面显示代码搜索结果,基于所述代码搜索结果以及当前搜索语句生成搜索日志,对所述搜索日志进行备份;

30、所述先验偏差项特征为对候选代码库中每条代码计算各个偏差项得到的数值。

31、进一步的,所述数据集构建模块中,所述偏差项包括长度偏差、抽象语法树节点数据量偏差、ast深度偏差、保留字偏差、词汇重要性偏差以及重叠单词偏差;

32、所述长度偏差用于表征代码搜索模型偏好长度较长的代码片段或者搜索语句;所述抽象语法树节点数据量偏差用于表征代码搜索模型偏好候选代码中ast节点更多的代码;所述ast深度偏差用于表征代码搜索模型偏好候选代码中ast更深的代码;所述保留字偏差用于表征代码搜索模型偏好候选代码中包含更多当前编程语言保留字的代码;所述词汇重要性偏差用于表征代码搜索模型偏好候选代码中包含更多重要性词汇的代码;所述重叠单词偏差用于表征代码搜索模型偏好候选代码中与当前搜索语句重叠单词更多的代码。

33、进一步的,所述搜索数据分组模块中,所述基于所述偏差项对数据集中的搜索数据进行分组具体为:

34、与候选代码长度偏差、查询语句长度偏差相关的搜索数据按长度为4的区间进行分组;与词汇重要性偏差相关的搜索数据按长度为0.15的区间进行分组,即将词汇重要性分数升序排序后,将词汇重要性分数按0.15为区间进行划分;与抽象语法树节点数据量偏差、ast深度偏差、保留字偏差以及重叠单词偏差相关的搜索数据按长度为1的区间进行分组。

35、进一步的,所述重排序分数项计算模块中,所述重排序分数项的计算公式为:

36、;

37、其中,r表示重排序分数项;表示历史搜索语句c的原始分数;所述原始分数为预设代码搜索模型对于给定查询语句,每条候选代码的置信度分数;表示代码搜索模型在训练搜索数据上的mrr分数;表示代码搜索模型在数据集上整体的mrr分数;表示在所有的搜索数据中,代码搜索模型显示低于整体的mrr分数的搜索数据的百分比。

38、进一步的,所述聚类模块具体用于:

39、基于mrr分数对最相似的各所述搜索数据进行k-means聚类,得到高mrr代码区间以及低mrr分数代码区间;

40、所述去偏模块中,所述对所述搜索日志进行备份具体为:

41、对所述搜索日志进行哈希计算得到哈希值,随机生成一对称密钥,利用所述对称密钥对搜索日志进行加密,并备份至ipfs系统,将所述哈希值以及ipfs系统返回的索引地址绑定后上传至区块链。

42、本发明的优点在于:

43、通过定义代码搜索的偏差项,获取历史搜索语句以及历史搜索结果,基于各历史搜索语句以及历史搜索结果组成的搜索数据构建数据集,接着计算各搜索数据的mrr分数,基于偏差项对数据集中的搜索数据进行分组,通过历史搜索结果计算各历史搜索语句的重排序分数项;接着计算当前搜索语句在候选代码库搜索候选代码的mrr分数,计算当前搜索语句与数据集中,最相似的n条所述搜索数据,基于mrr分数对最相似的各搜索数据进行聚类,得到高mrr代码区间以及低mrr分数代码区间;最后基于选择的偏差项,通过低mrr分数代码区间中代码的先验偏差项特征,为候选代码库上具有相同偏差项的候选代码的mrr分数加上重排序分数项以进行去偏,不断重复直至所有的偏差项都完成去偏;即通过检索当前搜索语句与数据集中相似的搜索数据,将这些相似的搜索数据作为先验知识,再基于重排序技术对包括长度偏差、抽象语法树节点数据量偏差、ast深度偏差、保留字偏差、词汇重要性偏差以及重叠单词偏差的偏差项依次进行去偏差操作,进而极大的提升了代码搜索的准确性。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1