CN117270844A - 一种基于树状神经网络机器学习的代码片段功能描述方法 - Google Patents
一种基于树状神经网络机器学习的代码片段功能描述方法 Download PDFInfo
- Publication number
- CN117270844A CN117270844A CN202311443985.0A CN202311443985A CN117270844A CN 117270844 A CN117270844 A CN 117270844A CN 202311443985 A CN202311443985 A CN 202311443985A CN 117270844 A CN117270844 A CN 117270844A
- Authority
- CN
- China
- Prior art keywords
- code
- tree
- abstract syntax
- description
- syntax tree
- 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 59
- 230000006870 function Effects 0.000 title claims abstract description 28
- 238000013528 artificial neural network Methods 0.000 title claims abstract description 13
- 238000010801 machine learning Methods 0.000 title claims abstract description 13
- 239000013598 vector Substances 0.000 claims abstract description 46
- 239000012634 fragment Substances 0.000 claims abstract description 20
- 230000001788 irregular Effects 0.000 claims abstract description 17
- 238000007781 pre-processing Methods 0.000 claims abstract description 17
- 238000012549 training Methods 0.000 claims abstract description 15
- 238000009635 antibiotic susceptibility testing Methods 0.000 claims description 54
- 230000007246 mechanism Effects 0.000 claims description 9
- 238000012545 processing Methods 0.000 claims description 4
- 239000000284 extract Substances 0.000 claims description 3
- 238000000605 extraction Methods 0.000 claims description 3
- 230000004927 fusion Effects 0.000 claims description 3
- 238000004364 calculation method Methods 0.000 claims 1
- 238000006243 chemical reaction Methods 0.000 claims 1
- 230000008569 process Effects 0.000 abstract description 8
- 238000011161 development Methods 0.000 abstract description 7
- 230000002860 competitive effect Effects 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 239000012141 concentrate Substances 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000012546 transfer 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/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- 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
-
- 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/084—Backpropagation, e.g. using gradient descent
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (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)
- Library & Information Science (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开了一种基于树状神经网络机器学习的代码片段功能描述方法,首先选择代码数据集进行预处理,并抽取代码片段抽象语法树,对代码的描述文本进行预处理,再识别抽象语法树中的子树,将不规则树转化为二叉树,对抽象语法树进行嵌入得到抽象语法树的特征向量集,最后构建代码片段逻辑描述模型并进行训练,输入不包含代码注释的代码片段生成代码功能描述。本发明的方法可以快速地将一些不规范的代码片段进行解析,提高复用效率与软件的质量和可靠性,且可以减少复用过程中的资源投入,降低开发成本,通过低成本的软件复用,能够更快地开发和推出新产品,以满足市场需求和竞争压力。
Description
技术领域
本发明属于软件复用技术领域,具体涉及一种基于树状神经网络机器学习的代码片段功能描述方法。
背景技术
在软件的开发过程中,软件复用被认为是压缩软件开发成本的一个重要途径,现在被各类软件开发企业广泛使用以提高开发效率、降低成本并改善软件质量。开发人员为了能够高效地复用曾经的软件代码,需要对企业或者开源的软件代码库有充分的了解,比如实现功能的代码所在的位置、实现的方式以及代码片段对应的输入输出等。在完备的软件开发过程下,充分的文档、代码注释和项目管理可以帮助开发人员更高效地复用。
但是,软件生产的过程往往伴随着大量混乱——文档缺失的早期功能、不规范的代码注释以及无序的项目管理。这些会导致后期的复用成本大大上升,开发人员需要耗费大量的时间学习和推测早期代码的功能或者直接放弃了软件复用。这都与软件工程的目的大相径庭。
为了解决软件复用成本高企的问题,需要一种自动话的方法可以对大量的不规律代码进行相应的归纳总结,并形成简洁的概括性描述,即代码的功能描述,使得开发人员可以方便地找到目标任务的相似代码,从而快速地进行软件复用,提高软件开发效率。
发明内容
为解决上述技术问题,本发明提供了一种基于树状神经网络机器学习的代码片段功能描述方法。
本发明采用的技术方案为:一种基于树状神经网络机器学习的代码片段功能描述方法,具体步骤如下:
S1、选择代码数据集进行预处理,并抽取代码片段抽象语法树,对代码的描述文本进行预处理;
S2、基于步骤S1识别抽象语法树中的子树,将不规则树转化为二叉树,再对抽象语法树进行嵌入得到抽象语法树的特征向量集;
S3、构建代码片段逻辑描述模型并进行训练;
S4、基于步骤S1-S3,生成代码功能描述。
进一步地,所述步骤S1具体如下:
S11、代码数据集选择;
对于指定的编程语言和对应领域的项目代码,选择业务层和功能实现层的代码集,包括:互联网软件的Controller层和Service层。
S12、对步骤S11选择的代码数据集进行预处理;
采用变量名加密的方式对源码进行代码混淆,减少变量名token对于代码片段描述的影响。
S13、对代码集进行抽象语法树的提取;
Fi表示进行代码混淆后的代码片段,使用Fi所使用语言的解析器中的AST解析工具提取其抽象语法树,并用深度遍历的节点集合ASTi进行表示,表达式如下:
ASTi={nodei,1,nodei,2,nodei3,...nodei,n}
其中,nodei,n表示第i个代码片段的第n个节点,node中包括:节点的文本特征(token)、类型特征(type)以及其对应的父节点(parent),当parent为0时,表示该节点为整个AST的根节点。
则每个节点都应当满足格式nodei,j=(token,type,parent)i,j;ASTi的集合即代码库中抽象语法树的集合ASTs={AST1,AST2,...,ASTi}。
S14、对代码的描述文本进行预处理;
被选择的代码片段对应的描述存在于不同的地方,包括:代码头部的接口注释、代码内部的实现注释、需求文档中的功能描述以及接口文档中的方法说明。
将所述被选择的代码片段对应的描述内容进行概括,概括后形成一个三元组,包括:方法的名称(caption)、输入(input)和输出结果(output)。
则每个代码片段对应的方法描述应当满足格式:descriptioni=(caption,input,output)i。
最后将得到的descriptioni与步骤S13中抽象出的ASTi进行捆绑,得到如下集合:
codes={(AST1,description1),(AST2,description2),...,(ASTi,descriptioni)}
其中,codes表示处理好的数据集,ASTi表示第i个代码片段的抽象语法树,descriptioni表示第i个代码片段的方法描述三元组。
进一步地,所述步骤S2具体如下:
S21、识别抽象语法树中的子树;
选取具有表达式语句(expr)、声明式语句(decl)或条件判断语句(condition)类型的节点作为子树的根节点得到对应的子树Ti,j。
其中,Ti,j表示第i个抽象语法树下的第j个子树;对于if、while、for这类关键字单独处理成一个size为1的子树。
然后得到经过上述处理后的抽象语法树的所有子树的集合subtrees={T1,1,T1,2,...};Ti,j具体形式如下所示:
Ti,j={(token,type,parent)i,j,1,(token,type,parent)i,j,2,...,(token,type,parent)i,j,n}
S22、将不规则树转化为二叉树;
由于提取到的ASTs和subtrees集合中所有的树都是不规则树,先利用树转二叉树的规则对它们进行转换。
即将所有兄弟节点进行连接,父子节点只保留最左侧连接,然后将原始树的兄弟节点作为右子节点,原始树的字节点作为左子节点,最后根据树的前序遍历得到可以用于嵌入的二叉树集合ASTs_bin和subtree_bin。
S23、对抽象语法树进行嵌入得到抽象语法树的特征向量集;
在步骤S22中对不规则树进行转化后,使用TBCNN进行树的嵌入。TBCNN采用固定滑动窗口和注意力机制对二叉树的表征进行提取,得到抽象语法树的特征向量集
其中,表示第i个特征向量。
首先对ASTi的token和type进行嵌入,形成每个节点的编码向量或/>对于这些向量,通过使用TBCNN卷积向前传播进行特征提取和融合,最后通过注意力机制生成编码向量,通过softmax来计算ASTi编码向量和所预测子树Ti,j的编码向量的交叉熵,随后反向传播更新参数即可。
最后得到抽象语法树的特征向量集:
进一步地,所述步骤S3具体如下:
S31、构建代码片段逻辑描述数据集;
对于步骤S14中获得的集合codes和步骤S23中获得的集合AST_vectors进行合并,集合codes中每个元素codei被替换为
S32、构建代码片段向量和代码描述之间的关联;
对于步骤S31中获得的集合codes,根据其中对应的descriptioni进行解码。获取目标描述的上下文表示/>并通过softmax计算得到对应的概率。
对于生成的和之前获得的descriptioni计算交叉熵,然后反向传播更新参数。
S33、训练描述生成模型;
基于步骤S31-S32,建立从代码片段的抽象语法树到代码描述的attention模型。使用步骤S31中得到的数据集codes进行训练,训练中对应的交叉熵损失函数L为:
其中,N表示数据集codes中的子集数量。
进一步地,所述步骤S4具体如下:
S41、输入不包含代码注释的代码片段;
对代码片段使用步骤S13中的方法进行预处理,得到其对应的抽象语法树AST。
S42、对代码片段的抽象语法树进行嵌入;
使用步骤S2中的方法,对代码片段的抽象语法树AST进行转换和嵌入得到抽象语法树的特征向量
S43、将抽象语法树的特征表示输入模型;
使用步骤S3中描述的注意力机制模型,对抽象语法树的特征向量进行解码,获得代码片段描述descriptiont。
本发明的有益效果:本发明的方法首先选择代码数据集进行预处理,并抽取代码片段抽象语法树,对代码的描述文本进行预处理,再识别抽象语法树中的子树,将不规则树转化为二叉树,对抽象语法树进行嵌入得到抽象语法树的特征向量集,最后构建代码片段逻辑描述模型并进行训练,输入不包含代码注释的代码片段生成代码功能描述。本发明的方法可以快速地将一些不规范的代码片段进行解析,提高复用效率与软件的质量和可靠性;软件复用目前最大的成本是对不标准代码的学习和应用成本,本发明方法可以减少复用过程中的资源投入,降低开发成本,本发明的方法通过低成本的软件复用,能够更快地开发和推出新产品,以满足市场需求和竞争压力。
附图说明
图1为本发明的一种基于树状神经网络机器学习的代码片段功能描述方法的流程图。
图2为本发明实施例中不规则树转化为二叉树的方法示意图。
图3为本发明实施例中抽象语法树的encoder流程图。
具体实施方式
下面结合附图与实施例对本发明的方法做进一步地的说明。
如图1所示,本发明的一种基于树状神经网络机器学习的代码片段功能描述方法流程图,具体步骤如下:
S1、选择代码数据集进行预处理,并抽取代码片段抽象语法树,对代码的描述文本进行预处理;
S2、基于步骤S1识别抽象语法树中的子树,将不规则树转化为二叉树,再对抽象语法树进行嵌入得到抽象语法树的特征向量集;
S3、构建代码片段逻辑描述模型并进行训练;
S4、基于步骤S1-S3,生成代码功能描述。
在本实施例中,所述步骤S1具体如下:
S11、代码数据集选择;
对于指定的编程语言和对应领域的项目代码,选择业务层和功能实现层的代码集,包括:互联网软件的Controller层和Service层。
选择该部分代码集原因包括:
(1)该部分代码包含了项目的大部分实现逻辑,可复用代码片段的占比更高;
(2)一个项目的完整产出往往伴随着大量的框架性内容,而核心用于实现功能的代码一般只会存在于这些位置;
(3)这类代码是业务的核心代码,各种组织为了方便进行软件资产的管理,这类代码往往会伴有丰富的代码注释和功能文档。
S12、对步骤S11选择的代码数据集进行预处理;
对于S11中选择的代码数据集,需要进行预处理,因为在软件开发过程中,对于不同项目、不同程序员以及不同开发程度的代码片段,即使是相同的逻辑,也会存在对变量名命名不同的情况;因此需要通过减少变量名这类token对于代码逻辑描述的影响,在进行进一步的处理前,对代码片段进行代码混淆,以弱化变量名token对于最终代码嵌入和后续模型训练时的影响。
本实施例只采用变量名加密的方式对源码进行代码混淆,而忽略布局混淆、控制混淆等会对代码逻辑产生影响的混淆方式,通过减少变量名token对于代码片段描述的影响,而代码的逻辑则是需要强调的部分。
S13、对代码集进行抽象语法树的提取;
对于进行了代码混淆后的代码片段Fi,使用Fi所使用语言的解析器中的AST解析工具提取其抽象语法树,并用深度遍历的节点集合ASTi进行表示,表达式如下:
ASTi={nodei,1,nodei,2,nodei,3,...nodei,n}
其中,nodei,n表示第i个代码片段的第n个节点,node中包括:节点的文本特征(token)、类型特征(type)以及其对应的父节点(parent),当parent为0时,表示该节点为整个AST的根节点。
从抽象语法树中深度遍历提取node节点的过程可以用C语言代码进行表示,具体如表1所示:
表1
则每个节点都应当满足格式nodei,j=(token,type,parent)i,j;ASTi的集合即代码库中抽象语法树的集合ASTs={AST1,AST2,...,ASTi}
S14、对代码的描述文本进行预处理;
被选择的代码片段对应的描述存在于不同的地方,包括:代码头部的接口注释、代码内部的实现注释、需求文档中的功能描述以及接口文档中的方法说明。
不同代码片段对应的代码描述格式、内容和位置都会有所不同。本实施例将所述被选择的代码片段对应的描述内容进行概括,概括后形成一个三元组,包括:方法的名称(caption)、输入(input)和输出结果(output)。
其中,caption并不是代码片段的方法名,而是对方法高度概括的描述性语句;而input和output可能会根据实际情况为空,并且在对这两个元素进行整理时,需要关注不同语言对方法的封装方式,如C++中,程序可能会通过指针修改外部变量的形式进行参数的传递。
则每个代码片段对应的方法描述应当满足格式:descriptioni=(caption,input,output)i。
最后将得到的descriptioni与步骤S13中抽象出的ASTi进行捆绑,得到如下集合:
codes={(AST1,description1),(AST2,description2),...,(ASTi,descriptioni)}
其中,codes表示处理好的数据集,ASTi表示第i个代码片段的抽象语法树,descriptioni表示第i个代码片段的方法描述三元组。
在本实施例中,所述步骤S2具体如下:
为了得到代码片段的特征向量,需要对步骤S1中预处理后的抽象语法树进行嵌入,本实施例借助TBCNN来嵌入代码片段的抽象语法树信息。
S21、识别抽象语法树中的子树;
本实施例中需要使用TBCNN方法对抽象语法树进行训练,因此需要先得到每个抽象语法树中的子树。
选取具有表达式语句(expr)、声明式语句(decl)或条件判断语句(condition)类型的节点作为子树的根节点得到对应的子树Ti,j。
其中,Ti,j表示第i个抽象语法树下的第j个子树。
对于if、while、for这类关键字,因为后续的代码块内一般会承接大量的代码片段,导致其子树的表征极难识别,所以对这类关键字会单独处理成一个size为1(只有一个根节点且内容为其本身)的子树。
然后得到经过上述处理后的抽象语法树的所有子树的集合subtrees={T1,1,T1,2,...};Ti,j具体形式如下所示:
Ti,j={(token,type,parent)i,j,1,(token,type,parent)i,j,2,...,(token,type,parent)i,j,n}
S22、将不规则树转化为二叉树;
由于提取到的ASTs和subtrees集合中所有的树都是不规则树,先利用树转二叉树的规则对它们进行转换。
如图2所示,将所有兄弟节点进行连接,父子节点只保留最左侧连接,然后将原始树的兄弟节点作为右子节点,原始树的字节点作为左子节点,最后根据树的前序遍历得到可以用于嵌入的二叉树集合ASTs_bin和subtree_bin。
其中,图2(a)表示原始树示意图,图2(b)表示加线操作,其中虚线表示要删除的线,图2(c)表示抹线操作,图2(d)表示旋转操作。
其过程用C语言代码表示如表2所示:
表2
S23、对抽象语法树进行嵌入得到抽象语法树的特征向量集;
在步骤S22中对不规则树进行转化后,使用TBCNN进行树的嵌入。TBCNN采用固定滑动窗口和注意力机制对二叉树的表征进行提取,从而得到抽象语法树的特征向量集
其中,表示第i个特征向量。
首先对ASTi的token和type进行嵌入,形成每个节点的编码向量或/>对于这些向量,通过使用TBCNN卷积向前传播进行特征提取和融合,最后通过注意力机制生成编码向量,通过softmax来计算ASTi编码向量和所预测子树Ti,j的编码向量的交叉熵,随后反向传播更新参数即可。
使用TBCNN作为Encoder的流程如图3所示,最后得到抽象语法树的特征向量集:
在本实施例中,所述步骤S3具体如下:
为了生成代码片段的逻辑描述,需要对步骤S2种得到的抽象语法书特征向量和步骤S1中得到的代码逻辑描述内容进行映射,构建用于代码片段逻辑描述的Encoder-Decoder模型。
S31、构建代码片段逻辑描述数据集;
对于步骤S14中获得的集合codes和步骤S23中获得的集合AST_vectors进行合并,集合codes中每个元素codei被替换为
S32、构建代码片段向量和代码描述之间的关联;
对于步骤S31中获得的集合codes,根据其中对应的descriptioni进行解码。构建2层transformer解码器结构,其中的masked selfattention层通过使用上三角权重矩阵将目标序列每个词后的词掩藏,使得每个词都智能注意到前面的序列,即只能通过前序的词进行预测,通过该层获取目标描述的上下文表示/>并通过softmax计算得到对应的概率。
对于生成的和之前获得的descriptioni计算交叉熵,然后反向传播更新参数。
S33、训练描述生成模型;
基于步骤S31-S32,建立从代码片段的抽象语法树到代码描述的attention模型。使用步骤S31中得到的数据集codes进行训练,训练中对应的交叉熵损失函数L为:
其中,N表示数据集codes中的子集数量。
在本实施例中,所述步骤S4具体如下:
S41、输入不包含代码注释的代码片段;
对代码片段使用步骤S13中的方法进行预处理,得到其对应的抽象语法树AST。
S42、对代码片段的抽象语法树进行嵌入;
使用步骤S2中的方法,对代码片段的抽象语法树AST进行转换和嵌入得到抽象语法树的特征向量
S43、将抽象语法树的特征表示输入模型;
使用步骤S3中描述的注意力机制(attention)模型,对抽象语法树的特征向量进行解码,获得代码片段描述descriptiont。
本实施例生成的descriptiont如表3所示:
表3
综上,本发明的方法可以快速地将一些不规范的代码片段进行解析,并通过生成的代码功能描述,减少开发人员对这些代码功能的学习和猜测。增加已有的可复用组件库的容量,直接引用和调用组件,加快新系统的开发进度,提高复用效率;大量经过充分测试和验证的软件组件在曾经复用成本高昂的情况下被放弃复用,在本发明的方法的帮助下可以被重新利用,提高新系统的质量和可靠性,这些组件已经在其他项目中得到了验证和优化,因此在新系统中使用它们可以减少错误和缺陷的风险,提高软件质量;软件复用目前最大的成本是对不标准代码的学习和应用成本,通过本发明的方法的帮助,可以减少复用过程中的资源投入,包括开发人员的时间和精力,从而降低了开发成本;通过低成本的软件复用,开发人员可以将精力集中在系统的核心功能和创新点上,而不需要从零开始编写所有代码,这使得他们能够更快地开发和推出新产品,以满足市场需求和竞争压力。
本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的权利要求范围之内。
Claims (5)
1.一种基于树状神经网络机器学习的代码片段功能描述方法,具体步骤如下:
S1、选择代码数据集进行预处理,并抽取代码片段抽象语法树,对代码的描述文本进行预处理;
S2、基于步骤S1识别抽象语法树中的子树,将不规则树转化为二叉树,再对抽象语法树进行嵌入得到抽象语法树的特征向量集;
S3、构建代码片段逻辑描述模型并进行训练;
S4、基于步骤S1-S3,生成代码功能描述。
2.根据权利要求1所述的一种基于树状神经网络机器学习的代码片段功能描述方法,其特征在于,所述步骤S1具体如下:
S11、代码数据集选择;
对于指定的编程语言和对应领域的项目代码,选择业务层和功能实现层的代码集,包括:互联网软件的Controller层和Service层;
S12、对步骤S11选择的代码数据集进行预处理;
采用变量名加密的方式对源码进行代码混淆,减少变量名token对于代码片段描述的影响;
S13、对代码集进行抽象语法树的提取;
Fi表示进行代码混淆后的代码片段,使用Fi所使用语言的解析器中的AST解析工具提取其抽象语法树,并用深度遍历的节点集合ASTi进行表示,表达式如下:
ASTi={nodei,1,nodei,2,nodei3,...nodei,n}
其中,nodei,n表示第i个代码片段的第n个节点,node中包括:节点的文本特征(token)、类型特征(type)以及其对应的父节点(parent),当parent为0时,表示该节点为整个AST的根节点;
则每个节点都应当满足格式nodei,j=(token,type,parent)i,j;ASTi的集合即代码库中抽象语法树的集合ASTs={AST1,AST2,...,ASTi};
S14、对代码的描述文本进行预处理;
被选择的代码片段对应的描述存在于不同的地方,包括:代码头部的接口注释、代码内部的实现注释、需求文档中的功能描述以及接口文档中的方法说明;
将所述被选择的代码片段对应的描述内容进行概括,概括后形成一个三元组,包括:方法的名称(caption)、输入(input)和输出结果(output);
则每个代码片段对应的方法描述应当满足格式:descriptioni=(caption,input,output)i;
最后将得到的descriptioni与步骤S13中抽象出的ASTi进行捆绑,得到如下集合:
codes={(AST1,description1),(AST2,description2),...,(ASTi,descriptioni)}
其中,codes表示处理好的数据集,ASTi表示第i个代码片段的抽象语法树,descriptioni表示第i个代码片段的方法描述三元组。
3.根据权利要求1所述的一种基于树状神经网络机器学习的代码片段功能描述方法,其特征在于,所述步骤S2具体如下:
S21、识别抽象语法树中的子树;
选取具有表达式语句(expr)、声明式语句(decl)或条件判断语句(condition)类型的节点作为子树的根节点得到对应的子树Ti,j;
其中,Ti,j表示第i个抽象语法树下的第j个子树;对于if、while、for这类关键字单独处理成一个size为1的子树;
然后得到经过上述处理后的抽象语法树的所有子树的集合subtrees={T1,1,T1,2,...};Ti,j具体形式如下所示:
Ti,j={(token,type,parent)i,j,1,(token,type,parent)i,j,2,...,(token,type,parent)i,j,n}
S22、将不规则树转化为二叉树;
由于提取到的ASTs和subtrees集合中所有的树都是不规则树,先利用树转二叉树的规则对它们进行转换;
即将所有兄弟节点进行连接,父子节点只保留最左侧连接,然后将原始树的兄弟节点作为右子节点,原始树的字节点作为左子节点,最后根据树的前序遍历得到可以用于嵌入的二叉树集合ASTs_bin和subtree_bin;
S23、对抽象语法树进行嵌入得到抽象语法树的特征向量集;
在步骤S22中对不规则树进行转化后,使用TBCNN进行树的嵌入;TBCNN采用固定滑动窗口和注意力机制对二叉树的表征进行提取,得到抽象语法树的特征向量集
其中,表示第i个特征向量;
首先对ASTi的token和type进行嵌入,形成每个节点的编码向量或/>对于这些向量,通过使用TBCNN卷积向前传播进行特征提取和融合,最后通过注意力机制生成编码向量,通过softmax来计算ASTi编码向量和所预测子树Ti,j的编码向量的交叉熵,随后反向传播更新参数即可;
最后得到抽象语法树的特征向量集:
4.根据权利要求1所述的一种基于树状神经网络机器学习的代码片段功能描述方法,其特征在于,所述步骤S3具体如下:
S31、构建代码片段逻辑描述数据集;
对于步骤S14中获得的集合codes和步骤S23中获得的集合AST_vectors进行合并,集合codes中每个元素codei被替换为
S32、构建代码片段向量和代码描述之间的关联;
对于步骤S31中获得的集合codes,根据其中对应的descriptioni进行解码;获取目标描述的上下文表示/>并通过softmax计算得到对应的概率;
对于生成的和之前获得的descriptioni计算交叉熵,然后反向传播更新参数;
S33、训练描述生成模型;
基于步骤S31-S32,建立从代码片段的抽象语法树到代码描述的attention模型;使用步骤S31中得到的数据集codes进行训练,训练中对应的交叉熵损失函数L为:
其中,N表示数据集codes中的子集数量。
5.根据权利要求1所述的一种基于树状神经网络机器学习的代码片段功能描述方法,其特征在于,所述步骤S4具体如下:
S41、输入不包含代码注释的代码片段;
对代码片段使用步骤S13中的方法进行预处理,得到其对应的抽象语法树AST;
S42、对代码片段的抽象语法树进行嵌入;
使用步骤S2中的方法,对代码片段的抽象语法树AST进行转换和嵌入得到抽象语法树的特征向量
S43、将抽象语法树的特征表示输入模型;
使用步骤S3中描述的注意力机制模型,对抽象语法树的特征向量进行解码,获得代码片段描述descriptiont。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311443985.0A CN117270844A (zh) | 2023-11-01 | 2023-11-01 | 一种基于树状神经网络机器学习的代码片段功能描述方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311443985.0A CN117270844A (zh) | 2023-11-01 | 2023-11-01 | 一种基于树状神经网络机器学习的代码片段功能描述方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117270844A true CN117270844A (zh) | 2023-12-22 |
Family
ID=89201054
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311443985.0A Pending CN117270844A (zh) | 2023-11-01 | 2023-11-01 | 一种基于树状神经网络机器学习的代码片段功能描述方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117270844A (zh) |
-
2023
- 2023-11-01 CN CN202311443985.0A patent/CN117270844A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112149399B (zh) | 基于rpa及ai的表格信息抽取方法、装置、设备及介质 | |
Kohlhase | Using as a semantic markup format | |
US20140156282A1 (en) | Method and system for controlling target applications based upon a natural language command string | |
CN109977014B (zh) | 基于区块链的代码错误识别方法、装置、设备及存储介质 | |
CN110688151B (zh) | 一种面向以太坊Solidity智能合约的安全翻译与解析方法 | |
CN108762743A (zh) | 一种数据表操作代码生成方法及装置 | |
CN111581920A (zh) | 文档转换方法、装置、设备及计算机存储介质 | |
CN112162775A (zh) | 一种基于Transformer和混合代码表示的Java代码注释自动生成方法 | |
CN115543437B (zh) | 一种代码注释生成方法和系统 | |
CN116700780A (zh) | 一种基于抽象语法树代码表征的代码补全方法 | |
CN116151132A (zh) | 一种编程学习场景的智能代码补全方法、系统及储存介质 | |
Dimyadi et al. | Computerising the New Zealand building code for automated compliance audit | |
CN108241658A (zh) | 一种日志模式发现方法及系统 | |
CN112232052A (zh) | 文本拼接方法、装置、计算机设备及存储介质 | |
US7814415B2 (en) | Bytecode localization engine and instructions | |
CN111124380A (zh) | 一种前端代码生成方法 | |
CN115169370B (zh) | 语料数据增强方法、装置、计算机设备及介质 | |
CN117270844A (zh) | 一种基于树状神经网络机器学习的代码片段功能描述方法 | |
CN111080503A (zh) | 一种cs模式下网络舆情应急指挥系统指令编码控制方法 | |
Tucci et al. | Parsing nonlinear languages | |
CN112148879A (zh) | 一种自动给代码打数据结构标签的计算机可读存储介质 | |
CN113536741B (zh) | 中文自然语言转数据库语言的方法及装置 | |
CN114168720A (zh) | 一种基于深度学习的自然语言数据查询方法和存储设备 | |
CN114116779A (zh) | 基于深度学习的电网调控领域信息检索方法、系统和介质 | |
CN110727428A (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 |