CN117390130A - 一种基于多模态表示的代码搜索方法 - Google Patents
一种基于多模态表示的代码搜索方法 Download PDFInfo
- Publication number
- CN117390130A CN117390130A CN202210776313.0A CN202210776313A CN117390130A CN 117390130 A CN117390130 A CN 117390130A CN 202210776313 A CN202210776313 A CN 202210776313A CN 117390130 A CN117390130 A CN 117390130A
- Authority
- CN
- China
- Prior art keywords
- code
- tree
- query
- representation
- vectors
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 39
- 239000013598 vector Substances 0.000 claims abstract description 68
- 238000004364 calculation method Methods 0.000 claims abstract description 4
- 238000007781 pre-processing Methods 0.000 claims abstract description 3
- 238000012549 training Methods 0.000 claims description 14
- 239000012634 fragment Substances 0.000 claims description 13
- 230000006870 function Effects 0.000 claims description 10
- 230000008569 process Effects 0.000 claims description 9
- 238000013527 convolutional neural network Methods 0.000 claims description 8
- 238000013461 design Methods 0.000 claims description 6
- 238000011156 evaluation Methods 0.000 claims description 6
- 230000007246 mechanism Effects 0.000 claims description 6
- 238000013459 approach Methods 0.000 claims description 5
- 238000003058 natural language processing Methods 0.000 claims description 5
- 230000001537 neural effect Effects 0.000 claims description 5
- 238000012545 processing Methods 0.000 claims description 5
- 238000013528 artificial neural network Methods 0.000 claims description 4
- 238000002372 labelling Methods 0.000 claims description 4
- 238000012163 sequencing technique Methods 0.000 claims description 4
- 238000000605 extraction Methods 0.000 claims description 3
- 238000012360 testing method Methods 0.000 claims description 3
- 230000009466 transformation Effects 0.000 claims description 3
- 241000282472 Canis lupus familiaris Species 0.000 claims description 2
- 241001494479 Pecora Species 0.000 claims description 2
- 238000002474 experimental method Methods 0.000 claims description 2
- 238000013549 information retrieval technique Methods 0.000 claims description 2
- 230000003993 interaction Effects 0.000 claims description 2
- 238000010801 machine learning Methods 0.000 claims description 2
- 239000011159 matrix material Substances 0.000 claims description 2
- 230000008450 motivation Effects 0.000 claims description 2
- 230000000306 recurrent effect Effects 0.000 claims description 2
- 238000000844 transformation Methods 0.000 claims description 2
- 239000000047 product Substances 0.000 claims 2
- 239000013589 supplement Substances 0.000 claims 1
- 238000005259 measurement Methods 0.000 abstract 2
- 238000012356 Product development Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 230000005012 migration Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 238000013138 pruning Methods 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/3331—Query processing
- G06F16/334—Query execution
- G06F16/3344—Query execution using natural language analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/30—Semantic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Artificial Intelligence (AREA)
- Computational Linguistics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Databases & Information Systems (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Evolutionary Computation (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Machine Translation (AREA)
Abstract
本发明公开一种基于多模态表示的代码搜索方法。本发明的装置包括多模态表示模块、树序列化及简化语义树模块、孪生网络模块和代码搜索模块。本发明的方法的步骤为:从开源软件中获取项目;对收集的代码搜索数据集进行预处理;输入一段自然语言,训练好的模型便将最接近的代码片段搜索出来。本发明利用开源知识构建代码特征度量体系,并利用空间向量相似度计算、链接覆盖率和结点覆盖率的综合评分并完成代码搜索,完善了代码度量角度,提高了代码搜索推荐的准确性。
Description
技术领域
本发明涉及计算机软件领域,具体而言,涉及一种基于多模态表示的代码搜索方法。
背景技术
代码搜索是软件开发中的一项常见活动,它可以帮助开发人员在他们的项目中找到合适的代码片段。它有助于提高开发人员的工作效率,缩短产品开发周期。在开发或维护软件时,人们倾向于重用现有的脚手架或从实际使用示例中学习,而不是浪费时间重新发明轮子。然而,设计一个实用的代码搜索工具是极具挑战性的。大部分搜索引擎对大量开源的代码进行了集中式管理与查询,即使如此,也未能较好地搜索到准确的代码。主要原因有以下两点:
1)无关信息的干扰。
2)可信度无法判断。
为了解决这些问题,深度学习可以成为一种有效的解决方案,因为它具有非常好的学习表示能力和快速推理速度。在代码搜索任务中,也表现较为出色。这些方法在大规模训练数据上表现出色,可以深层次挖掘代码和查询的特征信息,高效率、高性能地替代人工特征提取过程。
发明内容
本发明的内容是提供一种基于多模态表示的代码搜索方法,本发明的目的在于针对上述现有技术的不足,提供一种基于开源知识的代码搜索方法,以解决现有技术没有充分考虑代码本身的特征与特性的问题,然后挖掘用户查询意图与代码语义之间的密切联系,即自然语言与程序语言之间的匹配难题。同时利用代码片段的语义和语法信息,最终达到有效进行特征处理的目的。
实现本发明的思路是:我们将代码片段解析为抽象语法树(AST)。为了使这种树结构更好地用于代码搜索,我们将AST转换为一种新的树结构--简化语义树(SST)。然后,我们通过遍历树结构的方法从SST中提取代码序列和树序列。考虑到SelfAtt模型在各种自然语言处理任务中表现得非常好,我们采用了三个SelfAtt模型作为编码器。代码编码器和树编码器并行处理代码表示,查询编码器处理查询表示。将上述代码序列和树形序列,分别提供给代码编码器和树形编码器,这两个编码器将各自的序列数据转换成令牌向量和树向量,并生成联合向量。查询编码器接收查询序列作为输入,并计算查询向量作为输出。
本发明的代码搜索装置包括多模式学习模块,树序列化及简化语义树模块,孪生网络模块和代码搜索模块。其中:
所述多模式学习模块。是用于通过机器学习的方法实现处理和理解多源模态信息的能力。模态是指某种类型的信息如何存在的方式。例如,为了识别牧羊犬和绵羊,我们可以充分利用各种模式的数据,如颜色、声音和运动模式的特征。多模式学习的目标是建立能够处理和关联多模式数据的模型。它基于这样一个事实,即可以通过不同的方式捕获数据语义。由多个模态的数据产生的表示称为多模态表示。由于多模态学习模型学习特征时考虑了来自不同模态的信息,因此通常比只学习唯一模态的数据的单模态学习模型性能更好。我们的发明中是指从源代码中提取两个模态,从自然语言表示中提取一个模态,并在此基础上采用多模式学习。这两个模态是代码片段的普通表示形式和树序列化表示形式。这两种模式是代码片段的普通和树序列化表示形式。
所述树序列化及简化语义树模块。树序列化表示是通过解析代码生成的数据并写入树结构,然后将树序列化为序列。简化语义树是指本发明设计了一种新的树结构SST(Simplified Semantic Tree)来提取源代码的树序列化表示。SST近似简化了AST的树形结构,并突出了代码片段的语义信息。与AST相比,SST去掉了不必要的树节点,并改进了树节点的标注。尽管AST已经具有树结构并能够进行树序列化,但SST在语义上更具信息性,对各种编程语言也更通用。我们采用基于结构的遍历技术序列化SST。其动机是从树结构中提取线性序列。这些序列是更适用于上述典型编码器的顺序数据。
所述孪生网络模块。孪生网络是一种人工神经网络,用于测量使用相同编码器的相同类型的两个输入之间的相似性。伪孪生网络更灵活,因为它旨在用不同的编码器来衡量不同数据类型的相似性。代码搜索的模型架构遵循了利用伪孪生网络的做法,如图1所示。在该架构中,代码和查询序列分别被馈送到相应的编码器中,并被转换为向量。训练目标是最小化相关代码和查询向量之间的距离。码搜索模型使用向量之间的余弦距离来衡量相似性。一旦经过训练,与给定查询语义最相关的代码片段就是其向量最接近查询向量的代码片段,这些向量由余弦距离度量。学习的目标是确保语义相似的向量尽可能接近。三线损失是基线和我们的模型中使用的目标函数。它将查询向量优化为接近对应的代码向量,但远离其他代码向量。在训练过程中,每个码-查询对(ci,qi)和对应的干扰码片段cj被馈送到码编码器Ec和查询编码器Eq。培训目标是将以下损失降至最低:
三元组损失函数的目标是最大化代码ci和查询qi编码对的内积,同时最小化目标代码片断ci与其干扰码片断cj(i≠j)之间的内积。(ci,qi)和(cj,qi)分别表示阳性样本和阴性样本。用于码搜索的孪生网络有多种可能的编码器。专门用于顺序数据的典型编码器包括:
NBOW:神经词袋(NBOW)简单地计算所有单词嵌入的加权平均值,以获得作为整个语义表示的句子嵌入。
1D-CNN:卷积神经网络(CNN)使用卷积运算来分析不同大小的接收域中的上下文信息。1D-CNN指的是一维序列数据的模型。
BI-RNN:递归神经网络(RNN)使用时间序列形式的隐藏层来捕获依赖关系。BI-RNN串联了向前和向后两个方向的嵌入。
SelfAtt:基于transformer的模型使用自我注意机制和BERT的位置嵌入方式来学习上下文信息。
所述代码搜索模块。代码搜索的规范任务是为给定的自然语言查询找到最相关的代码片段。代码搜索引擎可以用信息检索技术和神经技术来制造。在本发明中,我们主要研究后者。如图2所示,代码-查询对是一段自然语言查询和相应的源代码。该查询可以是目标代码片段的简短文档,如“向成员发送生日消息”。在整个工作中,我们将源代码令牌称为代码序列,将查询令牌称为查询序列。编码和查询序列用于训练代码搜索模型。
在我们的多模态学习模型中,所有三个模态向量具有相同的长度。我们通过将代码和树向量相加来将它们组合起来。这将计算一个联合向量,该向量是源代码的多模式表示。然后将联合向量与查询向量一起训练,以确保共享向量空间中语义相似的代码向量与查询向量接近。像往常一样,我们计算余弦距离来量化语义相似度。
附图说明
图1为用于代码搜索的伪孪生网络;
图2为一个Python中的代码片段;
图3为实施例1中基于多模态表示的代码搜索方法的流程图;
图4为模型总体框架图。
具体实施方式
为进一步了解本发明的内容,结合附图和实施例对本发明作详细描述。应当理解的是,实施例仅仅是对本发明进行解释而并非限定。
实施例1
图3为基于多模态表示的代码搜索方法的流程图,本实施例提供了一种基于多模态表示的代码搜索方法,其包括以下步骤:
步骤S1:从开源软件中获取项目;
从GitHub库中提取1800多万个公共Java代码方法作为训练的数据集,从GitHub提取10K个代码-查询对作为测试的数据集,然后用训练数据集训练MULRE。如表一所示,语料库被分为80-10-10比例的数据集。第一列显示了数据集。第二到第七栏介绍了每种编程语言的统计数据。最后一列是所有语言的总统计值。
Data set | Go | Java | JavaScript | PHP | Python | Ruby | Total |
Train | 317,832 | 454,451 | 123,889 | 523,712 | 412,178 | 48,791 | 1880,853 |
Valid | 14,242 | 15,328 | 8,251 | 26,015 | 23,107 | 2,209 | 89,154 |
Test | 14,291 | 26,909 | 6,483 | 28,391 | 22,176 | 2,279 | 100,529 |
All | 346,365 | 496,688 | 138,625 | 578,118 | 457,461 | 53,279 | 2070,536 |
步骤S2:对收集的代码搜索数据集进行预处理;
具体来说,步骤S2是对步骤S1中获取的Java和Python模型语料进行去重处理,删除不存在代码片段和代码描述的匹配对(即无效数据),并删除长度过小的代码片段,以提供高质量的训练语料。
步骤S3:输入一段自然语言,训练好的模型便将最接近的代码片段搜索出来;
模型MULRE通过引入语义级别与结构级别匹配模块对代码和描述进行语义提取和匹配,包括:
步骤S3.1:我们将代码片段解析为抽象语法树(AST);
为了使这种树结构更好地用于代码搜索,我们将AST转换为一种新的树结构--简化语义树(SST)。简化语义树是指本发明设计了一种新的树结构SST来提取源代码的树序列化表示。SST近似简化了AST的树形结构,并突出了代码片段的语义信息。与AST相比,SST去掉了不必要的树节点,并改进了树节点的标注,SST在语义上也更具信息性。同时,一并输入自然语言。
步骤S3.2:树序列化表示是通过解析代码生成的数据并写入树结构,然后将树序列化为序列;此处是从SST中通过遍历树结构的方法提取出树序列和代码序列,从自然语言中提取查询序列。对于任何给定的AST,我们执行三个操作来构建相应的SST。
第一个操作是修剪在语义上对代码搜索没有意义的树节点,比如“int”和“boolean”这样的类型声明,“public”和“abal”这样的修饰符关键字,“async”和“aWait”这样的函数关键字。已删除节点的完整列表因语言不同而不同。
第二个操作是用描述性标记替换语句节点和表达式节点的标签,比如对for-loop和While-loop语句使用“loop”,对确切的字符串变量使用“decal”,目的是帮助网络掌握不同语法节点背后的一般概念。
第三个操作是统一来自不同语言的语义相似标签的表达,如将“函数”、“程序”、“定义”、“模块”统一为“模块”。预计它将促进编程语言之间的某种形式的迁移学习。
基于结构的遍历(Structure-Based Traversal,SBT)是一种基于遍历的表示。SBT表示是通过自上而下的递归树遍历获得的。具体实施如下:
首先从根节点开始,首先用一对括号表示树结构,将根节点放在右括号后面。再遍历根节点的子树,并将子树的所有根节点放入括号中。最后递归遍历每棵子树,直到遍历完所有节点,得到最终序列。
为了生成这些树序列化表示,我们解析原始代码片段以构建SST,然后从每个叶节点开始提取根路径,每个叶节点的标签是到根节点的标识符。为了更好地表达语义,我们忽略标签为单字符标识符的叶节点,如“t”或“x”,除非每个代码片段没有足够的根路径。一旦我们收集了所有的根路径,我们就将它们随机组合成对来生成叶路径。类似地,我们优先考虑其对应的叶节点具有多字符标识符的叶路径作为标签,因为它们被认为是最具语义信息的。相反,我们只需要实现基于结构的遍历和有序遍历的函数以及树转换算法来生成SBT表示,而不需要任何额外的处理工作。
步骤S3.3:我们采用了三个SelfAtt模型作为编码器,考虑到SelfAtt模型在各种自然语言处理任务中表现得非常好;
代码编码器和树编码器并行处理代码表示,查询编码器处理查询表示。将上述代码序列和树形序列,分别提供给代码编码器和树形编码器。自我注意力机制SelfAtt是一种通过计算相关矩阵来捕捉远距离依赖的注意操作,其最早是在自然语言处理领域提出的。自我注意力机制的操作可以表述为:
其中K(键)、Q(查询)、V(值)来自同一输入的不同变换。
步骤S3.4:代码编码器和树编码器将各自的序列数据转换成令牌向量和树向量,并生成联合向量。查询编码器接收查询序列作为输入,并计算查询向量作为输出;
所有三个模态向量都具有相同的长度。我们通过对代码和树向量求和来将它们组合在一起。这将计算一个联合向量,它是源代码的多模态表示。然后将联合向量与查询向量一起训练,以确保共享向量空间中语义相似的代码向量与查询向量更接近。
基于此向量模型,再根据自然语言查询的向量检索与之距离相近的代码片段,余弦向量公式:
该模型使用向量之间的余弦距离来衡量相似性。一旦经过训练,与给定查询语义最相关的代码片段就是那些向量最接近查询向量(用余弦距离衡量)的代码片段。
步骤S4:计算两个评估标准MRR和NDCG;
步骤S4.1:计算MRR分数;
MRR量化了目标代码片段对给定查询的排名,最相关的代码片段应该排名最高,其排名位置越低,MRR得分就越低,所有批次的平均值为最终的MRR分数。MRR计算方式如下:
δ为一个函数,输入为真时输出1,否则输出0。一个好的代码搜索引擎应该将正确
结果放在返回值尽可能靠前的位置,这样可以方便使用人员更快速的找到自己需要的结果,同样的,R@k值越高,表明代码搜索模型的表现越好。
步骤S4.2:计算NDCG分数;
NDCG归一化折损累计增益,用作排序结果的评价指标,评价排序的准确性。推荐系统通常为某用户返回一个item列表,假设列表长度为K,这时可以用NDCG@K评价该排序列表与用户真实交互列表的差距。NDCG计算公式如下:
r(i)为第i个结果的得分,在代码搜索任务中,只有正确与否,对应的得分为1和0。在实验中,取NDCG@50作为评价指标。
以上所述,仅为本发明的较佳实施例而已,并非对本发明作任何形式上的限制,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,依据本发明的技术实质对以上实施例所作的任何简单修改,或等同变化,均仍属于本发明权利要求书的保护范围内。
Claims (8)
1.一种基于多模态表示的代码搜索装置,包括多模态表示模块、树序列化及简化语义树模块、孪生网络模块和代码搜索模块四个模块,其中:
所述多模式学习模块;是用于通过机器学习的方法实现处理和理解多源模态信息的能力;通道是指某种类型的信息如何存在的方式,例如,为了识别牧羊犬和绵羊,我们可以充分利用各种模式的数据,如颜色、声音和运动模式的特征;多模式学习的目标是建立能够处理和关联多模式数据的模型,它基于这样一个事实,即可以通过不同的方式捕获数据语义,由多个通道的数据产生的表示称为多通道表示;我们的发明中是指从源代码中提取两个模态,从自然语言表示中提取一个模态,并在此基础上采用多模式学习,这两个模态是代码片段的普通表示形式和树序列化表示形式,这两种模式是代码片段的普通和树序列化表示形式;
所述树序列化及简化语义树模块;树序列化表示是通过解析代码生成的数据并写入树结构,然后将树序列化为序列,简化语义树是指本发明设计了一种新的树结构SST(Simplified Semantic Tree)来提取源代码的树序列化表示,SST近似简化了AST的树形结构,并突出了代码片段的语义信息;与AST相比,SST去掉了不必要的树节点,并改进了树节点的标注,尽管AST已经具有树结构并能够进行树序列化,但SST在语义上更具信息性,对各种编程语言也更通用;我们采用基于结构的遍历技术序列化SST,其动机是从树结构中提取线性序列,这些序列是更适用于上述典型编码器的顺序数据;
所述孪生网络模块;孪生网络是一种人工神经网络,用于测量使用相同编码器的相同类型的两个输入之间的相似性,伪孪生网络更灵活,因为它旨在用不同的编码器来衡量不同数据类型的相似性,代码搜索的模型架构遵循了利用伪孪生网络的做法;在该架构中,代码和查询序列分别被馈送到相应的编码器中,并被转换为向量,训练目标是最小化相关代码和查询向量之间的距离,码搜索模型使用向量之间的余弦距离来衡量相似性;一旦经过训练,与给定查询语义最相关的代码片段就是其向量最接近查询向量的代码片段,这些向量由余弦距离度量,学习的目标是确保语义相似的向量尽可能接近;三线损失是基线和我们的模型中使用的目标函数,它将查询向量优化为接近对应的代码向量,但远离其他代码向量;在训练过程中,每个码-查询对(ci,qi)和对应的干扰码片段cj被馈送到码编码器Ec和查询编码器Eq;培训目标是将以下损失降至最低:
三元组损失函数的目标是最大化代码ci和查询qi编码对的内积,同时最小化目标代码片断ci与其干扰码片断cj(i≠j)之间的内积;(ci,qi)和(cj,qi)分别表示阳性样本和阴性样本,用于码搜索的孪生网络有多种可能的编码器,专门用于顺序数据的典型编码器包括:
NBOW:神经词袋(NBOW)简单地计算所有单词嵌入的加权平均值,以获得作为整个语义表示的句子嵌入;
1D-CNN:卷积神经网络(CNN)使用卷积运算来分析不同大小的接收域中的上下文信息,1D-CNN指的是一维序列数据的模型;
BI-RNN:递归神经网络(RNN)使用时间序列形式的隐藏层来捕获依赖关系,BI-RNN串联了向前和向后两个方向的嵌入;
SelfAtt:基于transformer的模型使用自我注意机制和BERT的位置嵌入方式来学习上下文信息;
所述代码搜索模块;代码搜索的规范任务是为给定的自然语言查询找到最相关的代码片段,代码搜索引擎可以用信息检索技术和神经技术来制造;在本发明中,我们主要研究后者,代码-查询对是一段自然语言查询和相应的源代码;该查询可以是目标代码片段的简短文档,如“向成员发送生日消息”,在整个工作中,我们将源代码令牌称为代码序列,将查询令牌称为查询序列,编码和查询序列用于训练神经编码搜索模型。
2.根据权利要求1所述装置的一种基于多模态表示的代码搜索方法,其特征在于通过多模式学习的方式将树序列化表示应用于代码搜索,我们的多通道表示模型的核心思想是利用代码片段的语义和语法信息,设计了一种新的树结构--简化语义树(SST),SST在语义上比AST更具信息性,因此我们在SST上引入了几种树序列化方法来构建树序列化表示来补充令牌表示;此外,我们将树序列化表示与令牌表示相结合作为多模态表示,我们的多模态学习模型遵循伪孪生网络结构,采用SelfAtt模型作为其编码者,该方法的具体步骤如下:
步骤S1:从开源软件中获取项目从GitHub库中提取1800多万个公共Java代码方法作为训练的数据集,从GitHub提取10K个代码-查询对作为测试的数据集,然后用训练数据集训练MULRE;
步骤S2:对收集的代码搜索数据集进行预处理;
具体来说,步骤S2是对步骤S1中获取的Java和Python模型语料进行去重处理,删除不存在代码片段和代码描述的匹配对(即无效数据),并删除长度过小的代码片段,以提供高质量的训练语料;
步骤S3:输入一段自然语言,训练好的模型便将最接近的代码片段搜索出来,模型MULRE通过引入语义级别与结构级别匹配模块对代码和描述进行语义提取和匹配,包括:
步骤S3.1:我们将代码片段解析为抽象语法树(AST);
为了使这种树结构更好地用于代码搜索,我们将AST转换为一种新的树结构--简化语义树(SST);简化语义树是指本发明设计了一种新的树结构SST来提取源代码的树序列化表示,SST近似简化了AST的树形结构,并突出了代码片段的语义信息,与AST相比,SST去掉了不必要的树节点,并改进了树节点的标注,SST在语义上也更具信息性,同时,一并输入自然语言;
步骤S3.2:树序列化表示是通过解析代码生成的数据并写入树结构,然后将树序列化为序列;
此处是从SST中通过遍历树结构的方法提取出树序列和代码序列,从自然语言中提取查询序列,基于结构的遍历(Structure-Based Traversal,SBT)是一种基于遍历的表示,SBT表示是通过自上而下的递归树遍历获得的;
步骤S3.3:我们采用了三个SelfAtt模型作为编码器,考虑到SelfAtt模型在各种自然语言处理任务中表现得非常好;
代码编码器和树编码器并行处理代码表示,查询编码器处理查询表示;将上述代码序列和树形序列,分别提供给代码编码器和树形编码器,自我注意力机制SelfAtt是一种通过计算相关矩阵来捕捉远距离依赖的注意操作,其最早是在自然语言处理领域提出的;
步骤S3.4:代码编码器和树编码器将各自的序列数据转换成令牌向量和树向量,并生成联合向量,查询编码器接收查询序列作为输入,并计算查询向量作为输出;
所有三个模态向量都具有相同的长度,我们通过对代码和树向量求和来将它们组合在一起,这将计算一个联合向量,它是源代码的多模态表示,然后将联合向量与查询向量一起训练,以确保共享向量空间中语义相似的代码向量与查询向量更接近;
步骤S4:计算两个评估标准MRR和NDCG;
步骤S4.1:计算MRR分数;
MRR量化了目标代码片段对给定查询的排名,最相关的代码片段应该排名最高,其排名位置越低,MRR得分就越低,所有批次的平均值为最终的MRR分数;
步骤S4.2:计算NDCG分数;
NDCG归一化折损累计增益,用作排序结果的评价指标,评价排序的准确性;推荐系统通常为某用户返回一个item列表,假设列表长度为K,这时可以用NDCG@K评价该排序列表与用户真实交互列表的差距。
3.根据权利要求2所述的一种基于多模态表示的代码搜索方法,其特征在于,步骤S1中所述的代码本身的属性包括结构、方法、功能。
4.根据权利要求2所述的一种基于多模态表示的代码搜索方法,其特征在于,步骤S3.2中所述基于结构的遍历的步骤是由下列方法得到的:
首先从根节点开始,首先用一对括号表示树结构,将根节点放在右括号后面;再遍历根节点的子树,并将子树的所有根节点放入括号中;最后递归遍历每棵子树,直到遍历完所有节点,得到最终序列。
5.根据权利要求2所述的一种基于多模态表示的代码搜索方法,其特征在于,步骤S3.3中所述的自我注意力机制的操作可以表述为:
其中K(键)、Q(查询)、V(值)来自同一输入的不同变换。
6.根据权利要求2所述的一种基于多模态表示的代码搜索方法,其特征在于,步骤S3.4中所述的共享向量空间中语义相似的代码向量与查询向量,其计算公式可以表述为如下:
该模型使用向量之间的余弦距离来衡量相似性;一旦经过训练,与给定查询语义最相关的代码片段就是那些向量最接近查询向量(用余弦距离衡量)的代码片段。
7.根据权利要求2所述的一种基于多模态表示的代码搜索方法,其特征在于,步骤S4.1中MRR计算方式如下:
δ为一个函数,输入为真时输出1,否则输出0,一个好的代码搜索引擎应该将正确结果放在返回值尽可能靠前的位置,这样可以方便使用人员更快速的找到自己需要的结果,同样的,R@k值越高,表明代码搜索模型的表现越好。
8.根据权利要求2所述的一种基于多模态表示的代码搜索方法,其特征在于,步骤S4.2中NDCG计算公式如下:
r(i)为第i个结果的得分,在代码搜索任务中,只有正确与否,对应的得分为1和0,在实验中,取NDCG@50作为评价指标。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210776313.0A CN117390130A (zh) | 2022-07-01 | 2022-07-01 | 一种基于多模态表示的代码搜索方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210776313.0A CN117390130A (zh) | 2022-07-01 | 2022-07-01 | 一种基于多模态表示的代码搜索方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117390130A true CN117390130A (zh) | 2024-01-12 |
Family
ID=89467167
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210776313.0A Pending CN117390130A (zh) | 2022-07-01 | 2022-07-01 | 一种基于多模态表示的代码搜索方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117390130A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117725087A (zh) * | 2024-02-08 | 2024-03-19 | 厦门大学 | 一种基于重排序的代码搜索去偏差方法及系统 |
CN117725087B (zh) * | 2024-02-08 | 2024-06-04 | 厦门大学 | 一种基于重排序的代码搜索去偏差方法及系统 |
-
2022
- 2022-07-01 CN CN202210776313.0A patent/CN117390130A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117725087A (zh) * | 2024-02-08 | 2024-03-19 | 厦门大学 | 一种基于重排序的代码搜索去偏差方法及系统 |
CN117725087B (zh) * | 2024-02-08 | 2024-06-04 | 厦门大学 | 一种基于重排序的代码搜索去偏差方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Hu et al. | Deep code comment generation with hybrid lexical and syntactical information | |
Husain et al. | Codesearchnet challenge: Evaluating the state of semantic code search | |
CN108717470B (zh) | 一种具有高准确度的代码片段推荐方法 | |
Cai et al. | An encoder-decoder framework translating natural language to database queries | |
CN114585999A (zh) | 多语言代码行补全系统 | |
CN112215013B (zh) | 一种基于深度学习的克隆代码语义检测方法 | |
CN112800172B (zh) | 一种基于两阶段注意力机制的代码搜索方法 | |
CN113127339B (zh) | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 | |
CN114547619B (zh) | 一种基于树的漏洞修复系统及修复方法 | |
JP2022073981A (ja) | ソースコード取得 | |
CN112199115A (zh) | 基于特征相似度匹配的跨Java字节码和源代码行关联方法 | |
CN114692600B (zh) | 使用子例程图谱进行形式语言处理的方法和系统 | |
CN116225526A (zh) | 一种基于图表示学习的代码克隆检测方法 | |
CN115033895A (zh) | 一种二进制程序供应链安全检测方法及装置 | |
Rodriguez-Cardenas et al. | Benchmarking Causal Study to Interpret Large Language Models for Source Code | |
CN113378024B (zh) | 一种基于深度学习面向公检法领域的相关事件识别方法 | |
Wang et al. | Aspect-based sentiment analysis with graph convolutional networks over dependency awareness | |
Chen et al. | Neural comment generation for source code with auxiliary code classification task | |
CN116804980A (zh) | 一种二进制组件检索方法及装置 | |
CN111309930A (zh) | 一种基于表示学习的医学知识图谱实体对齐方法 | |
CN117390130A (zh) | 一种基于多模态表示的代码搜索方法 | |
CN115495085A (zh) | 一种基于深度学习细粒度代码模板的生成方法及装置 | |
CN111562943B (zh) | 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置 | |
CN113032366A (zh) | 基于Flex和Bison的SQL语法树解析方法 | |
Nan et al. | Enabling near real-time nlu-driven natural language programming through dynamic grammar graph-based translation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |