CN116661805A - 代码表示的生成方法和装置、存储介质及电子设备 - Google Patents
代码表示的生成方法和装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN116661805A CN116661805A CN202310949796.4A CN202310949796A CN116661805A CN 116661805 A CN116661805 A CN 116661805A CN 202310949796 A CN202310949796 A CN 202310949796A CN 116661805 A CN116661805 A CN 116661805A
- Authority
- CN
- China
- Prior art keywords
- code
- sample
- target
- node
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 153
- 238000003860 storage Methods 0.000 title claims abstract description 22
- 239000013598 vector Substances 0.000 claims abstract description 472
- 238000012549 training Methods 0.000 claims abstract description 96
- 230000008569 process Effects 0.000 claims abstract description 40
- 238000004458 analytical method Methods 0.000 claims abstract description 33
- 238000012512 characterization method Methods 0.000 claims description 244
- 239000011159 matrix material Substances 0.000 claims description 39
- 238000013527 convolutional neural network Methods 0.000 claims description 30
- 230000006870 function Effects 0.000 claims description 29
- 238000004590 computer program Methods 0.000 claims description 23
- 238000012545 processing Methods 0.000 claims description 23
- 230000007246 mechanism Effects 0.000 claims description 17
- 238000005070 sampling Methods 0.000 claims description 13
- 230000002776 aggregation Effects 0.000 claims description 12
- 238000004220 aggregation Methods 0.000 claims description 12
- 238000013528 artificial neural network Methods 0.000 claims description 12
- 238000006243 chemical reaction Methods 0.000 claims description 6
- 238000005516 engineering process Methods 0.000 abstract description 20
- 238000004422 calculation algorithm Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 16
- 239000012634 fragment Substances 0.000 description 12
- 238000013473 artificial intelligence Methods 0.000 description 11
- 238000004891 communication Methods 0.000 description 11
- 238000003058 natural language processing Methods 0.000 description 11
- 238000001514 detection method Methods 0.000 description 10
- 238000009826 distribution Methods 0.000 description 8
- 230000000694 effects Effects 0.000 description 8
- 238000002372 labelling Methods 0.000 description 8
- 238000010801 machine learning Methods 0.000 description 7
- 238000013459 approach Methods 0.000 description 6
- 230000008901 benefit Effects 0.000 description 5
- 238000004364 calculation method Methods 0.000 description 5
- 230000018109 developmental process Effects 0.000 description 4
- 238000011160 research Methods 0.000 description 4
- 230000011218 segmentation Effects 0.000 description 4
- 238000011524 similarity measure Methods 0.000 description 4
- 230000005540 biological transmission Effects 0.000 description 3
- 238000010276 construction Methods 0.000 description 3
- 238000013135 deep learning Methods 0.000 description 3
- 238000013136 deep learning model Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 3
- 238000000547 structure data Methods 0.000 description 3
- 238000012614 Monte-Carlo sampling Methods 0.000 description 2
- 230000009471 action Effects 0.000 description 2
- 239000008186 active pharmaceutical agent Substances 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 2
- 230000008878 coupling Effects 0.000 description 2
- 238000010168 coupling process Methods 0.000 description 2
- 238000005859 coupling reaction Methods 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 230000001627 detrimental effect Effects 0.000 description 2
- 238000000605 extraction Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 239000004973 liquid crystal related substance Substances 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 238000005259 measurement Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000007781 pre-processing Methods 0.000 description 2
- 238000004088 simulation Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000004931 aggregating effect Effects 0.000 description 1
- 238000009635 antibiotic susceptibility testing Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000003066 decision tree Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000012407 engineering method Methods 0.000 description 1
- 230000004927 fusion Effects 0.000 description 1
- 238000005304 joining Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000000306 recurrent effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012706 support-vector machine Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
-
- 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/04—Architecture, e.g. interconnection topology
- G06N3/0464—Convolutional networks [CNN, ConvNet]
-
- 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
- G06N3/088—Non-supervised learning, e.g. competitive learning
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Biophysics (AREA)
- Evolutionary Computation (AREA)
- Artificial Intelligence (AREA)
- Biomedical Technology (AREA)
- Health & Medical Sciences (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Life Sciences & Earth Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请公开了一种代码表示的生成方法和装置、存储介质及电子设备。其中,该方法包括:获取待生成向量表示的初始代码,对初始代码执行代码解析操作,得到目标语法树,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,本申请可以应用于基于人工智能的大数据领域等。本申请解决了相关技术中代码表示向量的生成效率的技术问题。
Description
技术领域
本申请涉及计算机领域,具体而言,涉及一种代码表示的生成方法和装置、存储介质及电子设备。
背景技术
目前现有技术中,对于给定的代码片段,一般通过使用代码表示模型来获得代码对应的向量表示,而获取向量表示的模型一般采用有监督训练或半监督训练,训练数据一般需要人工标注部分或全部的样本代码,导致代码表示模型的训练效率较低,样本代码的标注成本较高,进而,使得代码表示向量的生成效率难以保证的技术问题。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本申请实施例提供了一种代码表示的生成方法和装置、存储介质及电子设备,以至少解决相关技术中代码表示向量的生成效率的技术问题。
根据本申请实施例的一个方面,提供了一种代码表示的生成方法,包括:获取待生成向量表示的初始代码;对所述初始代码执行代码解析操作,得到目标语法树,其中,所述目标语法树用于以树状的形式表示所述初始代码的语法结构;使用预训练的目标编码器对所述目标语法树执行编码操作,得到目标代码表征向量,其中,所述目标代码表征向量用于以向量形式表示所述初始代码,所述目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,所述无监督训练的过程包括将目标样本语法树输入所述初始编码器,由所述初始编码器输出目标子树是否属于所述目标样本语法树的概率,并根据所述概率以及目标标签对所述初始编码器进行训练,所述一组样本语法树包括所述目标样本语法树,所述目标子树来自于对所述一组样本语法树进行识别所得到的一组子树,所述目标标签用于表示所述目标子树是否为所述目标样本语法树中识别到的子树。
根据本申请实施例的另一方面,还提供了一种代码表示的生成装置,包括:获取模块,用于获取待生成向量表示的初始代码;转换模块,用于对所述初始代码执行代码解析操作,得到目标语法树,其中,所述目标语法树用于以树状的形式表示所述初始代码的语法结构;编码模块,用于使用预训练的目标编码器对所述目标语法树执行编码操作,得到目标代码表征向量,其中,所述目标代码表征向量用于以向量形式表示所述初始代码,所述目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,所述无监督训练的过程包括将目标样本语法树输入所述初始编码器,由所述初始编码器输出目标子树是否属于所述目标样本语法树的概率,并根据所述概率以及目标标签对所述初始编码器进行训练,所述一组样本语法树包括所述目标样本语法树,所述目标子树来自于对所述一组样本语法树进行识别所得到的一组子树,所述目标标签用于表示所述目标子树是否为所述目标样本语法树中识别到的子树。
在一个示例性的实施例中,所述装置还用于:获取一组样本代码;对所述一组样本代码分别执行所述代码解析操作,得到所述一组样本语法树;对所述一组样本语法树分别执行自动识别操作,得到所述一组子树,并生成一组样本标签,其中,所述一组子树与所述一组样本标签一一对应,所述样本标签用于指示对应的子树所属的样本语法树;利用所述初始编码器确定一组样本表征向量和一组子树表征向量,其中,所述一组样本表征向量与所述一组样本语法树一一对应,所述一组子树表征向量与所述一组子树一一对应;根据所述一组样本表征向量和所述一组子树表征向量确定多组样本概率,其中,一组样本概率与一个所述样本表征向量对应;根据所述一组样本标签和所述多组样本概率训练所述初始编码器,直到所述初始编码器对应的损失函数满足预设损失条件。
在一个示例性的实施例中,所述装置用于通过如下方式利用所述初始编码器确定一组样本表征向量:通过如下方式确定所述一组样本表征向量,其中,每次确定的样本表征向量被视为目标样本表征向量,所述目标样本表征向量与所述目标样本语法树对应:获取所述目标样本语法树包括的节点集合、节点特征集合以及边集合,其中,所述节点集合中的每个节点与所述节点特征集合中的部分节点特征对应,所述边集合中的一个边用于连接所述节点集合中的父节点和子节点,所述节点特征集合中的节点特征用于表示对应节点的代码信息;使用层级树卷积神经网络对所述节点集合、所述节点特征集合以及所述边集合进行处理,确定所述节点集合中各个节点对应的节点表征向量;基于注意力机制对所述各个节点对应的节点表征向量执行聚合操作,确定所述目标样本表征向量。
在一个示例性的实施例中,所述装置用于通过如下方式使用层级树卷积神经网络对所述节点集合、所述节点特征集合以及所述边集合进行处理,确定所述节点集合中各个节点对应的节点表征向量:根据所述节点集合、所述节点特征集合以及所述边集合确定一组初始化节点表征向量;使用层级树卷积神经网络对所述一组初始节点表征向量执行卷积操作,得到所述各个节点对应的所述节点表征向量,其中,每个所述初始节点表征向量执行所述卷积操作所使用的权重矩阵包括与父节点关联的第一权重矩阵、与左邻节点关联的第二权重矩阵以及与右邻节点关联的第三权重矩阵,所述第一权重矩阵、所述第二权重矩阵以及所述第三权重矩阵对应的权重与对应节点的节点深度和节点位置相关联。
在一个示例性的实施例中,所述装置用于通过如下方式基于注意力机制对所述各个节点对应的节点表征向量执行聚合操作,确定所述目标样本表征向量:为所述各个节点对应的节点表征向量关联隐藏状态向量,得到一组节点状态向量;根据所述一组节点状态向量与全局注意向量之间的归一化内积,确定所述各个节点对应的权重值;利用相对应的所述权重值与所述节点表征向量进行加权线性组合,确定所述目标样本表征向量。
在一个示例性的实施例中,所述装置用于通过如下方式根据所述一组样本表征向量和所述一组子树表征向量确定多组样本概率:通过如下方式根据所述一组样本表征向量和所述一组子树表征向量确定所述多组样本概率,其中,每次参与计算的样本表征向量被视为目标样本表征向量,所述目标样本表征向量与所述目标样本语法树对应,所述目标样本表征向量与一组样本概率对应:根据所述一组样本标签从所述一组子树表征向量中确定正样本子树表征向量和负样本子树表征向量,其中,所述正样本子树表征向量表示是从所述目标样本语法树中识别到的子树对应的表征向量,所述负样本子树表征向量表示不是从所述目标样本语法树中识别到的子树对应的表征向量;将所述正样本子树表征向量和所述负样本子树表征向量分别输入所述初始编码器,确定所述一组样本概率。
在一个示例性的实施例中,所述装置用于通过如下方式将所述正样本子树表征向量和所述负样本子树表征向量分别输入所述初始编码器,确定所述一组样本概率:获取每个所述正样本子树表征向量和每个所述负样本子树表征向量分别与所述目标样本表征向量之间的点积;根据所述点积确定所述一组样本概率,其中,所述一组样本概率包括每个所述正样本子树表征向量和每个所述负样本子树表征向量分别属于所述目标样本语法树的概率。
在一个示例性的实施例中,所述装置用于通过如下方式对所述一组样本语法树分别执行自动识别操作,得到所述一组子树,并生成一组样本标签:通过如下方式对所述一组样本语法树分别执行自动识别操作,得到所述一组子树和所述一组样本标签:采用词向量表示模型对n个样本语法树中第i个样本语法树进行采样,确定s个子树,其中,所述s个子树的根节点类型为预设节点类型,所述s个子树对应的样本标签均指示对应子树属于所述第i个样本语法树,i≤n,i、n、s均正整数;将n·s个子树累积为所述一组子树,并将所述n·s个子树对应的样本标签确定为所述一组样本标签。
在一个示例性的实施例中,所述装置还用于:获取待进行代码聚类的第一代码;对所述第一代码执行所述代码解析操作,得到所述第一代码对应的第一代码语法树;使用所述目标编码器对所述第一代码语法树执行所述编码操作,得到所述第一代码对应的第一样本代码表征向量;确定所述第一样本代码表征向量和所述目标代码表征向量之间的相似度,并将所述相似度满足第一相似度条件的所述第一样本代码表征向量确定为第一代码表征向量;对所述第一代码表征向量执行解码操作,得到第一目标代码,其中,所述初始代码与所述第一目标代码具有相同的聚类结果。
在一个示例性的实施例中,所述装置还用于:获取待进行代码比对的第二代码;对所述第二代码执行所述代码解析操作,得到所述第二代码对应的第二代码语法树;使用所述目标编码器对所述第二代码语法树执行所述编码操作,得到所述第二代码对应的第二样本代码表征向量;确定所述第二样本代码表征向量和所述目标代码表征向量之间的相似度,并根据所述相似度是否满足第二相似度条件确定所述第二代码与所述初始代码的比对结果。
在一个示例性的实施例中,所述装置还用于:所述确定所述第二样本代码表征向量和所述目标代码表征向量之间的相似度,并根据所述相似度是否满足第二相似度条件确定所述第二代码与所述初始代码的比对结果之后,获取与所述第二代码对应的目标代码名称和/或目标代码语言类型;在所述比对结果指示所述第二代码与所述初始代码相似的情况下,将所述目标代码名称确定为所述初始代码的代码名称,和/或,将所述初始代码的代码语言类型确定为所述目标代码语言类型。
根据本申请实施例的又一方面,还提供了一种计算机可读的存储介质,该计算机可读的存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述代码表示的生成方法。
根据本申请实施例的又一方面,提供一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行如以上代码表示的生成方法。
根据本申请实施例的又一方面,还提供了一种电子设备,包括存储器和处理器,上述存储器中存储有计算机程序,上述处理器被设置为通过所述计算机程序执行上述的代码表示的生成方法。
在本申请实施例中,采用获取待生成向量表示的初始代码,对初始代码执行代码解析操作,得到目标语法树,其中,目标语法树用于以树状的形式表示初始代码的语法结构,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,其中,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,一组样本语法树包括目标样本语法树,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树的方式,通过使用预训练的目标编码器对初始代码转换的目标语法树进行编码,可以生成更加准确和高质量的代码表征向量,从而提高代码自动生成的效果,通过对初始代码进行解析和编码操作,可以得到更加准确和高质量的代码表征向量,从而提高代码自动生成的效果,达到了无需人工标注,就能训练生成代码表示向量的编码器的目的,从而实现了提高代码表示向量的生成效率,优化代码表示向量的生成准确度,降低编码器的训练成本的技术效果,进而解决了相关技术中代码表示向量的生成效率的技术问题。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请实施例的一种可选的代码表示的生成方法的应用环境的示意图;
图2是根据本申请实施例的一种可选的代码表示的生成方法的流程示意图;
图3是根据本申请实施例的一种可选的代码表示的生成方法的示意图;
图4是根据本申请实施例的又一种可选的代码表示的生成方法的示意图;
图5是根据本申请实施例的又一种可选的代码表示的生成方法的示意图;
图6是根据本申请实施例的又一种可选的代码表示的生成方法的示意图;
图7是根据本申请实施例的又一种可选的代码表示的生成方法的示意图;
图8是根据本申请实施例的又一种可选的代码表示的生成方法的示意图;
图9是根据本申请实施例的一种可选的代码表示的生成装置的结构示意图;
图10是根据本申请实施例的一种可选的代码表示的生成产品的结构示意图;
图11是根据本申请实施例的一种可选的电子设备的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
首先,在对本申请实施例进行描述的过程中出现的部分名词或者术语适用于如下解释:
代码表示:是指将源代码解析为可供机器学习算法使用的向量表示。这种表示可以在软件工程中用于代码分类、代码搜索、注释生成、错误预测等任务。本申请实施例通过预测语法子树来训练代码表示模型,避免了人工标注的过程。
抽象语法树(AST,Abstract Syntax Tree):是指将程序代码按照语法规则转化为树形结构的形式,使得程序的结构和语义信息可以通过树的遍历和操作来表达和处理。简而言之,抽象语法树是程序代码在计算机中的一种内部表示方式。
代码中间表示:将代码片段表示为中间表示形式的过程,例如语法树、依赖图、树路径等,可以被神经网络处理并转换为代码向量表示。这些表示可以用于许多下游任务,例如代码分类、代码搜索、注释生成、错误预测等。
Skip-gram:是一种词向量表示方法,是自监督学习中的一种。给定一个由单词组成的句子,skip-gram可以学习获得每个单词的向量表示,使得在相似语境下的单词的向量表示相似。
Doc2vec:是一种扩展自word2vec的算法,用于文档级别的向量表示学习。利用分布式Skip-gram模型,能够学习任意长度的序列(如句子、段落、整个文档)的表示。给定一个文档集合和从文档中采样的词语序列,skip-gram模型可学习到文档和每个词语的分布式表示。它通过将词语看作出现在文档上下文中并尝试最大化对数似然函数来实现。
自监督学习:是一种机器学习技术,可以在不使用人工标注数据的情况下进行神经网络的训练。它的关键思想是将无监督学习转化为监督学习,通过自动生成虚拟标签来指导模型的训练。自监督任务可以适用于任意数据,训练出来的表示可以用于各种下游任务。
注意力:是一种机器学习中的技术,用于在编码过程中为不同的输入部分赋予不同的权重,以提高模型对重要信息的关注。它通常在自然语言处理和计算机视觉等领域中使用,在本申请实施例中注意力机制被用于将所有节点嵌入聚合成一个表示代码的定长向量。
解析器:是将代码字符串转换为可执行语言的工具。可以将代码字符串解析为抽象语法树,以便更好地理解代码结构和语义。解析器通常是编译器的一部分,但也可以单独使用例如在代码编辑器中执行语法高亮和代码检查。
SrcML:是代码解析器,用于将代码解析成抽象语法树(AST),方便进一步的代码分析和处理。是一个支持多种编程语言的解析器,可以将代码解析成XML格式的AST。
层级树卷积神经网络:是基于树结构的卷积神经网络,用于处理抽象语法树输入。具有捕捉程序结构特征、易于跨编程语言泛化的优点。
下面结合实施例对本申请进行说明:
根据本申请实施例的一个方面,提供了一种代码表示的生成方法,可选地,在本实施例中,上述代码表示的生成方法可以应用于如图1所示的由服务器101和终端设备103所构成的硬件环境中。如图1所示,服务器101通过网络与终端103进行连接,可用于为终端设备或终端设备上安装的应用程序提供服务,应用程序可以是视频应用程序、即时通信应用程序、浏览器应用程序、教育应用程序、游戏应用程序等。可在服务器上或独立于服务器设置数据库105,用于为服务器101提供数据存储服务,例如,游戏数据存储服务器,上述网络可以包括但不限于:有线网络,无线网络,其中,该有线网络包括:局域网、城域网和广域网,该无线网络包括:蓝牙、WIFI及其他实现无线通信的网络,终端设备103可以是配置有应用程序的终端,可以包括但不限于以下至少之一:手机(如Android手机、iOS手机等)、笔记本电脑、平板电脑、掌上电脑、MID(Mobile Internet Devices,移动互联网设备)、PAD、台式电脑、智能电视、智能语音交互设备、智能家电、车载终端、飞行器、虚拟现实(VirtualReality,简称VR)终端、增强现实(Augmented Reality, 简称AR)终端、混合现实(MixedReality,简称MR) 终端等计算机设备,上述服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群,或者是云服务器。
结合图1所示,上述代码表示的生成方法可以在终端设备103通过如下步骤实现:
S1,在终端设备103上获取待生成向量表示的初始代码;
S2,在终端设备103上对初始代码执行代码解析操作,得到目标语法树,其中,目标语法树用于以树状的形式表示初始代码的语法结构;
S3,在终端设备103上使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,其中,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,一组样本语法树包括目标样本语法树,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树。
可选地,在本实施例中,上述代码表示的生成方法还可以通过服务器实现,例如,图1所示的服务器101中实现;或由终端设备和服务器共同实现。
需要说明的是,上述服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
上述仅是一种示例,本实施例不做具体的限定。
可选地,作为一种可选的实施方式,如图2所示,上述代码表示的生成方法包括:
S202,获取待生成向量表示的初始代码;
S204,对初始代码执行代码解析操作,得到目标语法树,其中,目标语法树用于以树状的形式表示初始代码的语法结构;
S206,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,其中,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,一组样本语法树包括目标样本语法树,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树。
可选地,在本实施例中,上述代码表示的生成方法可以将初始代码转换为向量表示。该方法使用预训练的目标编码器对目标语法树执行编码操作,从而得到目标代码表征向量,用于以向量形式表示初始代码。该目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器。下面将详细介绍该方法的实现步骤:
首先,获取待生成向量表示的初始代码。这些初始代码可以是任何编程语言的代码,包括但不限于Python、Java、C++等。
然后,对初始代码执行代码解析操作,得到目标语法树。目标语法树用于以树状的形式表示初始代码的语法结构。代码解析可以使用现有的解析器或自己开发的解析器来完成,例如,SrcML代码解析器。
接下来,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量。目标代码表征向量用于以向量形式表示初始代码。目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器。无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练。
该方法可以应用于各种领域,包括但不限于代码搜索、代码推荐、代码相似性比较等。该方法具有以下优点:可以将初始代码转换为向量表示,便于后续处理和分析。使用预训练的编码器可以提高生成效率和准确性。无监督训练可以减少人工标注数据的成本。
总之,该方法是一种有效的基于代码解析和编码的代码表示向量的生成方法,可以为各种应用场景提供有力支持。
人工智能(Artificial Intelligence, AI)是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。
人工智能技术是一门综合学科,涉及领域广泛,既有硬件层面的技术也有软件层面的技术。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互系统、机电一体化等技术。人工智能软件技术主要包括计算机视觉技术、语音处理技术、自然语言处理技术以及机器学习/深度学习等几大方向。
自然语言处理(Nature Language processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系。自然语言处理技术通常包括文本处理、语义理解、机器翻译、机器人问答、知识图谱等技术。
所谓人工智能云服务,一般也被称作是AIaaS(AI as a Service,中文为“AI即服务”)。这是目前主流的一种人工智能平台的服务方式,具体来说AIaaS平台会把几类常见的AI服务进行拆分,并在云端提供独立或者打包的服务。这种服务模式类似于开了一个AI主题商城:所有的开发者都可以通过API接口的方式来接入使用平台提供的一种或者是多种人工智能服务,部分资深的开发者还可以使用平台提供的AI框架和AI基础设施来部署和运维自已专属的云人工智能服务。
可选地,在本实施例中,上述代码解析操作可以通过多种不同的方式实现,包括但不限于使用编译器或解释器。编译器将源代码转换为目标代码,而解释器则逐行解释源代码并执行。另一种方式是使用静态分析工具,它可以在不运行代码的情况下分析代码,并发现潜在的错误或问题。还有其他的一些方式,如调试器、反汇编器等。具体使用哪种方式取决于想要实现的目标以及所处理的代码的类型。
在一个示例性的实施例中,可以使用编译器或解释器对初始代码执行代码解析操作得到上述目标语法树,通过编译器将初始代码转换为特定代码,并在此过程中生成语法树。解释器则逐行解释源代码并执行,同时生成语法树。
需要说明的是,还可以使用一些工具和库解析代码并生成语法树,例如ANTLR、PLY、PyParsing、SrcML代码解析器等,这些工具和库提供了一些API和函数,可以帮助解析代码并生成语法树。
具体来说,需要编写语法规则文件,定义代码的语法结构和规则。然后,使用相应的工具或库来解析代码,并生成语法树。最后,可以使用语法树来分析、优化或转换代码。
需要注意的是,不同的编程语言有不同的语法结构和规则,因此在解析不同的编程语言时需要使用相应的语法规则和工具。当然,也可以使用支持多种编程语言的解析器来实现,例如,SrcML,用于将代码转换成抽象语法树(AST),方便进一步的代码分析和处理。是一个支持多种编程语言的解析器,可以将代码转换成XML格式的AST。
可选地,在本实施例中,在计算机科学领域,自然语言处理是一个重要的研究方向,其中语法树编码是一个核心问题。通过使用目标编码器对目标语法树执行编码操作,以得到目标代码表征向量。
在传统的自然语言处理中,语法树是一种表示自然语言句子结构的形式化方法。而在计算机程序设计中,代码也有其特定的结构和语法规则。因此,对于自然语言句子到计算机代码的转换,需要对语法树进行编码操作。这一过程可以被视为将自然语言句子转换为计算机可读的形式。
例如,图3是根据本申请实施例的另一种可选的代码表示的生成方法的示意图,如图3所示,目标语法树可以为由节点A、节点B、节点C、节点D、节点E、节点F以及节点G构成的语法树,其中,节点A、节点B、节点C、节点D、节点E、节点F以及节点G分别表示初始代码中的文本,节点A、节点B、节点C、节点D、节点E、节点F以及节点G之间的连接线用于表示初始代码中与节点A、节点B、节点C、节点D、节点E、节点F以及节点G相对应文本之间的关系,通过相关预训练的子树识别算法,可以识别出子树1、子树2以及子树3,由图3可知,子树1、子树2以及子树3均表示目标语法树的一部分。
示例性地,可以使用一种基于Transformer架构的预训练模型。该模型使用了大量的自然语言文本数据进行训练,可以有效地捕捉自然语言句子中的语义信息和结构信息。在使用该模型对目标语法树进行编码操作时,将其作为一个序列输入到模型中,并将其转换为一个固定长度的向量表示。这个向量表示被称为目标代码表征向量。
通过使用预训练的目标编码器,可以将目标语法树转换为计算机可读的形式,并生成目标代码表征向量,这个过程可以在自然语言句子到计算机代码的转换中发挥重要作用,例如,在自然语言代码生成任务中,可以使用目标代码表征向量作为输入,生成相应的计算机代码。
可选地,在本实施例中,上述目标编码器可以包括但不限于层级树卷积神经网络构成,通过对未训练的初始编码器进行训练,在初始编码器对应的损失函数满足预设损失条件的情况下,将初始编码器确定为上述目标编码器。
具体而言,上述目标编码器的训练过程是采用无监督训练方式训练得到的编码器,在训练的过程中,通过获取一组样本语法树,并逐个作为目标样本语法树输入初始编码器,先识别出一组子树,将一组子树中各个子树与样本语法树的关联关系作为目标标签,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树。
在一个示例性的实施例中,图4是根据本申请实施例的另一种可选的代码表示的生成方法的示意图,如图4所示,在软件开发过程中,代码的可读性和维护性是非常重要的,因此代码的自动生成技术越来越受到关注。本文将介绍一种基于目标编码器的代码自动生成技术,并对其中涉及到的名词进行解释。
首先,获取待生成向量表示的初始代码,这是代码自动生成的起点。接着,对初始代码执行代码解析操作,得到目标语法树(图4所示的AST)。目标语法树用于以树状的形式表示初始代码的语法结构,是代码自动生成的重要中间结果。
在得到目标语法树后,使用预训练的编码器对AST执行编码操作。
需要说明的是,上述预训练的编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器。无监督训练的过程包括将训练使用的样本语法树输入初始编码器,由初始编码器输出子树是否属于输入的样本语法树的概率(对应于图4所示的子树1、子树2以及子树3,也即,子树1、子树2以及子树3表示该对应子树属于当前输入的样本语法树的概率),再根据概率以及目标标签计算损失值,并基于损失值是否满足预设损失条件,以调整模型的参数,完成对初始编码器进行的训练。
最终,通过将初始代码输入预训练的编码器可以得到代码表征向量,其中,该代码表征向量用于以向量形式表示初始代码,是代码自动生成的最终结果。通过使用预训练的目标编码器,可以生成更加准确和高质量的代码表征向量,从而提高代码自动生成的效果,基于目标编码器的代码自动生成技术可以帮助开发人员更加高效地生成可读性和维护性更好的代码。
通过本实施例,采用获取待生成向量表示的初始代码,对初始代码执行代码解析操作,得到目标语法树,其中,目标语法树用于以树状的形式表示初始代码的语法结构,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,其中,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,一组样本语法树包括目标样本语法树,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树的方式,通过使用预训练的目标编码器对初始代码转换的目标语法树进行编码,可以生成更加准确和高质量的代码表征向量,从而提高代码自动生成的效果,通过对初始代码进行解析和编码操作,可以得到更加准确和高质量的代码表征向量,从而提高代码自动生成的效果,达到了无需人工标注,就能训练生成代码表示向量的编码器的目的,从而实现了提高代码表示向量的生成效率,优化代码表示向量的生成准确度,降低编码器的训练成本的技术效果,进而解决了相关技术中代码表示向量的生成效率的技术问题。
作为一种可选的方案,上述方法还包括:获取一组样本代码;对一组样本代码分别执行代码解析操作,得到一组样本语法树;对一组样本语法树分别执行自动识别操作,得到一组子树,并生成一组样本标签,其中,一组子树与一组样本标签一一对应,样本标签用于指示对应的子树所属的样本语法树;利用初始编码器确定一组样本表征向量和一组子树表征向量,其中,一组样本表征向量与一组样本语法树一一对应,一组子树表征向量与一组子树一一对应;根据一组样本表征向量和一组子树表征向量确定多组样本概率,其中,一组样本概率与一个样本表征向量对应;根据一组样本标签和多组样本概率训练初始编码器,直到初始编码器对应的损失函数满足预设损失条件。
可选地,在本实施例中,首先,需要获取一组样本代码,并对其进行代码解析操作,得到一组样本语法树。接着,对这组样本语法树进行自动识别操作,得到一组子树,并生成一组样本标签。这些样本标签用于指示对应的子树所属的样本语法树。为了进一步提高分类效果,需要利用初始编码器确定一组样本表征向量和一组子树表征向量。其中,一组样本表征向量与一组样本语法树一一对应,一组子树表征向量与一组子树一一对应。最后,根据一组样本表征向量和一组子树表征向量确定多组样本概率。其中,每组样本概率与一个样本表征向量对应。通过将一组样本标签和多组样本概率结合起来,可以训练初始编码器,直到初始编码器对应的损失函数满足预设损失条件。上述基于代码解析和自动识别的样本标签所训练的编码器可以有效地提高分类效果,并为后续的机器学习任务提供更有力支持。
在一个示例性的实施例中,在自然语言处理领域中,对一组样本语法树进行自动识别操作并得到一组子树是一个非常重要的任务。这个任务的实现可以帮助人们更好地理解和处理自然语言,从而提高自然语言处理的效率和精度。
首先,需要了解语法树的定义和结构。语法树是一种用于表示句子结构的树形结构,它将句子中的每个单词和短语都映射到树的节点上,并用边来表示它们之间的关系。在语法树中,每个节点都代表一个短语或单词,而每个边都代表它们之间的关系。
接下来,需要实现对一组样本语法树分别执行自动识别操作,得到一组子树。这个任务可以通过以下步骤来完成:
S1,预处理:首先,需要对每个样本语法树进行预处理,包括去除停用词、词干提取、词性标注等操作。这些操作可以帮助更好地理解句子结构和单词之间的关系。
S2,特征提取:需要从每个样本语法树中提取特征。这些特征可以包括节点的词性、节点的深度、节点的父节点等信息。通过提取这些特征,可以更好地了解每个节点在整个语法树中的位置和作用。
S3,模型训练:需要使用机器学习算法对每个样本语法树进行训练。常用的机器学习算法包括决策树、支持向量机、神经网络等。通过训练模型,可以得到一个能够自动识别子树的模型。
S4,子树识别:可以使用上述训练好的模型对新的语法树进行子树识别。具体来说,可以将新的目标语法树输入到模型中,并得到模型预测出的子树结果。
总之,对一组样本语法树分别执行自动识别操作,得到一组子树是一个非常重要的任务。通过上述步骤的实现,可以更好地理解和处理自然语言,并将其应用于各种实际场景中。
作为一种可选的方案,利用初始编码器确定一组样本表征向量,包括:
通过如下方式确定一组样本表征向量,其中,每次确定的样本表征向量被视为目标样本表征向量,目标样本表征向量与目标样本语法树对应:
获取目标样本语法树包括的节点集合、节点特征集合以及边集合,其中,节点集合中的每个节点与节点特征集合中的部分节点特征对应,边集合中的一个边用于连接节点集合中的父节点和子节点,节点特征集合中的节点特征用于表示对应节点的代码信息;
使用层级树卷积神经网络对节点集合、节点特征集合以及边集合进行处理,确定节点集合中各个节点对应的节点表征向量;
基于注意力机制对各个节点对应的节点表征向量执行聚合操作,确定目标样本表征向量。
可选地,在本实施例中,上述语法树是一种用来表示文本中各个单词之间语法关系的数据结构。它通常是一棵有根树,其中每个节点表示一个单词或一个短语,在本实施例中,每个节点表示一个或多个代码词汇,每条边表示两个节点之间的语法关系。通过分析语法树,可以识别出文本中的各种语法结构。
在语法树中,每个节点通常包含以下信息:
标签:表示节点的类型,如名词、动词、形容词等。
值:表示节点所代表的单词或短语。
子节点:表示当前节点的子节点。
每条边通常包含以下信息:
标签:表示两个节点之间的语法关系,如主谓关系、定中关系等。
父节点:表示当前边所连接的父节点。
子节点:表示当前边所连接的子节点。
示例性地,获取目标样本语法树的节点集合、节点特征集合和边集合通常需要进行以下步骤:
S1,分词:将目标样本文本进行分词,得到单词序列。
S2,词性标注:对分词结果进行词性标注,得到每个单词的词性。
S3,句法分析:对分词和词性标注结果进行句法分析,得到目标样本的语法树。
S4,节点集合:遍历语法树,将所有节点加入到节点集合中。
S5,节点特征集合:遍历语法树,将所有节点的标签、值等特征加入到节点特征集合中。
S6,边集合:遍历语法树,将所有边加入到边集合中。
以上步骤可以通过使用各种自然语言处理工具和算法来实现。例如,可以使用NLTK、Stanford Parser等工具来进行分词、词性标注和句法分析。对于节点集合、节点特征集合和边集合的获取,则可以通过编写相应的代码来实现。
可选地,在本实施例中,层级树卷积神经网络(HTCN)是一种用于处理图形数据的深度学习模型。它可以有效地处理节点集合、节点特征集合以及边集合,并确定节点集合中各个节点对应的节点表征向量。
首先,HTCN使用递归神经网络(RNN)来处理树形结构数据。它通过对树的每个节点进行递归计算,将节点的表征向量从底层向上传递到根节点。在这个过程中,HTCN使用卷积神经网络(CNN)来捕捉节点之间的局部关系。
具体来说,图5是根据本申请实施例的又一种可选的代码表示的生成方法的示意图,如图5所示,HTCN的计算过程可以分为以下几个步骤:
S502,对每个节点进行初始化,每个节点都有一个初始表征向量,可以是随机生成的或者是从外部输入的;
S504,对每个节点进行递归计算,从叶子节点开始,按照树的拓扑结构进行递归计算,对于每个节点,HTCN会将其子节点的表征向量通过CNN(卷积神经网络)进行合并,并将结果作为当前节点的新表征向量;
S506,将根节点的表征向量作为整个树的表征向量,计算完成后,根节点的表征向量即为整个树的表征向量。
通过上述计算过程,HTCN可以将树形结构数据转化为固定长度的向量表示。这些向量可以作为输入传递给其他深度学习模型进行进一步处理。
在实际应用中,需要将HTCN应用于具体的数据集。为此,需要对数据进行预处理,并定义HTCN的结构和参数。
对于节点集合和边集合,需要将它们转化为树形结构。一种常用的方法是使用最小生成树算法(MST)来构建树形结构。对于节点特征集合,可以使用传统的特征工程方法来提取特征,并将其作为初始表征向量输入到HTCN中。
总之,HTCN是一种用于处理树形结构数据的深度学习模型,可以有效地处理节点集合、节点特征集合以及边集合,并确定节点集合中各个节点对应的节点表征向量。在实际应用中,需要对数据进行预处理,并定义HTCN的结构和参数,然后使用训练数据对其进行训练,并使用测试数据对其进行评估。
作为一种可选的方案,使用层级树卷积神经网络对节点集合、节点特征集合以及边集合进行处理,确定节点集合中各个节点对应的节点表征向量,包括:根据节点集合、节点特征集合以及边集合确定一组初始化节点表征向量;使用层级树卷积神经网络对一组初始节点表征向量执行卷积操作,得到各个节点对应的节点表征向量,其中,每个初始节点表征向量执行卷积操作所使用的权重矩阵包括与父节点关联的第一权重矩阵、与左邻节点关联的第二权重矩阵以及与右邻节点关联的第三权重矩阵,第一权重矩阵、第二权重矩阵以及第三权重矩阵对应的权重与对应节点的节点深度和节点位置相关联。
示例性地,以目标样本语法树为T,则表示目标样本语法树由节点集V,节点特征集X和边E组成。树中的边连接一个节点和其子节点。AST中的每个节点也包含其对应的文本(或标记)和类型(例如操作符类型、语句类型、函数类型等)等来自底层代码的信息。最初使用D维实值向量表示节点的特征。将每个节点v关联到一个隐藏状态向量,从特征向量开始初始化。通过融合后的文本向量和线性层来初始化节点。文本和类型对应的向量矩阵在整个模型训练流程中是可学习的,形式上定义为和。
在层级树卷积神经网络中,通过二叉树模拟AST上的卷积窗口,每个节点的权重矩阵是三个固定矩阵(分别是“上”、“左”和“右”节点的权值,对应于上述第一权重矩阵、第二权重矩阵以及第三权重矩阵)和偏置项的加权和。因此,对于具有深度d的原始 AST 中的一个卷积窗口,它包括与之对应的向量,其中,该窗口的卷积输出y可以定义为:
;
其中,表示与节点深度和位置相对应的权重。
作为一种可选的方案,基于注意力机制对各个节点对应的节点表征向量执行聚合操作,确定目标样本表征向量,包括:为各个节点对应的节点表征向量关联隐藏状态向量,得到一组节点状态向量;根据一组节点状态向量与全局注意向量之间的归一化内积,确定各个节点对应的权重值;利用相对应的权重值与节点表征向量进行加权线性组合,确定目标样本表征向量。
可选地,在本实施例中,上述基于注意力机制对各个节点对应的节点表征向量执行聚合操作,确定目标样本表征向量,可以按照以下步骤进行:
S1,对目标代码表征向量序列执行注意力机制,得到每个节点对应的注意力权重;
S2,使用注意力权重对各个节点对应的节点表征向量进行加权平均,得到目标样本表征向量。
具体来说,可以使用一些注意力机制的模型,如Self-Attention、Transformer等,对节点表征向量序列进行处理。这些模型可以计算每个节点对应的注意力权重,并将注意力权重应用于各个节点对应的节点表征向量。最后,根据注意力权重对节点表征向量进行加权平均,得到目标样本表征向量。需要注意的是,不同的注意力机制模型有不同的配置和超参数,需要根据具体情况进行调整。
图6是根据本申请实施例的又一种可选的代码表示的生成方法的示意图,如图6所示:
在学习节点表征向量后需要一种聚合方法将所有节点表征向量合并为一个固定的向量,以代表代码片段。使用注意力机制来聚合节点。形式上一个注意力向量被随机初始化并与网络的更新同时学习。给定n个节点状态向量:,每个的注意权重计算为节点状态向量T和全局注意向量之间的归一化内积:
;
需要说明的是,上述指数操作用于使得注意力权重为正,并使它们除以它们的总和。聚合的代码向量 代表整个代码片段。它是节点状态向量的加权线性组合,其权重为它们的注意力分数:
(公式1);
作为一种可选的方案,根据一组样本表征向量和一组子树表征向量确定多组样本概率,包括:通过如下方式根据一组样本表征向量和一组子树表征向量确定多组样本概率,其中,每次参与计算的样本表征向量被视为目标样本表征向量,目标样本表征向量与目标样本语法树对应,目标样本表征向量与一组样本概率对应:根据一组样本标签从一组子树表征向量中确定正样本子树表征向量和负样本子树表征向量,其中,正样本子树表征向量表示是从目标样本语法树中识别到的子树对应的表征向量,负样本子树表征向量表示不是从目标样本语法树中识别到的子树对应的表征向量;将正样本子树表征向量和负样本子树表征向量分别输入初始编码器,确定一组样本概率。
可选地,在本实施例中,上述根据一组样本标签从一组子树表征向量中确定正样本子树表征向量和负样本子树表征向量可以包括但不限于如下步骤:
S1,从一组样本标签中查找与输入的目标样本语法树对应的多个样本子树;
S2,将上述多个样本子树对应的子树表征向量确定为上述正样本子树表征向量;
S3,将一组子树中除上述多个样本子树之外的其它子树确定为负样本集合,从对负样本集合进行负采样,得到负样本子树,并将对应的表征向量确定为上述负样本表征向量。
需要说明的是,上述正样本和负样本的数量可以相同。
作为一种可选的方案,将正样本子树表征向量和负样本子树表征向量分别输入初始编码器,确定一组样本概率,包括:获取每个正样本子树表征向量和每个负样本子树表征向量分别与目标样本表征向量之间的点积;根据点积确定一组样本概率,其中,一组样本概率包括每个正样本子树表征向量和每个负样本子树表征向量分别属于目标样本语法树的概率。
在一个示例性的实施例中,图7是根据本申请实施例的又一种可选的代码表示的生成方法的示意图,如图7所示,从提取子树的过程中,可以确定训练数据集中所有子树的词汇表(对应于前述的一组子树)。子树的向量是可学习的参数,形式上定义为,其中,是从训练语料库中提取的子树集。子树i的向量是的第i行。模型的预测分布被计算为代码向量与每个子树向量的(softmax归一化)点积之和:
(公式2);
其中,是向量和代码向量之间的归一化点积,即子树出现在给定代码片段C中的概率。最后学习这些参数:
。
作为一种可选的方案,对一组样本语法树分别执行自动识别操作,得到一组子树,并生成一组样本标签,包括:通过如下方式对一组样本语法树分别执行自动识别操作,得到一组子树和一组样本标签:采用词向量表示模型对n个样本语法树中第i个样本语法树进行采样,确定s个子树,其中,s个子树的根节点类型为预设节点类型,s个子树对应的样本标签均指示对应子树属于第i个样本语法树,i≤n,i、n、s均正整数;将n·s个子树累积为一组子树,并将n·s个子树对应的样本标签确定为一组样本标签。
可选地,在本实施例中,上述词向量表示模块可以包括但不限于任何可以从语法树中识别出子树的自然语言学习模型,上述采样方式可以包括但不限于随机采样(RandomSampling):从概率分布中随机选择一个样本。这种方法简单易用,但可能会导致一些不太常见的样本被选择。贪婪采样(Greedy Sampling):选择概率分布中概率最高的样本。这种方法通常会导致生成的样本重复和缺乏多样性。重要性采样(Importance Sampling):基于给定的概率分布,从中选择样本。这种方法通常用于处理高维空间中的复杂分布。马尔可夫链蒙特卡罗采样(Markov Chain Monte Carlo Sampling):使用马尔可夫链来模拟概率分布,从而选择样本。这种方法通常用于处理高维空间中的复杂分布。
需要说明的是,在本实施例中,可以采用查找包括预设节点类型的子树的方式完成采样工作,例如,可以通过遍历AST,选择根节点类型为{expression,declaration,condition}的子树。这些相对细粒度的代码元素通常是有意义的,且足够小可以被认为是大型代码库中常见的“单词”之一。即使它们的代码表现形式可能不同(由于不同的标识符名称,例如int n=arr.length与int m=x.length,当它们的语法结构相似时,这些小的代码元素通常具有类似的含义)。此外还考虑代表单个关键字的节点,例如if,for,while。可以将这些节点视为大小为1的子树。
其中,可以不考虑细粒度的子树,例如整个if,while,for语句,因为这些子树通常太大以至于每个作为单个单词出现得太少,不利于在编码器中直接学习其表示,或者,大的子树之间的语法差异不一定意味着相应的代码具有不同的含义,而编码器可能更难以识别它们之间的语义相似性。
示例性地,上述预设节点类型可以包括但不限于表达式类型的代码、声明式类型的代码、条件类型的代码等。这几种类型的节点和其子节点通常可以表示一些有意义的代码片段。
在一个示例性的实施例中,可以将每个语法树表示为一个向量。使用词向量表示模型(如Word2Vec或GloVe或Skip-gram)将每个单词表示为一个向量,然后将整个语法树表示为所有单词向量的平均值或加权平均值。
以Skip-gram为例,Skip-gram是一种词向量表示方法,是自监督学习中的一种表示模型。通过给定一个由单词组成的句子,skip-gram可以学习获得每个单词的向量表示,使得在相似语境下的单词的向量表示相似。Doc2vec:是一种扩展自word2vec的算法,用于文档级别的向量表示学习。利用分布式Skip-gram模型,能够学习任意长度的序列(如句子、段落、整个文档)的表示。给定一个文档集合和从文档中采样的词语序列,skip-gram模型可学习到文档和每个词语的分布式表示。它通过将词语看作出现在文档上下文中并尝试最大化对数似然函数来实现。
Doc2vec是word2vec的扩展,Doc2vec使用称为段落向量的skip-gram模型的实例,它是一个分布式词袋(可称为doc2vec skip-gram),能够学习任意长度的序列(例如句子,段落甚至整个文档)的向量表示。
示例性地,给定一组文档和从文档中采样的一个单词序列,skip-gram学习文档和每个采样单词的D维向量,即。该模型通过将单词视为在文档的上下文中出现并尝试最大化对数似然函数:
;
其中,概率,v是词汇表包含所有文档中的所有单词。
需要说明的是,在本申请中,将抽象语法树(AST)视为文档,将抽象语法树中(AST)的子树视为文档中的单词,并使用抽象语法树(AST)的编码器来学习任何大小的AST的向量的想法,类比于文档向量。
在一个示例性的实施例中,上述Skip-gram模型可以包括但不限于如下步骤:
S1,one-hot编码,其中,每个子树形成V·1的向量,对于整个子树集合即为V·V的矩阵;
S2,word embedding 词嵌入,根据索引映射,将每个子树映射到d维空间。通过这样的方式可以将所有的子树映射到矩阵W上(矩阵W的形状为V·d),并且每个子树与矩阵中的某列一一对应;
S3,skip-gram模型训练。
需要说明的是,在本实施例中,给定一个抽象语法树T,从T中采样s个子树并作为上下文来学习T的表示:
将整个AST视为一个文档,将其子树视为文档中的单词的类比。给定一组抽象语法树和所有子树的集合,将,分别表示,的D维向量。通过将子树 视为出现在抽象语法树的上下文中,目标是最大化以下对数似然概率:
;
对整个 AST 进行编码,以获取,然后使用预测识别的子树。
具体步骤如下:
S1,对于数据集中的每个 AST,识别一组子树,并将所有子树累积为子树词汇表;
S2,将 AST 输入层级树卷积神经网络编码器中,以生成代码向量。然后使用来预测在前面步骤中识别的子树;
其中,图8是根据本申请实施例的又一种可选的代码表示的生成方法的示意图,如图8所示,包括但不限于如下步骤:
S802,初始化每个节点对应的向量;
S804,通过CNN编码器得到输入AST代码的向量表示;
S806,根据公式2计算每个子树的概率;
S808,根据子树对应的标签(是否属于输入的AST树)计算损失函数和梯度,并反向传播,从而训练整个神经网络;
S810,经过N轮训练,得到每个节点最终的向量。
S3,在编码器训练完成后,将其用作下游任务的预训练模型。
作为一种可选的方案,上述方法还包括:获取待进行代码聚类的第一代码;对第一代码执行代码解析操作,得到第一代码对应的第一代码语法树;使用目标编码器对第一代码语法树执行编码操作,得到第一代码对应的第一样本代码表征向量;确定第一样本代码表征向量和目标代码表征向量之间的相似度,并将相似度满足第一相似度条件的第一样本代码表征向量确定为第一代码表征向量;对第一代码表征向量执行解码操作,得到第一目标代码,其中,初始代码与第一目标代码具有相同的聚类结果。
可选地,在本实施例中,上述第一代码可以理解为需要进行聚类的代码库中的代码,因此,可以先确定需要进行聚类的代码库,并选择一种聚类算法,例如K-means或层次聚类。将代码转换为可用于聚类算法的向量表示,运行聚类算法并确定聚类的数量,分析聚类结果并确定它们是否有意义,如果需要,调整参数并重新运行算法。
需要说明的是,代码聚类任务是自动将相似的代码片段放入同一组中,无需任何监督。给定预训练的模型为任何代码片段产生的代码向量,可以通过基于欧几里德距离的相似度度量来定义相似度度量,并应用聚类算法(如K-means)来实现任务。
作为一种可选的方案,获取待进行代码比对的第二代码;对第二代码执行代码解析操作,得到第二代码对应的第二代码语法树;使用目标编码器对第二代码语法树执行编码操作,得到第二代码对应的第二样本代码表征向量;确定第二样本代码表征向量和目标代码表征向量之间的相似度,并根据相似度是否满足第二相似度条件确定第二代码与初始代码的比对结果。
可选地,在本实施例中,上述代码比对任务可以应用于包括但不限于代码克隆检测,其中,初始代码即为由第二代码克隆得到的代码,而后续检测克隆使用有监督和无监督的方法。尽管深度学习方法用于检测代码克隆,但它们需要有标记的数据来训练有监督学习模型。因此需要人工将一对片段标记为克隆,从而限制了通过收集大量数据来检测克隆的能力。为了减轻需要标记成对数据训练监督克隆检测器的需求,使用基于相似性测量的无监督方法:对于一对代码片段,通过使用余弦相似度测量两个向量之间的相似度来衡量两个向量之间的相似度;当向量之间的余弦相似度高于某个阈值时则将该对视为克隆,一般选择0.8作为阈值。
作为一种可选的方案,确定第二样本代码表征向量和目标代码表征向量之间的相似度,并根据相似度是否满足第二相似度条件确定第二代码与初始代码的比对结果之后,上述方法还包括:获取与第二代码对应的目标代码名称和/或目标代码语言类型;在比对结果指示第二代码与初始代码相似的情况下,将目标代码名称确定为初始代码的代码名称,和/或,将初始代码的代码语言类型确定为目标代码语言类型。
可选地,在本实施例中,上述代码语言类型包括多种主流语言类型,上述代码名称可以理解为表示代码类型的名称,也即,可以实现跨语言代码到代码搜索。
在一个示例性的实施例中,代码到代码搜索对于开发人员来说是有用的,可以在大型代码库中查找与给定代码查询相似的其他代码。例如正在将以Java实现的排序算法迁移到另一种语言(例如C#)上的开发人员可能希望查看在C#中存在相同排序算法的实现,而不是从头开始重写C#代码。现有的代码到代码搜索引擎仅考虑在一种编程语言中的搜索问题。本实施例使用了基于SrcML表示的高效解析器的AST,因为它是多种主流语言(Java,C,C ++,C#和Objective C)中AST节点类型的组合词汇表。预训练的模型可以接收这5种语言中任何代码片段的SrcML AST结构。给定一个查询中的代码片段,目标是检索功能上与给定代码片段功能相似的其他编程语言中的代码片段。由于所有代码片段都可以表示为向量表示形式,因此这个问题可以形式化为向量空间中的最近邻查询。
下面结合具体的示例,对本申请进行进一步的解释说明:
本申请实施例提出了一种自监督学习技术用于代码表示学习。现有的代码表示模型存在一些限制,例如它们经过特定下游任务标记的数据集训练,不足以灵活生成不同代码单元的表示。本申请实施例通过将自监督学习概念适应于代码的抽象语法树以克服这些限制。
核心技术点如下:
提出了一种针对代码表示学习的自监督学习技术,通过预测从抽象语法树中自动识别的子树来训练代码表示,并且无需人工标注和昂贵的图构建开销。
2)设计了一种编码器来用于各种下游任务,如代码聚类、代码克隆检测和代码搜索等。
3)提出了一种基于层级树卷积神经网络的解码器来重新生成代码,以进一步提高对代码进行分类的准确性。该方法可以捕捉代码的结构信息。
本申请实施例主要面向企业大规模代码开发平台。本申请实施例提出了一种自监督学习方法用于代码表示学习。通过预测从抽象语法树的上下文中自动识别出的子树来训练代码表示,而无需任何人工标注或昂贵的图形构建开销。该方法可用作各种下游任务的编码器,例如代码聚类、代码克隆检测和代码搜索。本申请实施例在产品侧的应用主要是用于各种软件代码开发的下游任务,如软件仓库中的代码聚类、代码克隆检测和代码搜索、方法名称预测等。本申请实施例装置已经在很多业务代码数据集上进行了评估,并且在各种下游任务中取得了良好的表现。
学习代码表示已经在软件工程中找到了许多用途,例如代码分类、代码搜索、注释生成和错误预测等。当前代码表示主要通过代码单元、语法树、依赖图、树中路径或其变体的组合实现代码表示,但现有的学习技术存在一个主要限制,即这些模型通常是在针对特定下游任务标记的数据集上进行训练的,因此代码表示可能不适用于其他任务。为此本申请实施例提出了一种自我监督学习方法,通过自动识别抽象语法树(AST)上下文中的子树来预测子树,并以此训练代码表示。AST中的子树为训练代码表示的标签,不需要任何人工标记。
本申请实施例使用卷积神经网络作为编码器对大量Java代码进行了模型的训练。然后将此预训练模型应用于下游无监督任务,例如代码聚类、代码克隆检测、跨语言代码搜索,以继续训练模型参数以进行监督任务,如代码分类和方法名称预测。与应用于相同下游任务的先前技术相比,使用本申请实施例可以获得更高的性能。
学习代码表示法(又称为向量)并构建程序预测模型已被证明在许多软件工程任务中很有用,例如分类程序功能、代码搜索、代码注释生成、预测错误、翻译程序等。先前的学习技术存在两个主要限制,阻碍了它们的性能和通用性。
大多数代码表示模型通过(半)监督学习训练。需要为特定的下游任务手动标记数据,然后从中间表示中加工特征,并专门为任务训练模型。这样的人工标记、特征工程和训练工作只适用于特定的任务,可能不容易转移到其他任务。
训练的代码表示只适用于一些固定的代码单元,例如代码单元、语句和函数,并且不能灵活地为不同的代码单元生成向量。这些技术可能会错过不同代码单元之间的有用信息,并且训练的代码表示可能在各种下游任务中表现不佳。为解决这些限制,本申请实施例旨提出了一种新的代码表示的方法(1)可在没有任何人工标注的情况下进行训练;(2)能够灵活地为可以解析为语法树的任何代码单元生成向量;(3)足够通用,训练的代码表示可以在各种下游任务中表现良好。数据来源为公共代码托管平台上的大量源代码和业务代码。虽然代码通常缺乏针对下游任务的准确标签,但可以通过解析器检查代码的语法。利用这样的未标记数据来预训练代码表示用于下游各种任务的程序预测模型。
另外本申请实施例使用自我监督学习技术,通过从现有(未标记的)数据中自动生成虚拟标签,将无监督学习问题重构为监督学习问题。选择一个监督损失函数。在最小化自我监督任务(也称为预处理任务)的损失函数时,为对应的虚拟标签数据产生中间表示。由于预处理任务可以使用任何数据进行训练,因此预处理的表示形式可以携带有关各种数据的良好信息,并且对各种下游任务有益。
本申请实施例的关键思想包括针对源代码训练适合的预训练任务。通过解析器获取语法上有效的代码片段的抽象语法树(AST),并且识别AST中的所有子树,自动使用每个子树作为预训练任务的标签,以预测该子树出现在特定AST中的概率。
本申请实施例将自我监督学习的概念应用于代码的抽象语法树,通过预测自动识别的来自抽象语法树文本上下文中的子树来训练代码表示,不需要任何人工标注或昂贵的图形构建开销。这个模型可以用作各种下游任务的编码器,例如代码聚类、克隆检测和代码搜索。
本申请实施例使用层级树卷积神经网络的编码器训练了一个模型实例,作为大量Java代码的编码器。这个预训练模型可以应用于下游无监督任务,例如代码聚类、克隆检测、跨语言代码搜索,也可以在转移学习方案下重新使用它的权重来继续训练有监督任务的模型权重,例如代码分类和方法名称预测。由SrcML(代码解析器)生成的AST上实现的,并提供了多种编程语言的AST节点类型的组合词汇表(例如Java、C、C ++、C#、Objective C),这意味着本申请实施例是多语言的,在涉及不同语言的任务中产生适当的代码表示,只要代码片段的AST能够被解析器识别。
代码表示学习通常包含以下两个阶段:(1)将代码片段表示为一个中间表示(IR),例如代码单元流,抽象语法树(AST),AST路径或图形;(2)设计一个适合处理这种中间表示的神经网络。这样的神经网络也可以称为编码器,它接收代码IR并将其映射为代码向量(通常是各种代码元素的组合),然后将其输送到学习系统的下一层并针对特定任务的目标函数进行训练。在层级树卷积神经网络中,是AST节点的组合,在监督学习或自监督学习任务中训练的模型可以产生。
Doc2vec是word2vec的扩展。Doc2vec使用称为段落向量的skip-gram模型的实例,它是一个分布式词袋(可称为doc2vec skip-gram),能够学习任意长度的序列(例如句子,段落甚至整个文档)的向量表示。给定一组文档和从文档中采样的一个单词序列,skip-gram学习文档和每个采样单词的D维向量,即。该模型通过将单词视为在文档的上下文中出现并尝试最大化对数似然函数:
;
其中概率,v是词汇表包含所有文档中的所有单词。
在本申请实施例中,将抽象语法树(AST)视为文档,将抽象语法树中(AST)的子树视为文档中的单词,并使用抽象语法树(AST)的编码器来学习任何大小的AST的向量的想法,类比于文档向量。
自监督学习的目标是训练一个编码器E,使得E能够将对象映射为向量表示。向量T是针对代码片段C的抽象语法树(AST)表示。训练编码器E的目的是学习其参数(或权重),使得E能够为代码片段生成向量,使得具有类似句法和语义信息的片段的向量在向量空间中接近。本申请实施例使用基于树的 CNN 作为源代码编码器,给定一个数据集X,包括n个数据,对于每个在X中的数据,自动产生一个预定义的伪标签(不涉及任何人工注释)。
给定一个训练数据集;
目的是最小化损失函数:。
将整个AST视为一个文档,将其子树视为文档中的单词的类比。
示例性地,给定一组抽象语法树和所有子树的集合,将, 分别表示,的D维向量。
通过将子树视为出现在抽象语法树的上下文中,目标是最大化以下对数似然概率:
;
首先对整个 AST 进行编码,以获取,然后使用它来预测在前面步骤中识别的子树。
具体步骤如下:
对于数据集中的每个AST,识别一组子树,并将所有子树累积为子树词汇表;
将AST输入层级树卷积神经网络编码器中,以生成代码向量。然后使用来预测在前面步骤中识别的子树;
在编码器训练完成后,将其用作下游任务的预训练模型。
通过遍历AST,满足某些条件的每个访问节点会导致以访问节点为根节点的子树,选择根节点类型为如下形式的子树:
{expression,declaration,condition};
其中,上述相对细粒度的代码元素通常是有意义的,且足够小可以被认为是大型代码库中常见的“单词”之一。即使它们的代码表现形式可能不同(由于不同的标识符名称,例如int n=arr.length与int m=x.length,当它们的语法结构相似时,这些小的代码元素通常具有类似的含义)。此外还考虑代表单个关键字的节点,例如if,for,while。可以将这些节点视为大小为1的子树。
不考虑细粒度的子树,例如整个if,while,for语句,因为这些子树通常太大以至于每个作为单个单词出现得太少,不利于在编码器中直接学习其表示,或者,大的子树之间的语法差异不一定意味着相应的代码具有不同的含义,而编码器可能更难以识别它们之间的语义相似性。
确定子树之后,可以学习源代码编码器,采用自监督机制。选择层级树卷积神经网络作为源代码编码器。
学习编码器的权重有三个步骤如下所述:
学习节点表示:该步骤是学习输入 AST中T的节点表示。树的信息将从底部向上传播,即父节点将累积它在 AST 中的子孙信息。在累积步骤之后每个节点将包含其后代的信息。
聚合节点信息:由于希望将代码片段的 AST 表示为一个固定维度向量,需要将所有节点向量组合成一个固定的单一向量,可以使用注意力层来实现这个目的。
预测子树:一旦有了则将其用于预测从T提取的子树 ,给定向量 预测子树的概率。
S1,使用层级树卷积神经网络学习节点表示:
树 由节点集V,节点特征集X和边E组成。树中的边连接一个节点和其子节点。AST中的每个节点也包含其对应的文本(或标记)和其类型(例如操作符类型、语句类型、函数类型等)来自底层代码的信息。最初用一个D维实值向量表示节点的特征。将每个节点关联到一个隐藏状态向量,从特征向量进行初始化。通过融合后的文本向量和线性层来初始化节点。文本和类型的向量矩阵在整个模型训练流程中是可学习的,形式上定义为和。
在层级树卷积神经网络中,通过二叉树模拟AST上的卷积窗口,每个节点的权重矩阵是三个固定矩阵(分别是“上”、“左”和“右”节点的权值)和偏置项的加权和。因此对于具有深度d的原始 AST 中的一个卷积窗口,它包括与之对应的向量,其中,该窗口的卷积输出y可以定义为:
;
其中,是与节点深度和位置相对应的权重。
S2,聚合节点的注意力机制:
在学习节点表示后需要一种聚合方法将所有节点合并为一个固定的向量,代表代码片段。使用注意力机制来聚合节点。形式上一个注意力向量被随机初始化并与网络的更新同时学习。给定n个节点状态向量:,每个 的注意权重计算为节点状态向量T和全局注意向量之间的归一化内积:,指数用于使注意力权重为正,并使它们除以它们的总和,以具有1的最大值,就像标准softmax函数一样。聚合的代码向量代表整个代码片段。它是节点状态向量的加权线性组合,其权重为它们的注意力分数:
(公式1);
S3,预测子树:
从提取子树的过程中得到了训练数据集中所有子树的词汇表。子树的向量是可学习的参数,形式上定义为,其中,L是从训练语料库中提取的子树集。子树i的向量是的第i行。模型的预测分布被计算为代码向量与每个子树向量的(softmax归一化)点积之间的乘积:
(公式2);
其中,是向量和代码向量之间的归一化点积,即子树出现在给定代码片段C中的概率。最后学习这些参数:
。
S4,训练后模型的使用:
通过预测子树作为标签。需要注意的是在自监督学习中,通常不关心预文本任务的性能,而是关心学到的权重和模型生成向量的能力。通过将可解析的代码片段解析成AST,并通过编码步骤传递AST以获取向量,训练层级树卷积神经网络编码器可以为任何代码片段生成向量。训练模型中的权重也可以用于下游监督学习任务中的预测模型,以节省训练成本,并潜在地提高它们的预测准确性。
下游应用,包括但不限于如下内容:
1)代码聚类:任务是自动将相似的代码片段放入同一组中,无需任何监督。给定预训练的模型为任何代码片段产生的代码向量,可以通过基于欧几里德距离的相似度度量来定义相似度度量,并应用聚类算法(如K-means)来实现任务。
2)代码克隆检测:检测克隆使用有监督和无监督的方法。尽管深度学习方法用于检测代码克隆,但它们需要有标记的数据来训练有监督学习模型。因此需要人工将一对片段标记为克隆,从而限制了通过收集大量数据来检测克隆的能力。
为了减轻需要标记成对数据训练监督克隆检测器的需求,使用基于相似性测量的无监督方法:对于一对代码片段,通过使用余弦相似度测量两个向量之间的相似度来衡量两个向量之间的相似度;当向量之间的余弦相似度高于某个阈值时则将该对视为克隆。一般选择0.8作为阈值。
3)跨语言代码到代码搜索:代码到代码搜索对于开发人员来说是有用的,可以在大型代码库中查找与给定代码查询相似的其他代码。例如正在将以Java实现的排序算法迁移到另一种语言(例如C#)上的开发人员可能希望查看在C#中存在相同排序算法的实现,而不是从头开始重写C#代码。现有的代码到代码搜索引擎仅考虑在一种编程语言中的搜索问题。可以使用用于SrcML表示的高效解析器的AST,因为它是多种主流语言(Java,C,C ++,C#和Objective C)中AST节点类型的组合词汇表。预训练的模型可以接收这5种语言中任何代码片段的SrcML AST结构。给定一个查询中的代码片段,目标是检索功能上与给定代码片段功能相似的其他编程语言中的代码片段。由于所有代码片段都可以表示为向量表示形式,因此这个问题可以形式化为向量空间中的最近邻查询。
使用大量未标记数据的一个范例是自监督预训练,随后是有监督的微调,它在某个任务上重用部分(或全部)已经训练的神经网络,并继续训练它或仅使用向量输出用于其他任务。这种微调流程通常具有以下好处:(1)加快训练速度,因为不需要从随机初始化的权重开始训练模型,并且(2)即使只有小数据集具有标签,也可以提高下游模型的泛化能力。
层级树卷积神经网络编码器充当预训练模型,在其中权重由自监督学习产生,并被转移来初始化下游有监督学习任务的模型。
1)代码分类:使用代码分类作为下游任务来演示微调过程的实用性。该任务是针对给定的一段代码,将其分类为所属的功能类。
2)方法名预测:使用方法名预测作为第二个下游任务。该任务是为给定的一段代码(没有函数标头)预测反映代码功能的有意义名称。
目前该方案在大规模的代码开发平台中取得了不错的效果,应用于广告和大数据计算等业务,为大数据和广告业务赋能。
可以理解的是,在本申请的具体实施方式中,涉及到用户信息等相关的数据,当本申请以上实施例运用到具体产品或技术中时,需要获得用户许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均指示对应子树属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
根据本申请实施例的另一个方面,还提供了一种用于实施上述代码表示的生成方法的代码表示的生成装置。如图9所示,该装置包括:
获取模块902,用于获取待生成向量表示的初始代码;
转换模块904,用于对所述初始代码执行代码解析操作,得到目标语法树,其中,所述目标语法树用于以树状的形式表示所述初始代码的语法结构;
编码模块906,用于使用预训练的目标编码器对所述目标语法树执行编码操作,得到目标代码表征向量,其中,所述目标代码表征向量用于以向量形式表示所述初始代码,所述目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,所述无监督训练的过程包括将目标样本语法树输入所述初始编码器,由所述初始编码器输出目标子树是否属于所述目标样本语法树的概率,并根据所述概率以及目标标签对所述初始编码器进行训练,所述一组样本语法树包括所述目标样本语法树,所述目标子树来自于对所述一组样本语法树进行识别所得到的一组子树,所述目标标签用于表示所述目标子树是否为所述目标样本语法树中识别到的子树。
作为一种可选的方案,所述装置还用于:获取一组样本代码;对所述一组样本代码分别执行所述代码解析操作,得到所述一组样本语法树;对所述一组样本语法树分别执行自动识别操作,得到所述一组子树,并生成一组样本标签,其中,所述一组子树与所述一组样本标签一一对应,所述样本标签用于指示对应的子树所属的样本语法树;利用所述初始编码器确定一组样本表征向量和一组子树表征向量,其中,所述一组样本表征向量与所述一组样本语法树一一对应,所述一组子树表征向量与所述一组子树一一对应;根据所述一组样本表征向量和所述一组子树表征向量确定多组样本概率,其中,一组样本概率与一个所述样本表征向量对应;根据所述一组样本标签和所述多组样本概率训练所述初始编码器,直到所述初始编码器对应的损失函数满足预设损失条件。
作为一种可选的方案,所述装置用于通过如下方式利用所述初始编码器确定一组样本表征向量:通过如下方式确定所述一组样本表征向量,其中,每次确定的样本表征向量被视为目标样本表征向量,所述目标样本表征向量与所述目标样本语法树对应:获取所述目标样本语法树包括的节点集合、节点特征集合以及边集合,其中,所述节点集合中的每个节点与所述节点特征集合中的部分节点特征对应,所述边集合中的一个边用于连接所述节点集合中的父节点和子节点,所述节点特征集合中的节点特征用于表示对应节点的代码信息;使用层级树卷积神经网络对所述节点集合、所述节点特征集合以及所述边集合进行处理,确定所述节点集合中各个节点对应的节点表征向量;基于注意力机制对所述各个节点对应的节点表征向量执行聚合操作,确定所述目标样本表征向量。
作为一种可选的方案,所述装置用于通过如下方式使用层级树卷积神经网络对所述节点集合、所述节点特征集合以及所述边集合进行处理,确定所述节点集合中各个节点对应的节点表征向量:根据所述节点集合、所述节点特征集合以及所述边集合确定一组初始化节点表征向量;使用层级树卷积神经网络对所述一组初始节点表征向量执行卷积操作,得到所述各个节点对应的所述节点表征向量,其中,每个所述初始节点表征向量执行所述卷积操作所使用的权重矩阵包括与父节点关联的第一权重矩阵、与左邻节点关联的第二权重矩阵以及与右邻节点关联的第三权重矩阵,所述第一权重矩阵、所述第二权重矩阵以及所述第三权重矩阵对应的权重与对应节点的节点深度和节点位置相关联。
作为一种可选的方案,所述装置用于通过如下方式基于注意力机制对所述各个节点对应的节点表征向量执行聚合操作,确定所述目标样本表征向量:为所述各个节点对应的节点表征向量关联隐藏状态向量,得到一组节点状态向量;根据所述一组节点状态向量与全局注意向量之间的归一化内积,确定所述各个节点对应的权重值;利用相对应的所述权重值与所述节点表征向量进行加权线性组合,确定所述目标样本表征向量。
作为一种可选的方案,所述装置用于通过如下方式根据所述一组样本表征向量和所述一组子树表征向量确定多组样本概率:通过如下方式根据所述一组样本表征向量和所述一组子树表征向量确定所述多组样本概率,其中,每次参与计算的样本表征向量被视为目标样本表征向量,所述目标样本表征向量与所述目标样本语法树对应,所述目标样本表征向量与一组样本概率对应:根据所述一组样本标签从所述一组子树表征向量中确定正样本子树表征向量和负样本子树表征向量,其中,所述正样本子树表征向量表示是从所述目标样本语法树中识别到的子树对应的表征向量,所述负样本子树表征向量表示不是从所述目标样本语法树中识别到的子树对应的表征向量;将所述正样本子树表征向量和所述负样本子树表征向量分别输入所述初始编码器,确定所述一组样本概率。
作为一种可选的方案,所述装置用于通过如下方式将所述正样本子树表征向量和所述负样本子树表征向量分别输入所述初始编码器,确定所述一组样本概率:获取每个所述正样本子树表征向量和每个所述负样本子树表征向量分别与所述目标样本表征向量之间的点积;根据所述点积确定所述一组样本概率,其中,所述一组样本概率包括每个所述正样本子树表征向量和每个所述负样本子树表征向量分别属于所述目标样本语法树的概率。
作为一种可选的方案,所述装置用于通过如下方式对所述一组样本语法树分别执行自动识别操作,得到所述一组子树,并生成一组样本标签:通过如下方式对所述一组样本语法树分别执行自动识别操作,得到所述一组子树和所述一组样本标签:采用词向量表示模型对n个样本语法树中第i个样本语法树进行采样,确定s个子树,其中,所述s个子树的根节点类型为预设节点类型,所述s个子树对应的样本标签均指示对应子树属于所述第i个样本语法树,i≤n,i、n、s均正整数;将n·s个子树累积为所述一组子树,并将所述n·s个子树对应的样本标签确定为所述一组样本标签。
作为一种可选的方案,所述装置还用于:获取待进行代码聚类的第一代码;对所述第一代码执行所述代码解析操作,得到所述第一代码对应的第一代码语法树;使用所述目标编码器对所述第一代码语法树执行所述编码操作,得到所述第一代码对应的第一样本代码表征向量;确定所述第一样本代码表征向量和所述目标代码表征向量之间的相似度,并将所述相似度满足第一相似度条件的所述第一样本代码表征向量确定为第一代码表征向量;对所述第一代码表征向量执行解码操作,得到第一目标代码,其中,所述初始代码与所述第一目标代码具有相同的聚类结果。
作为一种可选的方案,所述装置还用于:获取待进行代码比对的第二代码;对所述第二代码执行所述代码解析操作,得到所述第二代码对应的第二代码语法树;使用所述目标编码器对所述第二代码语法树执行所述编码操作,得到所述第二代码对应的第二样本代码表征向量;确定所述第二样本代码表征向量和所述目标代码表征向量之间的相似度,并根据所述相似度是否满足第二相似度条件确定所述第二代码与所述初始代码的比对结果。
作为一种可选的方案,所述装置还用于:所述确定所述第二样本代码表征向量和所述目标代码表征向量之间的相似度,并根据所述相似度是否满足第二相似度条件确定所述第二代码与所述初始代码的比对结果之后,获取与所述第二代码对应的目标代码名称和/或目标代码语言类型;在所述比对结果指示所述第二代码与所述初始代码相似的情况下,将所述目标代码名称确定为所述初始代码的代码名称,和/或,将所述初始代码的代码语言类型确定为所述目标代码语言类型。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
根据本申请的一个方面,提供了一种计算机程序产品,该计算机程序产品包括计算机程序/指令,该计算机程序/指令包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。在该计算机程序被中央处理器1001执行时,执行本申请实施例提供的各种功能。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
图10示意性地示出了用于实现本申请实施例的电子设备的计算机系统结构框图。
需要说明的是,图10示出的电子设备的计算机系统1000仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图10所示,计算机系统1000包括中央处理器1001(Central Processing Unit,CPU),其可以根据存储在只读存储器1002(Read-Only Memory,ROM)中的程序或者从存储部分1008加载到随机访问存储器1003(Random Access Memory,RAM)中的程序而执行各种适当的动作和处理。在随机访问存储器1003中,还存储有系统操作所需的各种程序和数据。中央处理器1001、在只读存储器1002以及随机访问存储器1003通过总线1004彼此相连。输入/输出接口1005(Input /Output接口,即I/O接口)也连接至总线1004。
以下部件连接至输入/输出接口1005:包括键盘、鼠标等的输入部分1006;包括诸如阴极射线管(Cathode Ray Tube,CRT)、液晶显示器(Liquid Crystal Display,LCD)等以及扬声器等的输出部分1007;包括硬盘等的存储部分1008;以及包括诸如局域网卡、调制解调器等的网络接口卡的通信部分1009。通信部分1009经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至输入/输出接口1005。可拆卸介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储部分1008。
特别地,根据本申请的实施例,各个方法流程图中所描述的过程可以被实现为计算机软件程序。例如,本申请的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。在该计算机程序被中央处理器1001执行时,执行本申请的系统中限定的各种功能。
根据本申请实施例的又一个方面,还提供了一种用于实施上述代码表示的生成方法的电子设备,该电子设备可以是图1所示的终端设备或服务器。本实施例以该电子设备为终端设备为例来说明。如图11所示,该电子设备包括存储器1102和处理器1104,该存储器1102中存储有计算机程序,该处理器1104被设置为通过计算机程序执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述电子设备可以位于计算机网络的多个网络设备中的至少一个网络设备。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,获取待生成向量表示的初始代码;
S2,对初始代码执行代码解析操作,得到目标语法树,其中,目标语法树用于以树状的形式表示初始代码的语法结构;
S3,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,其中,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,一组样本语法树包括目标样本语法树,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树。
可选地,本领域普通技术人员可以理解,图11所示的结构仅为示意,电子装置电子设备也可以是智能手机(如、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图11其并不对上述电子装置电子设备的结构造成限定。例如,电子装置电子设备还可包括比图11中所示更多或者更少的组件(如网络接口等),或者具有与图11所示不同的配置。
其中,存储器1102可用于存储软件程序以及模块,如本申请实施例中的代码表示的生成方法和装置对应的程序指令/模块,处理器1104通过运行存储在存储器1102内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的代码表示的生成方法。存储器1102可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器1102可进一步包括相对于处理器1104远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。其中,存储器1102具体可以但不限于用于存储物品的样本代码等信息。作为一种示例,如图11所示,上述存储器1102中可以但不限于包括上述代码表示的生成装置中的获取模块902、转换模块904以及编码模块906。此外,还可以包括但不限于上述代码表示的生成装置中的其他模块单元,本示例中不再赘述。
可选地,上述的传输装置1106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置1106包括一个网络适配器(Network Interface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置1106为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
此外,上述电子设备还包括:显示器1108,用于显示上述初始代码;和连接总线1110,用于连接上述电子设备中的各个模块部件。
在其他实施例中,上述终端设备或者服务器可以是一个分布式系统中的一个节点,其中,该分布式系统可以为区块链系统,该区块链系统可以是由该多个节点通过网络通信的形式连接形成的分布式系统。其中,节点之间可以组成点对点网络,任意形式的计算设备,比如服务器、终端等电子设备都可以通过加入该点对点网络而成为该区块链系统中的一个节点。
根据本申请的一个方面,提供了一种计算机可读存储介质,计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述代码表示的生成方面的各种可选实现方式中提供的代码表示的生成方法。
可选地,在本实施例中,上述计算机可读存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,获取待生成向量表示的初始代码;
S2,对初始代码执行代码解析操作,得到目标语法树,其中,目标语法树用于以树状的形式表示初始代码的语法结构;
S3,使用预训练的目标编码器对目标语法树执行编码操作,得到目标代码表征向量,其中,目标代码表征向量用于以向量形式表示初始代码,目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,无监督训练的过程包括将目标样本语法树输入初始编码器,由初始编码器输出目标子树是否属于目标样本语法树的概率,并根据概率以及目标标签对初始编码器进行训练,一组样本语法树包括目标样本语法树,目标子树来自于对一组样本语法树进行识别所得到的一组子树,目标标签用于表示目标子树是否为目标样本语法树中识别到的子树。
可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。
在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
Claims (15)
1.一种代码表示的生成方法,其特征在于,包括:
获取待生成向量表示的初始代码;
对所述初始代码执行代码解析操作,得到目标语法树,其中,所述目标语法树用于以树状的形式表示所述初始代码的语法结构;
使用预训练的目标编码器对所述目标语法树执行编码操作,得到目标代码表征向量,其中,所述目标代码表征向量用于以向量形式表示所述初始代码,所述目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,所述无监督训练的过程包括将目标样本语法树输入所述初始编码器,由所述初始编码器输出目标子树是否属于所述目标样本语法树的概率,并根据所述概率以及目标标签对所述初始编码器进行训练,所述一组样本语法树包括所述目标样本语法树,所述目标子树来自于对所述一组样本语法树进行识别所得到的一组子树,所述目标标签用于表示所述目标子树是否为所述目标样本语法树中识别到的子树。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获取一组样本代码;
对所述一组样本代码分别执行所述代码解析操作,得到所述一组样本语法树;
对所述一组样本语法树分别执行自动识别操作,得到所述一组子树,并生成一组样本标签,其中,所述一组子树与所述一组样本标签一一对应,所述样本标签用于指示对应的子树所属的样本语法树;
利用所述初始编码器确定一组样本表征向量和一组子树表征向量,其中,所述一组样本表征向量与所述一组样本语法树一一对应,所述一组子树表征向量与所述一组子树一一对应;
根据所述一组样本表征向量和所述一组子树表征向量确定多组样本概率,其中,一组样本概率与一个所述样本表征向量对应;
根据所述一组样本标签和所述多组样本概率训练所述初始编码器,直到所述初始编码器对应的损失函数满足预设损失条件。
3.根据权利要求2所述的方法,其特征在于,所述利用所述初始编码器确定一组样本表征向量,包括:
通过如下方式确定所述一组样本表征向量,其中,每次确定的样本表征向量被视为目标样本表征向量,所述目标样本表征向量与所述目标样本语法树对应:
获取所述目标样本语法树包括的节点集合、节点特征集合以及边集合,其中,所述节点集合中的每个节点与所述节点特征集合中的部分节点特征对应,所述边集合中的一个边用于连接所述节点集合中的父节点和子节点,所述节点特征集合中的节点特征用于表示对应节点的代码信息;
使用层级树卷积神经网络对所述节点集合、所述节点特征集合以及所述边集合进行处理,确定所述节点集合中各个节点对应的节点表征向量;
基于注意力机制对所述各个节点对应的节点表征向量执行聚合操作,确定所述目标样本表征向量。
4.根据权利要求3所述的方法,其特征在于,所述使用层级树卷积神经网络对所述节点集合、所述节点特征集合以及所述边集合进行处理,确定所述节点集合中各个节点对应的节点表征向量,包括:
根据所述节点集合、所述节点特征集合以及所述边集合确定一组初始化节点表征向量;
使用层级树卷积神经网络对所述一组初始节点表征向量执行卷积操作,得到所述各个节点对应的所述节点表征向量,其中,每个所述初始节点表征向量执行所述卷积操作所使用的权重矩阵包括与父节点关联的第一权重矩阵、与左邻节点关联的第二权重矩阵以及与右邻节点关联的第三权重矩阵,所述第一权重矩阵、所述第二权重矩阵以及所述第三权重矩阵对应的权重与对应节点的节点深度和节点位置相关联。
5.根据权利要求3所述的方法,其特征在于,所述基于注意力机制对所述各个节点对应的节点表征向量执行聚合操作,确定所述目标样本表征向量,包括:
为所述各个节点对应的节点表征向量关联隐藏状态向量,得到一组节点状态向量;
根据所述一组节点状态向量与全局注意向量之间的归一化内积,确定所述各个节点对应的权重值;
利用相对应的所述权重值与所述节点表征向量进行加权线性组合,确定所述目标样本表征向量。
6.根据权利要求2所述的方法,其特征在于,所述根据所述一组样本表征向量和所述一组子树表征向量确定多组样本概率,包括:
通过如下方式根据所述一组样本表征向量和所述一组子树表征向量确定所述多组样本概率,其中,每次参与计算的样本表征向量被视为目标样本表征向量,所述目标样本表征向量与所述目标样本语法树对应,所述目标样本表征向量与一组样本概率对应:
根据所述一组样本标签从所述一组子树表征向量中确定正样本子树表征向量和负样本子树表征向量,其中,所述正样本子树表征向量表示是从所述目标样本语法树中识别到的子树对应的表征向量,所述负样本子树表征向量表示不是从所述目标样本语法树中识别到的子树对应的表征向量;
将所述正样本子树表征向量和所述负样本子树表征向量分别输入所述初始编码器,确定所述一组样本概率。
7.根据权利要求6所述的方法,其特征在于,所述将所述正样本子树表征向量和所述负样本子树表征向量分别输入所述初始编码器,确定所述一组样本概率,包括:
获取每个所述正样本子树表征向量和每个所述负样本子树表征向量分别与所述目标样本表征向量之间的点积;
根据所述点积确定所述一组样本概率,其中,所述一组样本概率包括每个所述正样本子树表征向量和每个所述负样本子树表征向量分别属于所述目标样本语法树的概率。
8.根据权利要求2所述的方法,其特征在于,所述对所述一组样本语法树分别执行自动识别操作,得到所述一组子树,并生成一组样本标签,包括:
通过如下方式对所述一组样本语法树分别执行自动识别操作,得到所述一组子树和所述一组样本标签:
采用词向量表示模型对n个样本语法树中第i个样本语法树进行采样,确定s个子树,其中,所述s个子树的根节点类型为预设节点类型,所述s个子树对应的样本标签均指示对应子树属于所述第i个样本语法树,i≤n,i、n、s均正整数;
将n·s个子树累积为所述一组子树,并将所述n·s个子树对应的样本标签确定为所述一组样本标签。
9.根据权利要求1至8中任一项所述的方法,其特征在于,所述方法还包括:
获取待进行代码聚类的第一代码;
对所述第一代码执行所述代码解析操作,得到所述第一代码对应的第一代码语法树;
使用所述目标编码器对所述第一代码语法树执行所述编码操作,得到所述第一代码对应的第一样本代码表征向量;
确定所述第一样本代码表征向量和所述目标代码表征向量之间的相似度,并将所述相似度满足第一相似度条件的所述第一样本代码表征向量确定为第一代码表征向量;
对所述第一代码表征向量执行解码操作,得到第一目标代码,其中,所述初始代码与所述第一目标代码具有相同的聚类结果。
10.根据权利要求1至8中任一项所述的方法,其特征在于,所述方法还包括:
获取待进行代码比对的第二代码;
对所述第二代码执行所述代码解析操作,得到所述第二代码对应的第二代码语法树;
使用所述目标编码器对所述第二代码语法树执行所述编码操作,得到所述第二代码对应的第二样本代码表征向量;
确定所述第二样本代码表征向量和所述目标代码表征向量之间的相似度,并根据所述相似度是否满足第二相似度条件确定所述第二代码与所述初始代码的比对结果。
11.根据权利要求10所述的方法,其特征在于,在确定所述第二样本代码表征向量和所述目标代码表征向量之间的相似度,并根据所述相似度是否满足第二相似度条件确定所述第二代码与所述初始代码的比对结果之后,所述方法还包括:
获取与所述第二代码对应的目标代码名称和/或目标代码语言类型;
在所述比对结果指示所述第二代码与所述初始代码相似的情况下,将所述目标代码名称确定为所述初始代码的代码名称,和/或,将所述初始代码的代码语言类型确定为所述目标代码语言类型。
12.一种代码表示的生成装置,其特征在于,包括:
获取模块,用于获取待生成向量表示的初始代码;
转换模块,用于对所述初始代码执行代码解析操作,得到目标语法树,其中,所述目标语法树用于以树状的形式表示所述初始代码的语法结构;
编码模块,用于使用预训练的目标编码器对所述目标语法树执行编码操作,得到目标代码表征向量,其中,所述目标代码表征向量用于以向量形式表示所述初始代码,所述目标编码器是利用一组样本语法树对初始编码器进行无监督训练得到的编码器,所述无监督训练的过程包括将目标样本语法树输入所述初始编码器,由所述初始编码器输出目标子树是否属于所述目标样本语法树的概率,并根据所述概率以及目标标签对所述初始编码器进行训练,所述一组样本语法树包括所述目标样本语法树,所述目标子树来自于对所述一组样本语法树进行识别所得到的一组子树,所述目标标签用于表示所述目标子树是否为所述目标样本语法树中识别到的子树。
13.一种计算机可读的存储介质,其特征在于,所述计算机可读的存储介质包括存储的程序,其中,所述程序可被终端设备或计算机运行时执行所述权利要求1至11任一项中所述的方法。
14.一种计算机程序产品,包括计算机程序/指令,其特征在于,该计算机程序/指令被处理器执行时实现权利要求1至11任一项中所述方法的步骤。
15.一种电子设备,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为通过所述计算机程序执行所述权利要求1至11任一项中所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310949796.4A CN116661805B (zh) | 2023-07-31 | 2023-07-31 | 代码表示的生成方法和装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310949796.4A CN116661805B (zh) | 2023-07-31 | 2023-07-31 | 代码表示的生成方法和装置、存储介质及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116661805A true CN116661805A (zh) | 2023-08-29 |
CN116661805B CN116661805B (zh) | 2023-11-14 |
Family
ID=87717492
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310949796.4A Active CN116661805B (zh) | 2023-07-31 | 2023-07-31 | 代码表示的生成方法和装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116661805B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117435246A (zh) * | 2023-12-14 | 2024-01-23 | 四川大学 | 一种基于马尔可夫链模型的代码克隆检测方法 |
CN117850870A (zh) * | 2024-03-08 | 2024-04-09 | 四川大学 | 一种代码注释生成方法、装置、电子设备及存储介质 |
CN118444960A (zh) * | 2024-07-04 | 2024-08-06 | 杭州乒乓智能技术有限公司 | 基于接口文档的数据模型自动建立方法、装置和系统 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110008344A (zh) * | 2019-04-16 | 2019-07-12 | 中森云链(成都)科技有限责任公司 | 一种自动给代码打数据结构标签的方法 |
US20210232376A1 (en) * | 2018-06-05 | 2021-07-29 | Beihang University | Vectorized representation method of software source code |
CN113342343A (zh) * | 2021-04-20 | 2021-09-03 | 山东师范大学 | 基于多跳推理机制的代码摘要生成方法及系统 |
CN114385178A (zh) * | 2021-12-14 | 2022-04-22 | 厦门大学 | 基于抽象语法树结构信息增强的代码生成方法 |
US20220374232A1 (en) * | 2021-05-17 | 2022-11-24 | Nec Laboratories America, Inc. | Computer code refactoring |
CN115599392A (zh) * | 2022-11-04 | 2023-01-13 | 中国科学院软件研究所(Cn) | 一种代码处理的方法、装置、介质及电子设备 |
CN115618929A (zh) * | 2021-07-12 | 2023-01-17 | 苏州洞察云信息技术有限公司 | Ast处理方法、神经网络模型训练方法、装置和存储介质 |
CN115904918A (zh) * | 2021-08-16 | 2023-04-04 | 苏州洞察云信息技术有限公司 | 代码特征提取方法、代码检测方法、模型训练方法和装置 |
-
2023
- 2023-07-31 CN CN202310949796.4A patent/CN116661805B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20210232376A1 (en) * | 2018-06-05 | 2021-07-29 | Beihang University | Vectorized representation method of software source code |
CN110008344A (zh) * | 2019-04-16 | 2019-07-12 | 中森云链(成都)科技有限责任公司 | 一种自动给代码打数据结构标签的方法 |
CN113342343A (zh) * | 2021-04-20 | 2021-09-03 | 山东师范大学 | 基于多跳推理机制的代码摘要生成方法及系统 |
US20220374232A1 (en) * | 2021-05-17 | 2022-11-24 | Nec Laboratories America, Inc. | Computer code refactoring |
CN115618929A (zh) * | 2021-07-12 | 2023-01-17 | 苏州洞察云信息技术有限公司 | Ast处理方法、神经网络模型训练方法、装置和存储介质 |
CN115904918A (zh) * | 2021-08-16 | 2023-04-04 | 苏州洞察云信息技术有限公司 | 代码特征提取方法、代码检测方法、模型训练方法和装置 |
CN114385178A (zh) * | 2021-12-14 | 2022-04-22 | 厦门大学 | 基于抽象语法树结构信息增强的代码生成方法 |
CN115599392A (zh) * | 2022-11-04 | 2023-01-13 | 中国科学院软件研究所(Cn) | 一种代码处理的方法、装置、介质及电子设备 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117435246A (zh) * | 2023-12-14 | 2024-01-23 | 四川大学 | 一种基于马尔可夫链模型的代码克隆检测方法 |
CN117435246B (zh) * | 2023-12-14 | 2024-03-05 | 四川大学 | 一种基于马尔可夫链模型的代码克隆检测方法 |
CN117850870A (zh) * | 2024-03-08 | 2024-04-09 | 四川大学 | 一种代码注释生成方法、装置、电子设备及存储介质 |
CN117850870B (zh) * | 2024-03-08 | 2024-05-07 | 四川大学 | 一种代码注释生成方法、装置、电子设备及存储介质 |
CN118444960A (zh) * | 2024-07-04 | 2024-08-06 | 杭州乒乓智能技术有限公司 | 基于接口文档的数据模型自动建立方法、装置和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN116661805B (zh) | 2023-11-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110134757B (zh) | 一种基于多头注意力机制的事件论元角色抽取方法 | |
US11501182B2 (en) | Method and apparatus for generating model | |
CN116661805B (zh) | 代码表示的生成方法和装置、存储介质及电子设备 | |
CN109359297B (zh) | 一种关系抽取方法及系统 | |
CN111738004A (zh) | 一种命名实体识别模型的训练方法及命名实体识别的方法 | |
CN113191148B (zh) | 一种基于半监督学习和聚类的轨道交通实体识别方法 | |
CN114020936B (zh) | 多模态事理图谱的构建方法、系统和可读存储介质 | |
CN113255320A (zh) | 基于句法树和图注意力机制的实体关系抽取方法及装置 | |
CN112541337B (zh) | 一种基于递归神经网络语言模型的文档模板自动生成方法及系统 | |
CN112306494A (zh) | 一种基于卷积和循环神经网络的代码分类及聚类方法 | |
CN115357719B (zh) | 基于改进bert模型的电力审计文本分类方法及装置 | |
CN114358201A (zh) | 基于文本的情感分类方法和装置、计算机设备、存储介质 | |
CN112613306A (zh) | 抽取实体关系的方法、装置、电子设备、及存储介质 | |
CN114742069A (zh) | 一种代码相似度检测方法及装置 | |
CN114742016B (zh) | 一种基于多粒度实体异构图的篇章级事件抽取方法及装置 | |
CN114492661B (zh) | 文本数据分类方法和装置、计算机设备、存储介质 | |
CN115658846A (zh) | 一种适用于开源软件供应链的智能搜索方法及装置 | |
CN108875024B (zh) | 文本分类方法、系统、可读存储介质及电子设备 | |
CN113392929A (zh) | 一种基于词嵌入与自编码器融合的生物序列特征提取方法 | |
CN117828024A (zh) | 一种插件检索方法、装置、存储介质及设备 | |
CN116578671A (zh) | 一种情感-原因对提取方法及装置 | |
CN116680407A (zh) | 一种知识图谱的构建方法及装置 | |
CN116680392A (zh) | 一种关系三元组的抽取方法和装置 | |
CN115964497A (zh) | 一种融合注意力机制与卷积神经网络的事件抽取方法 | |
CN114722774B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40093111 Country of ref document: HK |