CN116187410A - 一种模型训练的方法、代码识别的方法及相应装置 - Google Patents

一种模型训练的方法、代码识别的方法及相应装置 Download PDF

Info

Publication number
CN116187410A
CN116187410A CN202111425345.8A CN202111425345A CN116187410A CN 116187410 A CN116187410 A CN 116187410A CN 202111425345 A CN202111425345 A CN 202111425345A CN 116187410 A CN116187410 A CN 116187410A
Authority
CN
China
Prior art keywords
code
path
codes
vector representation
leaf nodes
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202111425345.8A
Other languages
English (en)
Inventor
姚远
徐圣斌
陈思宇
闫旭辉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Huawei Technologies Co Ltd
Original Assignee
Nanjing University
Huawei Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University, Huawei Technologies Co Ltd filed Critical Nanjing University
Priority to CN202111425345.8A priority Critical patent/CN116187410A/zh
Publication of CN116187410A publication Critical patent/CN116187410A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Computational Linguistics (AREA)
  • Biophysics (AREA)
  • Evolutionary Computation (AREA)
  • General Health & Medical Sciences (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • Biomedical Technology (AREA)
  • Artificial Intelligence (AREA)
  • Mathematical Physics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Electrically Operated Instructional Devices (AREA)

Abstract

本申请公开了一种模型训练的方法及代码识别的方法,可以使用项目代码通过方法代码得到的路径‑上下文来训练关键性模型,然后使用该训练好的关键性模型识别待审查的项目代码中方法代码的关键性信息或者多个方法代码的关键性排序,从而辅助代码审查人员进行代码审查。本申请提供的方案,因为通过方法代码得到的路径‑上下文的粒度小,所以训练得到的关键性模型的准确度高,通过该关键性模型可以快速的输出多个方法代码的排序,从而提高了代码审查的速度。

Description

一种模型训练的方法、代码识别的方法及相应装置
技术领域
本申请涉及计算机技术领域,具体涉及一种模型训练的方法、代码识别的方法及相应装置。
背景技术
在软件项目开发流程中,代码审查(Code Review)是必不可少的环节。代码审查是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题。
代码审查流程中,检视人员阅读并理解代码是最耗时环节。已有的实验中统计,编程人员需要花费平均345秒的时间去理解平均包含4个类的代码提交。随着项目代码量的快速增长以及项目不断加入人员,使得该环节耗时倍增,检视代码面临一个痛点:审查者需花费大量的时间理解代码和变更,特别是涉及多文件的变更。
由此可见,解决理解代码时长问题是很有意义的。
发明内容
本申请提供一种模型训练的方法,用于得到可以识别待审查的项目代码中方法代码关键性的模型,从而可以通过该模型确定出项目代码中方法代码的关键性或者多个方法代码的关键性排序,提高代码审查效率。本申请还提供了相应的装置、计算机设备、计算机可读存储介质和计算机程序产品等。
本申请第一方面提供一种模型训练的方法,包括:获取多个训练样本,其中,每个训练样本为一个发生过变更的项目代码的组合调用图,组合调用图是通过项目代码变更前的代码调用图和变更后的代码调用图组合得到的,组合调用图通过多个节点表示项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示多个方法代码中两个方法代码之间的调用关系,组合调用图的每个节点对应的方法代码还对应有第一关键性信息;针对每个训练样本,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,第一集合中包括多个路径-上下文,其中,每个路径-上下文表示方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息;根据多个方法代码中每个方法代码对应的第一集合以及每个方法代码对应的第一关键性信息,对第一关键性模型进行训练,以得到第二关键性模型;其中:第一关键性模型包括第一层、第二层和第三层,其中,第一层用于将第一集合转换为第一向量表示,第二层用于结合多个方法代码之间的调用关系对每个方法代码的第一向量表示进行处理以得到每个方法代码的第二向量表示,第三层用于根据每个方法代码的第二向量表示确定每个方法代码的第二关键性信息,并根据组合调用图中每个节点的第一关键性信息监督第二关键性信息,以优化第一关键性模型中的参数;第二关键性模型用于输出待审查的目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。
本申请的模型训练的方案可以是在集成开发环境(integrated developmentenvironment,IDE)下完成的,IDE是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
本申请中,项目代码(project code)指的是针对一个项目编写的代码,方法代码(method code)是为完成项目的功能而编写的各种功能的代码。方法代码中可以分为关键方法代码和非关键方法代码,关键方法代码指的是为完成与计算相关的关键逻辑而编写的代码,非关键方法代码指的是为辅助或配合关键方法而编写的代码,也可以说方法代码的关键程度不同。一个项目代码会包含多个方法代码。
本申请中,发生过变更的项目代码指的是被修改过的项目代码,一旦项目代码被修改过,就需要重新做代码审查(Code Review)。代码审查是指在软件开发过程中,通过对源代码进行***性检查的过程,通常的目的是查找各种缺陷,包括代码缺陷、功能实现问题、编码合理性、性能优化等,以保证软件总体质量。
本申请中,代码调用图指的是采用Doxygen工具对项目代码进行方法调用分析得到调用图。代码调用图中包括节点和边,每个节点表示一个方法代码,边表示有调度关系的两个方法代码之间的调用关系。项目发生变更通常指的是部分代码被修改,会有一部分没有被修改的代码。这样,就可以基于没有被修改的代码将变更前的代码调用图和变更后的代码调用图进行组合,以得到组合调用图。组合调用图中会包括变更前的所有方法代码对应的节点及边,以及变更后被修改部分的方法代码对应的节点及边。
本申请中,第一关键性信息可以是方法代码的关键度的值,该值可以采用归一化的形式表示,如:1、0.9、0.8或者其他数值,对此本申请中不做限定。组合调用图中每个节点对应的方法代码的第一关键性信息可以是有经验的程序人员标记好的。
本申请中,在模型训练过程中,可以把每个训练样本作为一个batch进行训练。
本申请中,每个方法代码都可以转换为抽象语法树,抽象语法树包括父节点和叶子节点,上一层的叶子节点可以作为下一层叶子节点的父节点。任意两个叶子节点之间通过其父节点都可以形成一条路径,这样,当有n个叶子节点时,就会有n*(n-1)/2条路径,每两个叶子节点及其之间的路径都可以称为一个路径-上下文。因此,每个方法代码就会都可以转换为一个路径-上下文的第一集合。该第一集合中包含该方法代码转换的抽象语法树中任意两个叶子节点及其中间路径组成的路径-上下文。
本申请中,第一关键性模型可以对第一集合进行向量化处理,这样就可以得到单个方法代码的第一向量表示,然后再结合多个方法代码之间的调用关系,对第一向量表示进行处理,就可以得到用于最终表示每个方法代码的第二向量表示,进而可以根据该第二向量表示确定每个方法代码的第二关键性信息,该第二关键性信息的形式可以参阅第一关键性信息进行理解。
本申请中,优化第一关键性模型中的参数的过程可以是采用梯度下降算法,进行参数优化,最终通过多个训练样本的训练得到可以用于代码识别的第二关键性模型。
由上述第一方面的内容可知,在模型训练的过程中,针对每个项目代码中的方法代码,做了路径-上下文的转换,然后针对该方法代码的路径-上下文的第一集合做了向量化处理,这样细化了训练样本的粒度,训练出来的模型在代码识别时的准确度也会更高,另外,在确定方法代码的向量时还结合了不同方法代码之间的调用关系,考虑了不同方法代码之间的关联性,更进一步提高了模型训练的精度,从而也进一步提高了模型在代码识别时的准确度,这样在代码审查环节可以通过该模型确定出代码的关键性,提高了代码审查效率。
在第一方面的一种可能的实现方式中,上述步骤:针对每个训练样本,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:针对每个训练样本,使用第一关键性模型,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
该种可能的实现方式中,将方法代码转换为路径-上下文的第一集合的过程可以在第一关键模型中来完成,这样,相当于将更多的功能集成在了模型中,提升了模型的能力。
在第一方面的一种可能的实现方式中,上述步骤:根据多个方法代码中每个方法代码对应的第一集合以及每个方法代码对应的第一关键性信息,对第一关键性模型进行训练,包括:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示;根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示;根据每个方法代码的第一向量表示,以及组合调用图中多个方法代码之间的调用关系,确定每个方法代码的第二向量表示;根据每个方法代码的第二向量表示,采用自注意力机制确定每个方法代码的第二关键性信息,并根据组合调用图中每个节点的第一关键性信息监督第二关键性信息,以优化第一关键性模型中的参数。
该种可能的实现方式中,第三向量表示指的是针对每个路径-上下文的向量表示。第一向量表示可以是对第三向量表示求和得到的,也可以是对每个第三向量表示做加权后再求和得到的,还可以是对第三向量表示做降维处理,针对降维后的第三向量表示做加权再求和得到的,本申请中不限定从第三向量表示到第一向量表示的具体的得到方式。由该种可能的实现方式可知,通过三层的向量化处理,可以使最终用于确定方法代码的第二关键性信息的第二向量表示的精准度越高,从而提高了模型的准确性。
在第一方面的一种可能的实现方式中,上述步骤:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示,包括:将每个路径-上下文的两个叶子节点中每个叶子节点分别做分词处理,将每个叶子节点分词处理后得到的多个子词的平均向量表示作为每个叶子节点的向量表示;将两个叶子节点各自的向量表示以及两个叶子节点之间的路径信息的向量表示进行拼接,以得到每个路径-上下文的第三向量表示。
该种可能的实现方式中,叶子节点可以理解为是一个子词串,包括多个子词,每个子词的向量表示都可以从子词的词汇表中查出,可以通过对子词串中每个子词的向量表示先求和再求平均的方式确定出叶子节点的向量表示,两个叶子节点之间的路径的向量表示可以从路径词汇表中查找到,这样,对两个叶子节点的向量表示以及中间路径的向量表示进行拼接,就可以得到路径-上下文的第三向量表示。该种可能的实现方式中,将用于训练模型的向量表示的粒度细化到了子词和路径的级别,进一步提高了模型的准确性。
在第一方面的一种可能的实现方式中,上述步骤:根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示,包括:对第三向量表示进行降维处理,以得到降维后的向量表示;将第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到第一集合对应的第一向量表示,注意力大小是通过降维后的向量表示以及注意力向量确定的。
该种可能的实现方式中,第三向量表示是通过拼接得到的,所以维度较高,可以通过降维处理,得到该第三向量表示降维后的向量表示,将注意力大小作为降维后的加权权重,可以提升重要的路径-上下文的第三向量表示在第一向量表示中的比重。由该种可能的实现方式可知,在确定第一向量表示时使用了注意力机制,有利于突出一些方法代码的关键性,从而提高模型的准确性。
在第一方面的一种可能的实现方式中,上述步骤:将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:将多个方法代码中的每个方法代码转换为一个抽象语法树,抽象语法树包括多个叶子节点,多个叶子节点中的任意两个叶子节点及与两个叶子节点的父节点之间形成一条路径;将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,第一集合包括抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
该种可能的实现方式中,通过抽象语法树来转换路径-上下文,可以提高路径-上下文转换的速度。
在第一方面的一种可能的实现方式中,将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,包括:将任意两个叶子节点以及任意两个叶子节点之间的路径中两个叶子节点按照命名规则进行分词处理,以得到包含任意两个叶子节点以及任意两个叶子节点之间路径的路径-上下文。
该种可能的实现方式中,对叶子节点按照命名规则进行分词处理可以将代码中的功能信息和语义信息代入到路径-上下文的向量表示中用于后续的模型训练,有利于提高模型的准确度。
在第一方面的一种可能的实现方式中,上述步骤:获取多个训练样本之前,该方法还包括:获取多个发生过变更的历史项目代码;针对每个历史项目代码,获取变更前的文件内容和变更后的文件内容;针对变更前的文件内容进行调用分析,得到第一调用图,针对变更后的文件内容进行调用分析,得到第二调用图;基于第一调用图和第二调用图中未发生变更的内容,将第一调用图和第二调用图进行合并,以得到组合调用图。
该种可能的实现方式中,训练样本可以是从历史项目代码中筛选出的发生过变更的历史项目代码。这样可以获得大量的样本用于训练,可以提升模型的精准度。
本申请第二方面提供一种代码识别的方法,包括:接收待审查的目标项目代码,目标项目代码发生过变更;根据目标项目代码确定对应的组合调用图,组合调用图是通过目标项目代码变更前的代码调用图和变更后的代码调用图组合得到的,组合调用图通过多个节点表示目标项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示多个方法代码中两个方法代码之间的调用关系;将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,第一集合中包括多个路径-上下文,其中,每个路径-上下文表示方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息;根据多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息,目标关键性模型包括第一层、第二层和第三层,其中,第一层用于将第一集合转换为第一向量表示,第二层用于结合多个方法代码之间的调用关系对每个方法代码的第一向量表示进行处理以得到每个方法代码的第二向量表示,第三层用于根据每个方法代码的第二向量表示确定每个方法代码的关键性信息或者多个方法代码的关键性排序信息。
本申请的代码识别的方案可以是在集成开发环境(integrated developmentenvironment,IDE)下完成的,IDE是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
本申请中,待审查的目标项目代码指的是该目标项目代码被修改过,需要提交审查人员重新审查该目标项目代码,为了方便审查人员审查代码,可以通过目标关键性模型先确定出目标项目代码中各方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序。
本申请中,目标关键性模型可以是采用上述第一方面或第一方面任一中可能的实现方式训练出来的第二关键性模型。
本申请中,关于其他与第一方面相同的特征可以参阅上述第一方面中的描述进行理解,此处不再重复赘述。
由上述第二方面的内容可知,针对待审查的目标项目代码,先使用目标关键性模型确定出目标项目代码中各方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序。这样可以辅助代码审查人员审查代码,提高了代码审查的效率。
在上述第二方面的一种可能的实现方式中,上述步骤:将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:使用目标关键性模型,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
该种可能的实现方式中,将方法代码转换为路径-上下文的第一集合的过程可以在目标关键模型中来完成,这样,相当于将更多的功能集成在了模型中,提升了模型的能力。
在上述第二方面的一种可能的实现方式中,上述步骤:根据多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息,包括:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示;根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示;根据每个方法代码的第一向量表示,以及组合调用图中多个方法代码之间的调用关系,确定每个方法代码的第二向量表示;根据每个方法代码的第二向量表示,采用自注意力机制确定每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。
该种可能的实现方式中,第三向量表示指的是针对每个路径-上下文的向量表示。第一向量表示可以是对第三向量表示求和得到的,也可以是对每个第三向量表示做加权后再求和得到的,还可以是对第三向量表示做降维处理,针对降维后的第三向量表示做加权再求和得到的,本申请中不限定从第三向量表示到第一向量表示的具体的得到方式。由该种可能的实现方式可知,通过三层的向量化处理,提高了所确定的每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息的准确度。
在上述第二方面的一种可能的实现方式中,上述步骤:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示,包括:将每个路径-上下文的两个叶子节点中每个叶子节点分别做分词处理,将每个叶子节点分词处理后得到的多个子词的平均向量表示作为每个叶子节点的向量表示;将两个叶子节点各自的向量表示以及两个叶子节点之间的路径信息的向量表示进行拼接,以得到每个路径-上下文的第三向量表示。
该种可能的实现方式中,叶子节点可以理解为是一个子词串,包括多个子词,每个子词的向量表示都可以从子词的词汇表中查出,可以通过对子词串中每个子词的向量表示先求和再求平均的方式确定出叶子节点的向量表示,两个叶子节点之间的路径的向量表示可以从路径词汇表中查找到,这样,对两个叶子节点的向量表示以及中间路径的向量表示进行拼接,就可以得到路径-上下文的第三向量表示。该种可能的实现方式中,将用于确定方法代码的关键性信息的向量表示的粒度细化到了子词和路径的级别,进一步提高了所确定的每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息的准确度。
在上述第二方面的一种可能的实现方式中,上述步骤:根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示,包括:对第三向量表示进行降维处理,以得到降维后的向量表示;将第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到第一集合对应的第一向量表示,注意力大小是通过降维后的向量表示以及注意力向量确定的。
该种可能的实现方式中,第三向量表示是通过拼接得到的,所以维度较高,可以通过降维处理,得到该第三向量表示降维后的向量表示,将注意力大小作为降维后的加权权重,可以提升重要的路径-上下文的第三向量表示在第一向量表示中的比重。由该种可能的实现方式可知,在确定第一向量表示时使用了注意力机制,有利于突出一些方法代码的关键性,从而进一步提高了所确定的每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息的准确度。
在上述第二方面的一种可能的实现方式中,上述步骤:将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:将多个方法代码中的每个方法代码转换为一个抽象语法树,抽象语法树包括多个叶子节点,多个叶子节点中的任意两个叶子节点及与两个叶子节点距离最近的根节点之间形成一条路径;将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,第一集合包括抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
该种可能的实现方式中,通过抽象语法树来转换路径-上下文,可以提高路径-上下文转换的速度。
在上述第二方面的一种可能的实现方式中,上述步骤:将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,包括:将任意两个叶子节点以及任意两个叶子节点之间的路径中两个叶子节点按照命名规则进行分词处理,以得到包含任意两个叶子节点以及任意两个叶子节点之间路径的路径-上下文。
该种可能的实现方式中,对叶子节点按照命名规则进行分词处理可以将代码中的功能信息和语义信息代入到路径-上下文的向量表示中用于后续的关键性信息的确定,有利于提高所确定的每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息的准确度。
在上述第二方面的一种可能的实现方式中,上述步骤:根据目标项目代码确定对应的组合调用图,包括:针对目标项目代码,获取变更前的文件内容和变更后的文件内容;针对变更前的文件内容进行调用分析,得到第一调用图,针对变更后的文件内容进行调用分析,得到第二调用图;基于第一调用图和第二调用图中未发生变更的内容,将第一调用图和第二调用图进行合并,以得到组合调用图。
本申请第三方面提供一种模型训练的装置,该模型训练的装置具有实现上述第一方面或第一方面任意一种可能实现方式的方法的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块,例如:获取单元、第一处理单元和第二处理单元,这几个单元可以通过一个处理单元或多个处理单元来实现。
本申请第四方面提供一种代码识别的装置,该代码识别的装置具有实现上述第二方面或第二方面任意一种可能实现方式的方法的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块,例如:接收单元、第一处理单元、第二处理单元和第三处理单元,这三个处理单元可以通过一个处理单元或多个处理单元来实现。
本申请第五方面提供一种计算机设备,该计算机设备包括至少一个处理器、存储器、输入/输出(input/output,I/O)接口以及存储在存储器中并可在处理器上运行的计算机执行指令,当计算机执行指令被处理器执行时,处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第六方面提供一种计算机设备,该计算机设备包括至少一个处理器、存储器、输入/输出(input/output,I/O)接口以及存储在存储器中并可在处理器上运行的计算机执行指令,当计算机执行指令被处理器执行时,处理器执行如上述第二方面或第二方面任意一种可能的实现方式的方法。
本申请第七方面提供一种存储一个或多个计算机执行指令的计算机可读存储介质,当计算机执行指令被处理器执行时,一个或多个处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第八方面提供一种存储一个或多个计算机执行指令的计算机可读存储介质,当计算机执行指令被处理器执行时,一个或多个处理器执行如上述第二方面或第二方面任意一种可能的实现方式的方法。
本申请第九方面提供一种存储一个或多个计算机执行指令的计算机程序产品,当计算机执行指令被一个或多个处理器执行时,一个或多个处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第十方面提供一种存储一个或多个计算机执行指令的计算机程序产品,当计算机执行指令被一个或多个处理器执行时,一个或多个处理器执行如上述第二方面或第二方面任意一种可能的实现方式的方法。
本申请第十一方面提供了一种芯片***,该芯片***包括至少一个处理器,至少一个处理器用于支持模型训练的装置实现上述第一方面或第一方面任意一种可能的实现方式中所涉及的功能。在一种可能的设计中,芯片***还可以包括存储器,存储器,用于保存缺页异常的处理装置必要的程序指令和数据。该芯片***,可以由芯片构成,也可以包含芯片和其他分立器件。
本申请第十二方面提供了一种芯片***,该芯片***包括至少一个处理器,至少一个处理器用于支持代码识别的装置实现上述第二方面或第二方面任意一种可能的实现方式中所涉及的功能。在一种可能的设计中,芯片***还可以包括存储器,存储器,用于保存缺页异常的处理装置必要的程序指令和数据。该芯片***,可以由芯片构成,也可以包含芯片和其他分立器件。
附图说明
图1是本申请实施例提供的一模型训练以及应用的场景示意图;
图2是本申请实施例提供的模型训练的方法的一实施例示意图;
图3是本申请实施例提供的一收集样本的示例示意图;
图4是本申请实施例提供的模型训练的方法的另一实施例示意图;
图5是本申请实施例提供的一抽象语法树的结构示意图;
图6是本申请实施例提供的抽象语法树的一示例示意图;
图7是本申请实施例提供的模型训练的方法的一实施例示意图;
图8是本申请实施例提供的关键性模型的一结构示意图;
图9是本申请实施例提供的代码审查流程的一示意图;
图10是本申请实施例提供的代码识别的方法的一实施例示意图;
图11是本申请实施例提供的代码识别的方法的另一实施例示意图;
图12是本申请实施例提供的另一模型训练以及应用的场景示意图;
图13是本申请实施例提供的模型训练的装置的一结构示意图;
图14是本申请实施例提供的代码识别的装置的一结构示意图;
图15是本申请实施例提供的计算机设备的一结构示意图。
具体实施方式
下面结合附图,对本申请的实施例进行描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。本领域普通技术人员可知,随着技术发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本申请实施例提供一种模型训练的方法,用于得到可以识别待审查的项目代码中方法代码关键性的模型,从而可以通过该模型确定出项目代码中方法代码的关键性或者多个方法代码的关键性排序,提高代码审查效率。本申请还提供了相应的装置、计算机设备、计算机可读存储介质和计算机程序产品等。以下分别进行详细说明。
人工智能是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用***。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。
人工智能技术是一门综合学科,涉及领域广泛,既有硬件层面的技术也有软件层面的技术。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互***、机电一体化等技术。人工智能软件技术主要包括计算机视觉技术、语音处理技术、自然语言处理技术以及机器学习/深度学习等几大方向。
智能制造、智能交通、智能家居、智能医疗、智能安防、自动驾驶,智慧城市,智能终端等。
模型通常是在模型所有者的计算机设备或平台(如:服务器、虚拟机(virtualmachine,VM)或容器(container))中进行训练得到的,训练好的模型会以模型文件的形式存储。在模型使用者的设备(如:终端设备、服务器或边缘设备、VM或容器等)需要使用该模型时,模型使用者的设备主动加载该模型的模型文件或者模型所有者的设备主动发送给模型使用者的设备安装该模型的模型文件,进而使该模型在模型使用者的设备上应用,执行相应的功能。
服务器指的是物理机。
终端设备(也可以称为用户设备(user equipment,UE))是一种具有无线收发功能的设备,可以部署在陆地上,包括室内或室外、手持或车载;也可以部署在水面上(如轮船等);还可以部署在空中(例如飞机、气球和卫星上等)。所述终端可以是手机(mobilephone)、平板电脑(pad)、带无线收发功能的电脑、虚拟现实(virtual reality,VR)终端、增强现实(augmented reality,AR)终端、工业控制(industrial control)中的无线终端、无人驾驶(self driving)中的无线终端、远程医疗(remote medical)中的无线终端、智能电网(smart grid)中的无线终端、运输安全(transportation safety)中的无线终端、智慧城市(smart city)中的无线终端、智慧家庭(smart home)中的无线终端等。
VM或容器都可以是在物理机的硬件资源上采用虚拟化的方式划分出来的虚拟化的设备。
本申请实施例中,可以将为代码识别设计好的初始模型放在服务器上训练,以得到能进行代码识别的目标模型,目标模型安装到终端设备上后,即可进行代码识别,该过程可以参阅图1的示意图进行立即。
如图1所示模型训练和应用的一***架构示意图。计算机设备用于模型训练,该计算机设备上安装有为代码识别设计好的初始模型,也就是第一关键性模型。该计算机设备接收到训练样本后对第一关键性模型进行训练,以得到第二关键性模型。该第二关键性模型是可以用于代码识别的模型,将该第二关键性模型安装代码审查人员的终端设备上,该终端设备在接收到待审查的项目代码后,可以使用该第二关键性模型对项目代码中的方法代码进行关键性排序,可以辅助代码审查人员快速进行代码审查。
本申请的模型训练的方案和代码识别的方案可以是在集成开发环境(integrateddevelopment environment,IDE)下完成的,IDE是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
由以上的介绍可知,本申请实施例提供的方案包括模型训练和模型应用两个过程,下面分别结合附图进行介绍。
一、模型训练。
如图2所示,本申请实施例提供的模型训练的方法的一实施例包括:
101.计算机设备获取多个训练样本。
其中,每个训练样本为一个发生过变更的项目代码的组合调用图,组合调用图是通过项目代码变更前的代码调用图和变更后的代码调用图组合得到的,组合调用图通过多个节点表示项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示多个方法代码中两个方法代码之间的调用关系,组合调用图的每个节点对应的方法代码还对应有第一关键性信息。
本申请实施例中,项目代码(project code)指的是针对一个项目编写的代码,方法代码(method code)是为完成项目的功能而编写的各种功能的代码。方法代码中可以分为关键方法代码和非关键方法代码,关键方法代码指的是为完成与计算相关的关键逻辑而编写的代码,非关键方法代码指的是为辅助或配合关键方法而编写的代码,也可以说方法代码的关键程度不同。一个项目代码会包含多个方法代码。
本申请实施例中,发生过变更的项目代码指的是被修改过的项目代码,一旦项目代码被修改过,就需要重新做代码审查(Code Review)。代码审查是指在软件开发过程中,通过对源代码进行***性检查的过程,通常的目的是查找各种缺陷,包括代码缺陷、功能实现问题、编码合理性、性能优化等,以保证软件总体质量。
本申请实施例中,代码调用图指的是采用Doxygen工具对项目代码进行方法调用分析得到调用图。代码调用图中包括节点和边,每个节点表示一个方法代码,边表示有调度关系的两个方法代码之间的调用关系。项目发生变更通常指的是部分代码被修改,会有一部分没有被修改的代码。这样,就可以基于没有被修改的代码将变更前的代码调用图和变更后的代码调用图进行组合,以得到组合调用图。组合调用图中会包括变更前的所有方法代码对应的节点及边,以及变更后被修改部分的方法代码对应的节点及边。
本申请实施例中,第一关键性信息可以是方法代码的关键度的值,该值可以采用归一化的形式表示,如:1、0.9、0.8或者其他数值,对此本申请中不做限定。组合调用图中每个节点对应的方法代码的第一关键性信息可以是有经验的程序人员标记好的。
本申请实施例中,在模型训练过程中,可以把每个训练样本作为一个batch进行训练。
102.计算机设备针对每个训练样本,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
第一集合中包括多个路径-上下文,其中,每个路径-上下文表示方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息。
本申请实施例中,每个方法代码都可以转换为抽象语法树,抽象语法树包括父节点和叶子节点,上一层的叶子节点可以作为下一层叶子节点的父节点。任意两个叶子节点之间通过其父节点都可以形成一条路径,这样,当有n个叶子节点时,就会有n*(n-1)/2条路径,每两个叶子节点及其之间的路径都可以称为一个路径-上下文。因此,每个方法代码就会都可以转换为一个路径-上下文的第一集合。该第一集合中包含该方法代码转换的抽象语法树中任意两个叶子节点及其中间路径组成的路径-上下文。
可选地,该步骤102也可以使用第一关键性模型,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。这样相当于将更多的功能集成在了模型中,提升了模型的能力。
103.计算机设备根据多个方法代码中每个方法代码对应的第一集合以及每个方法代码对应的第一关键性信息,对第一关键性模型进行训练,以得到第二关键性模型。
其中:第一关键性模型包括第一层、第二层和第三层,其中,第一层用于将第一集合转换为第一向量表示,第二层用于结合多个方法代码之间的调用关系对每个方法代码的第一向量表示进行处理以得到每个方法代码的第二向量表示,第三层用于根据每个方法代码的第二向量表示确定每个方法代码的第二关键性信息,并根据组合调用图中每个节点的第一关键性信息监督第二关键性信息,以优化第一关键性模型中的参数;第二关键性模型用于输出待审查的目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。
本申请实施例中,第一关键性模型可以对第一集合进行向量化处理,这样就可以得到单个方法代码的第一向量表示,然后再结合多个方法代码之间的调用关系,对第一向量表示进行处理,就可以得到用于最终表示每个方法代码的第二向量表示,进而可以根据该第二向量表示确定每个方法代码的第二关键性信息,该第二关键性信息的形式可以参阅第一关键性信息进行理解。
本申请实施例中,优化第一关键性模型中的参数的过程可以是采用梯度下降算法,进行参数优化,最终通过多个训练样本的训练得到可以用于代码识别的第二关键性模型。
本申请实施例中,在模型训练的过程中,针对每个项目代码中的方法代码,做了路径-上下文的转换,然后针对该方法代码的路径-上下文的第一集合做了向量化处理,这样细化了训练样本的粒度,训练出来的模型在代码识别时的准确度也会更高,另外,在确定方法代码的向量时还结合了不同方法代码之间的调用关系,考虑了不同方法代码之间的关联性,更进一步提高了模型训练的精度,从而也进一步提高了模型在代码识别时的准确度,这样在代码审查环节可以通过该模型确定出代码的关键性,提高了代码审查效率。
由以上内容可知,要训练模型需要先收集训练样本,也就是发生过变更的项目代码的组合调用图,并在组合调用图上为方法代码对应的节点标注上第一关键性信息,然后再对组合调用图中所对应的多个方法代码进行处理,得到每个方法代码的第一集合,进而使用该第一集合得到用于模型训练的向量表示,完成模型训练过程,下面对这几个阶段分别进行介绍。
1.收集训练样本,并标注第一关键性信息。
该过程可以参阅图3进行理解,如图3所示,该过程可以包括:
201.获取多个发生过变更的历史项目代码。
该历史项目代码可以是来源网站上的Java项目代码。
202.针对每个历史项目代码,获取变更前的文件内容和变更后的文件内容。
203.针对变更前的文件内容进行调用分析,得到第一调用图。
第一调用图中包括变更前的节点和边,节点表示方法代码,边表示相关联的两个方法代码之间的调用关系。
本申请实施例中,节点通常包括节点名称和节点属性,节点名称通常用于指示用于某个方法代码,节点属性表示方法代码的内容,关于节点名称和节点属性本申请中不做区分强调,节点名称和节点属性中的任意一个发生变更则认为方法代码发生变更,节点名称和节点属性都没有变更则认为该方法代码未发生变更。
204.针对变更后的文件内容进行调用分析,得到第二调用图。
第二调用图中包括变更后的节点和边,节点表示方法代码,边表示相关联的两个方法代码之间的调用关系。
205.基于第一调用图和第二调用图中未发生变更的内容,将第一调用图和第二调用图进行合并,以得到组合调用图。
未发生变更的内容指的是方法代码的内容未被修改,第一调用图和第二调用图中对应的节点的节点名称和节点属性都没发生变更。
从图3中可以看出,第一调用图和第二调用图中有一部分没有发生变更,有一部分发生了变更,可以基于没有发生变更的部分,将第一调用图和第二调用图进行组合,从而得到图3中所示的组合调用图。
通过上述步骤得到组合调用图后,有经验的程序员可以结合各方法代码的功能为各个节点标注第一关键性信息。
因为需要收集多个训练样本,该过程可以理解为是一个从空集开始不断添加的过程,下面通过一段逻辑来描述该过程。
输入:历史项目代码的集合T;
输出:组合调用图的集合C;
Figure BDA0003378137150000121
(/>
Figure BDA0003378137150000122
表示初始状态时该集合C是空集);
for t in T do(表示针对历史项目代码的集合T中的一个历史项目代码t);
使用git工具获取历史项目代码t在不同时间的提交集合S;
for s in S do(表示针对提交集合S中的一个提交代码s,s是在某个时间提交的历史项目代码);
如果提交代码s变更的内容很小,可以略过;
如果提交代码s变更的内容达到处理条件,则从提交代码s中提取变更前的文件F1和变更后的文件F2;
r1=Doxygen(F1);
r2=Doxygen(F2);
c=Merge(r1,r2);
add c into C;
return C。
上述逻辑中,Doxygen函数表示使用Doxygen工具进行调用图的分析,Merge函数表示以不变的函数为共有节点进行变更前和变更后的两个版本的调用图的合并,c最终表示为有向图,图中每个节点对应变更文件中的方法代码,图中的边表示方法代码间的调用关系,每个节点拥有属性,属性为方法代码的内容。
在获取了代码提交中的方法及其调用关系后需要进行数据的整理,这个过程通过有经验的程序员为方法代表标记第一关键性信息。
2.将方法代码进行处理得到方法代码的路径-上下文的第一集合。
本申请实施例中,如图4所示,通过方法代码得到路径-上下文的第一集合的过程包括:
301.将多个方法代码中的每个方法代码转换为一个抽象语法树。
抽象语法树包括多个叶子节点,多个叶子节点中的任意两个叶子节点及与两个叶子节点的父节点之间形成一条路径。
如图5所示,可以通过解析方法代码,将方法代码转换为抽象语法树,该抽象语法树中第一层级的节点为根节点,其他的节点都是叶子节点,上一层级的节点是下一层级的叶子节点的父节点。实际上,抽象语法树中也可能包含非叶子节点,两个叶子节点通过父节点形成的路径中可能包括一个或多个非叶子节点。
这样,如果抽象语法树中有n个叶子节点,两两组合可以得到n*(n-1)/2种组合,就可以得到n*(n-1)/2个路径-上下文。
302.将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文。
第一集合包括抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
该步骤302可以包括:将任意两个叶子节点以及任意两个叶子节点之间的路径中两个叶子节点按照命名规则进行分词处理,以得到包含任意两个叶子节点以及任意两个叶子节点之间路径的路径-上下文。
该确定路径-上下文的过程可以结合代码“numberOfPath=7”的示例进行理解。numberOfPath=7是一条赋值语句,包括名称(NameExpr)、分配关系(AssignExpr)和分配的数值(IntergerLiteralExpr)这三部分,名称是numberOfPath,为该名称分配的数值是7,因此该条赋值语句解析后就可以得到如图6所示的抽象语法树。该抽象语法树中,numberOfPath和7为叶子节点,NameExpr、AssignExpr、IntergerLiteralExpr为非叶节点。这样,numberOfPath和7这两个叶子节点以及中间的路径形成的路径-上下文可以表示为:
“〈numberOfPath,(NameExpr↑AssignExpr↓IntergerLiteralExpr),7〉”,其中↑、↓表示路径的方向。
但这种表示无法获取到叶子节点中可能包含的语义信息,比如叶子节点numberOfPath实际上是“number of path”。本申请基于此,对叶子节点按照命名规则进行分词,最终将其“路径-上下文”表示为:
“〈(number of path),(NameExpr↑AssignExpr↓IntergerLiteralExpr),(7)〉”。
本申请实施例中,通过抽象语法树来转换路径-上下文,可以提高路径-上下文转换的速度。另外,对叶子节点按照命名规则进行分词处理可以将代码中的功能信息和语义信息代入到路径-上下文的向量表示中用于后续的模型训练,有利于提高模型的准确度。
3.将第一集合进行向量化处理,以得到用于模型训练的向量表示进行模型训练。
本申请实施例中对第一结合进行向量化以及模型训练的过程可以参阅图7进行理解,如图7所示,该过程包括:
401.将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示。
本申请实施例中,第三向量表示指的是针对每个路径-上下文的向量表示。
本申请实施例中,一个路径-上下文中包括两个叶子节点以及两个叶子节点之间的路径,叶子节点可以理解为是一个子词串,包括多个子词,每个子词的向量表示都可以从子词的词汇表中查出,可以通过对子词串中每个子词的向量表示先求和再求平均的方式确定出叶子节点的向量表示,两个叶子节点之间的路径的向量表示可以从路径词汇表中查找到,这样,对两个叶子节点的向量表示以及中间路径的向量表示进行拼接,就可以得到路径-上下文的第三向量表示。
向量化的过程中,可以将子词和路径都随机初始化为一个d维的向量表示。
上述所描述的子词的词汇表X可以表示为:value_vocab∈|X|×d,路径词汇表可以表示为:path_vocab∈|P|×d
本申请实施例中,以叶子节点xi包括k个子词(xi,1,xi,2,…,xi,k)为例,其中,第j个子词xi,j的向量表示可以表示为:
Figure BDA0003378137150000141
这样,叶子节点xi采用k个子词的均值作为其向量表示就可以表示为:
Figure BDA0003378137150000142
路径pi的向量表示可以直接从路径词汇表中查找,即:embedding(pi)=path_vocabpi∈Rd
这样,将两个叶子节点的向量表示以及路径的向量表示进行拼接,就可以得到一个路径-上下文的第三向量表示,第i个路径上下文的第三向量表示可以表示为:ci∈R3d
若第i个路径-上下文是第s个叶子节点和第t个叶子节点形成的路径-上下文,两个叶子节点之间的路径为路径pi,则该路径ci可以表示为:
ci=embedding(<xs,pj,xt>)=[embedding(xs);embedding(pj);embedding(xt)]。
402.根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示。
该步骤402可以包括:对第三向量表示进行降维处理,以得到降维后的向量表示;将第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到第一集合对应的第一向量表示,注意力大小是通过降维后的向量表示以及注意力向量确定的。
结合上述401中的推导过程,ci∈R3d可见,该ci的维度有3d维,维度较高,可以使用全连接层,将ci进行降维处理,将ci降维成
Figure BDA0003378137150000143
其中,W∈Rd×3d是可训练参数。
这样,就可以通过降维后的向量表示
Figure BDA0003378137150000144
以及注意力大小ai来确定包含m个路径-上下文的第一结合的第一向量表示v。第一向量表示v可以表示为:/>
Figure BDA0003378137150000145
其中,
Figure BDA0003378137150000151
其中,/>
Figure BDA0003378137150000152
表示/>
Figure BDA0003378137150000153
的转置,/>
Figure BDA0003378137150000154
表示注意力向量,该u∈Rd。
403.根据每个方法代码的第一向量表示,以及组合调用图中多个方法代码之间的调用关系,确定每个方法代码的第二向量表示。
上述
Figure BDA0003378137150000155
可以单个方法代码的向量表示,但通常方法代码之间是有调用关系的,所以,只使用单个方法代码的向量表示的会影响模型训练的精准度,本申请实施例中,结合多个方法代码之间的调用关系,进一步的确定出了方法代码的第二向量表示。
本申请实施例中,在组合调用图中通过边表示了方法代码之间的调用关系,如果组合调用图中有N个节点,那么该组合调用图A是个有向图,该有向图用邻接矩阵的形式可以表示为A∈RN×N,本申请实施例中,可以通过有向图A得到一个无向图
Figure BDA0003378137150000156
该/>
Figure BDA0003378137150000157
可以表示为:
Figure BDA0003378137150000158
其中,AT表示A的转置,IN表示自环,是对角线矩阵。然后对/>
Figure BDA0003378137150000159
进行标准化处理得到标准化后的矩阵/>
Figure BDA00033781371500001510
其中,/>
Figure BDA00033781371500001511
每个方法代码的第一向量表示为v,每个方法代码的属性矩阵用V表示为V∈RN×d,则第二向量表示Z可以表示为:
Figure BDA00033781371500001512
其中,W(0),W(1)∈Rd×d为模型的可训练参数。
404.根据每个方法代码的第二向量表示,采用自注意力机制确定每个方法代码的第二关键性信息,并根据组合调用图中每个节点的第一关键性信息监督第二关键性信息,以优化第一关键性模型中的参数。
本申请实施例中,可以使用第二向量表示Z计算该方法代码的第二关键性信息,该第计算过程可以采用如下关系式进行理解:
Figure BDA00033781371500001513
其中,/>
Figure BDA00033781371500001514
表示Zi的转置,b表示一个可训练参数。
上述计算出β后,可以使用程序员标注的第一关键性信息l对β进行监督,l∈RN,采用梯度下降法优化模型中的各种参数。
在上述模型训练的过程中,如果一个训练样本中,一个方法有m个“路径-上下文”,可以表示为大小为m个d维向量,对m个d维向量计算注意力,融合为一个d维向量,该d维向量可以作为方法的向量表示。每个训练样本包含k个方法,方法之间的调用关系组成一个k*k大小的邻接矩阵,k个方法的向量表示组成一个k*d的属性矩阵,使用图卷积神经网络进行建模,可以得到k*d的结果矩阵作为每个方法最终的嵌入表示,在此基础采用类似注意力的机制进行关键性信息的计算,可以得到每个方法相对的关键排序。关键性最大的一个或几个方法代码可以理解为是关键方法代码。在训练过程,针对一个训练样本,若方法代码的个数达不到k个就进行填充,单个方法代码中的“路径-上下文”没有m个也进行填充。最终模型计算出的关键性信息用数据收集阶段得到的关键方法标注进行监督,对两者计算交叉熵,然后使用梯度下降算法优化模型中的参数。
以上介绍了模型训练的过程,下面结合上文介绍第一关键性模型或第二关键性模型(简称:关键性模型)的结构,如图8所示,本申请实施例提供的关键性模型的结构可以包括第一层、第二层和第三层。
第一层包括路径-上下文的向量化层、全连接层和自注意力层。路径-上下文的向量化层可以执行上述401,全连接层和自注意力层可以执行上述402部分介绍的相应内容。
第二次包括两层图卷积层,当然,本申请实施例中,不限于两层图卷积层,也可以是一层图卷积层或者其他更多层图卷积层。两层图卷积层可以用于执行上述步骤403部分介绍的相应内容。
第三层包括自注意力层和关键性确定层。自注意力层和关键性确定层可以用于执行上述步骤404部分介绍的相应内容。
以上介绍了模型训练的过程,下面结合附图介绍模型应用的过程。
二、模型应用。
本申请实施例中,程序开发人员开发的项目代码或者修改后的项目代码后,需要提交到配置库,然后发起代码审查请求,代码审查人员会对配置库中的项目代码进行审查,给出审查意见,再由程序开发人员来修改,最后,代码再确认修改结果,确认修改结果没有问题后,该修改后的项目代码才能被使用。
结合本申请实施例中前述训练好的目标关键性模型,本申请实施例中的上述过程可以参阅图9进行理解,如图9所示,该过程包括:
501.程序开发人员修改项目代码后,将修改后的项目代码提交到配置库。
502.对项目代码进行处理,并使用上述模型训练方法所训练得到的目标关键性模型确定出项目代码中方法代码的关键性信息或关键性排序。
503.审查人员根据方法代码的关键性信息或关键性排序提出审查意见。
504.程序开发人员根据审查人员的审查意见修改项目代码。
505.审查人员确认修改结果。
本申请实施例中,在审查人员审查项目代码前,先对项目代码进行智能分析,给出项目代码中方法代码的关键性信息或关键性排序,提升了审查人员理解项目代码的效率,从而提高了审查代码的效率。
上述审查人员审查项目代码的过程可以是在审查人员的终端设备上进行的,其中,步骤502的执行可以是在终端设备上执行的,也可以是终端设备结合服务器来完成的,下面以终端设备结合服务器的场景为例,介绍相应设备所执行的内容。
如图10所示,在终端设备与服务器结合的场景中,审查人员的终端设备上安装有客户端,该客户端包括代码审查用户界面601和代码审查插件602,代码审查用户界面601中包括代码审查界面功能入口6011,代码审查插件602中包括代码审查服务调用模块6021。服务器上配置有代码识别服务模块701,该代码识别服务模块701包括代码处理模块7011、第一向量化模块7012、第二向量化模块7013和关键性排序模块7014。
审查人员在对项目代码进行审查前,可以先进入代码审查用户界面601,点击代码审查界面功能入口6011,该代码审查界面功能入口6011会调用代码审查插件602中的代码审查服务调用模块6021,该代码审查服务调用模块6021会调用服务器中的代码识别服务模块701,然后,代码处理模块7011会对审查人员要审查的项目代码进行处理,得到该项目代码的路径-上下文的第一集合,第一向量化模块7012会对第一结合进行处理,以得到第一向量表示,第二向量化模块7013结合第一向量表示和不同方法代码之间的调用关系,确定第二向量表示,关键性排序模块7014会根据第二向量表示确定方法代码的关键性信息,以及对多个方法代码的关键性信息进行排序,向终端设备返回关键性排序的列表。
图10所示的是终端设备与服务器结合进行代码识别的场景,如果由终端设备自行完成上述功能,则将代码识别服务模块701配置在终端设备上即可,具体执行流程与上述过程基本相同,此处不再展开赘述。
以上结合图10简单描述了代码识别的过程,下面结合图11介绍本申请实施例提供的代码识别的方法。如图11所示,本申请实施例提供的代码识别的方法的一实施例包括:
801.计算机设备接收待审查的目标项目代码。
目标项目代码发生过变更。
802.计算机设备根据目标项目代码确定对应的组合调用图。
组合调用图是通过目标项目代码变更前的代码调用图和变更后的代码调用图组合得到的,组合调用图通过多个节点表示目标项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示多个方法代码中两个方法代码之间的调用关系。
803.计算机设备将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
第一集合中包括多个路径-上下文,其中,每个路径-上下文表示方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息。
该步骤803也可以是使用目标关键性模型,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
804.计算机设备根据多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。
目标关键性模型包括第一层、第二层和第三层,其中,第一层用于将第一集合转换为第一向量表示,第二层用于结合多个方法代码之间的调用关系对每个方法代码的第一向量表示进行处理以得到每个方法代码的第二向量表示,第三层用于根据每个方法代码的第二向量表示确定每个方法代码的关键性信息或者多个方法代码的关键性排序信息。
本申请实施例中的目标关键性模型可以是上述模型训练方法部分所训练出来的第二关键性模型。
在模型应用中所涉及到的与模型训练相同或相近的特征可以参阅前述模型训练部分的介绍进行理解,此处不再重复赘述。
本申请实施例中,针对待审查的目标项目代码,先使用目标关键性模型确定出目标项目代码中各方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序。这样可以辅助代码审查人员审查代码,提高了代码审查的效率。
可选地,本申请实施例中,上述步骤804包括:根据多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息,包括:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示;根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示;根据每个方法代码的第一向量表示,以及组合调用图中多个方法代码之间的调用关系,确定每个方法代码的第二向量表示;根据每个方法代码的第二向量表示,采用自注意力机制确定每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。
本申请实施例中,第三向量表示指的是针对每个路径-上下文的向量表示。第一向量表示可以是对第三向量表示求和得到的,也可以是对每个第三向量表示做加权后再求和得到的,还可以是对第三向量表示做降维处理,针对降维后的第三向量表示做加权再求和得到的,本申请中不限定从第三向量表示到第一向量表示的具体的得到方式。由该种可能的实现方式可知,通过三层的向量化处理,提高了所确定的每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息的准确度。
可选地,上述步骤:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示,包括:将每个路径-上下文的两个叶子节点中每个叶子节点分别做分词处理,将每个叶子节点分词处理后得到的多个子词的平均向量表示作为每个叶子节点的向量表示;将两个叶子节点各自的向量表示以及两个叶子节点之间的路径信息的向量表示进行拼接,以得到每个路径-上下文的第三向量表示。
可选地,上述步骤:根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示,包括:对第三向量表示进行降维处理,以得到降维后的向量表示;将第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到第一集合对应的第一向量表示,注意力大小是通过降维后的向量表示以及注意力向量确定的。
可选地,上述步骤:将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:将多个方法代码中的每个方法代码转换为一个抽象语法树,抽象语法树包括多个叶子节点,多个叶子节点中的任意两个叶子节点及与两个叶子节点距离最近的根节点之间形成一条路径;将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,第一集合包括抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
可选地,上述步骤:将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,包括:将任意两个叶子节点以及任意两个叶子节点之间的路径中两个叶子节点按照命名规则进行分词处理,以得到包含任意两个叶子节点以及任意两个叶子节点之间路径的路径-上下文。
可选地,上述步骤:根据目标项目代码确定对应的组合调用图,包括:针对目标项目代码,获取变更前的文件内容和变更后的文件内容;针对变更前的文件内容进行调用分析,得到第一调用图,针对变更后的文件内容进行调用分析,得到第二调用图;基于第一调用图和第二调用图中未发生变更的内容,将第一调用图和第二调用图进行合并,以得到组合调用图。
本申请实施例中,关于将方法代码转换为路径-上下文的第一集合、第三向量表示、第一向量表示和第二向量表示,以及组合调用图的得到过程都可以参阅前述模型训练方法部分的相应内容进行理解,此处不在重复赘述。
以上,模型训练与模型应用结合的过程还可以参阅图12进行理解。如图12所示,获取多个历史项目代码,对每个历史项目代码进行处理,得到每个历史项目代码的组合调用图,对组合调用图中每个节点所对应的方法代码进行处理,以得到每个方法代码的路径-上下文的第一集合,使用第一集合对模型进行训练,以得到可以应用的目标关键性模型。针对待审查的目标项目代码,先对该目标项目代码进行处理,以得到该目代码进行处理中每个方法代码的第一集合,然后将该第一集合输入到目标关键性模型,目标关键性模型对第一集合采用前述的向量化处理方式得到第一向量表示、第二向量表示,再得到每个方法代码的关键性信息,可以基于每个方法代码的关键性信息进行排序,输出多个方法代码的关键性信息的列表,从而辅助审查人员进行快速的代码审查。
以上介绍了模型训练的方法和代码识别的方法,下面结合附图介绍本申请实施例提供的模型训练的装置和代码识别的装置。
如图13所示,本申请实施例提供的模型训练的装置90的一实施例包括:
获取单元901,用于获取多个训练样本,其中,每个训练样本为一个发生过变更的项目代码的组合调用图,组合调用图是通过项目代码变更前的代码调用图和变更后的代码调用图组合得到的,组合调用图通过多个节点表示项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示多个方法代码中两个方法代码之间的调用关系,组合调用图的每个节点对应的方法代码还对应有第一关键性信息。该获取单元901可以用于执行上述方法实施例中的步骤101。
第一处理单元902,用于针对获取单元901获取的每个训练样本,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合,第一集合中包括多个路径-上下文,其中,每个路径-上下文表示方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息。该第一处理单元902可以用于执行上述方法实施例中的步骤102。
第二处理单元903,用于根据第一处理单元902得到的多个方法代码中每个方法代码对应的第一集合以及每个方法代码对应的第一关键性信息,对第一关键性模型进行训练,以得到第二关键性模型;其中:第一关键性模型包括第一层、第二层和第三层,其中,第一层用于将第一集合转换为第一向量表示,第二层用于结合多个方法代码之间的调用关系对每个方法代码的第一向量表示进行处理以得到每个方法代码的第二向量表示,第三层用于根据每个方法代码的第二向量表示确定每个方法代码的第二关键性信息,并根据组合调用图中每个节点的第一关键性信息监督第二关键性信息,以优化第一关键性模型中的参数;第二关键性模型用于输出待审查的目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。该第二处理单元903可以用于执行上述方法实施例中的步骤103。
本申请实施例中,在模型训练的过程中,针对每个项目代码中的方法代码,做了路径-上下文的转换,然后针对该方法代码的路径-上下文的第一集合做了向量化处理,这样细化了训练样本的粒度,训练出来的模型在代码识别时的准确度也会更高,另外,在确定方法代码的向量时还结合了不同方法代码之间的调用关系,考虑了不同方法代码之间的关联性,更进一步提高了模型训练的精度,从而也进一步提高了模型在代码识别时的准确度,这样在代码审查环节可以通过该模型确定出代码的关键性,提高了代码审查效率。
可选地,第一处理单元902,用于针对每个训练样本,使用第一关键性模型,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
可选地,第二处理单元903用于:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示;根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示;根据每个方法代码的第一向量表示,以及组合调用图中多个方法代码之间的调用关系,确定每个方法代码的第二向量表示;根据每个方法代码的第二向量表示,采用自注意力机制确定每个方法代码的第二关键性信息,并根据组合调用图中每个节点的第一关键性信息监督第二关键性信息,以优化第一关键性模型中的参数。
可选地,第二处理单元902用于:将每个路径-上下文的两个叶子节点中每个叶子节点分别做分词处理,将每个叶子节点分词处理后得到的多个子词的平均向量表示作为每个叶子节点的向量表示;将两个叶子节点各自的向量表示以及两个叶子节点之间的路径信息的向量表示进行拼接,以得到每个路径-上下文的第三向量表示。
可选地,第二处理单元903用于:对第三向量表示进行降维处理,以得到降维后的向量表示;将第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到第一集合对应的第一向量表示,注意力大小是通过降维后的向量表示以及注意力向量确定的。
可选地,第一处理单元902用于:将多个方法代码中的每个方法代码转换为一个抽象语法树,抽象语法树包括多个叶子节点,多个叶子节点中的任意两个叶子节点及与两个叶子节点的父节点之间形成一条路径;将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,第一集合包括抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
可选地,第一处理单元902用于:将任意两个叶子节点以及任意两个叶子节点之间的路径中两个叶子节点按照命名规则进行分词处理,以得到包含任意两个叶子节点以及任意两个叶子节点之间路径的路径-上下文。
可选地,获取单元还用于:获取多个发生过变更的历史项目代码;针对每个历史项目代码,获取变更前的文件内容和变更后的文件内容;针对变更前的文件内容进行调用分析,得到第一调用图,针对变更后的文件内容进行调用分析,得到第二调用图;基于第一调用图和第二调用图中未发生变更的内容,将第一调用图和第二调用图进行合并,以得到组合调用图。
本申请实施例提供的模型训练的装置90可以参阅前述模型训练的方法部分的实施例进行理解,此处不再重复赘述。
如图14所示,本申请实施例提供的代码识别的装置100的一实施例包括:
接收单元1001,用于接收待审查的目标项目代码,目标项目代码发生过变更。该接收单元1001可以执行上述方法实施例中的步骤801。
第一处理单元1002,用于根据接收单元1001接收的目标项目代码确定对应的组合调用图,组合调用图是通过目标项目代码变更前的代码调用图和变更后的代码调用图组合得到的,组合调用图通过多个节点表示目标项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示多个方法代码中两个方法代码之间的调用关系。该第一处理单元1002可以执行上述方法实施例中的步骤802。
第二处理单元1003,用于将第一处理单元1002得到的多个方法代码中的每个方法代码转换为路径-上下文的第一集合,第一集合中包括多个路径-上下文,其中,每个路径-上下文表示方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息。该第二处理单元1003可以执行上述方法实施例中的步骤803。
第三处理单元1004,用于根据第二处理单元1003得到的多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定目标项目代码中每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息,目标关键性模型包括第一层、第二层和第三层,其中,第一层用于将第一集合转换为第一向量表示,第二层用于结合多个方法代码之间的调用关系对每个方法代码的第一向量表示进行处理以得到每个方法代码的第二向量表示,第三层用于根据每个方法代码的第二向量表示确定每个方法代码的关键性信息或者多个方法代码的关键性排序信息。该第三处理单元1004可以执行上述方法实施例中的步骤804。
本申请实施例中,针对待审查的目标项目代码,先使用目标关键性模型确定出目标项目代码中各方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序。这样可以辅助代码审查人员审查代码,提高了代码审查的效率。
可选地,第二处理单元1003,用于使用目标关键性模型,将多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
可选地,第三处理单元1004用于:将第一集合中每个路径-上下文进行向量化处理,以得到每个路径-上下文的第三向量表示;根据每个路径-上下文的第三向量表示,确定第一集合对应的第一向量表示;根据每个方法代码的第一向量表示,以及组合调用图中多个方法代码之间的调用关系,确定每个方法代码的第二向量表示;根据每个方法代码的第二向量表示,采用自注意力机制确定每个方法代码的关键性信息或者目标项目代码中多个方法代码的关键性排序信息。
可选地,第三处理单元1004用于:将每个路径-上下文的两个叶子节点中每个叶子节点分别做分词处理,将每个叶子节点分词处理后得到的多个子词的平均向量表示作为每个叶子节点的向量表示;将两个叶子节点各自的向量表示以及两个叶子节点之间的路径信息的向量表示进行拼接,以得到每个路径-上下文的第三向量表示。
可选地,第三处理单元1004用于:对第三向量表示进行降维处理,以得到降维后的向量表示;将第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到第一集合对应的第一向量表示,注意力大小是通过降维后的向量表示以及注意力向量确定的。
可选地,第二处理单元1003用于:将多个方法代码中的每个方法代码转换为一个抽象语法树,抽象语法树包括多个叶子节点,多个叶子节点中的任意两个叶子节点及与两个叶子节点距离最近的根节点之间形成一条路径;将任意两个叶子节点以及任意两个叶子节点之间的路径确定为一个路径-上下文,第一集合包括抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
可选地,第二处理单元1003用于:将任意两个叶子节点以及任意两个叶子节点之间的路径中两个叶子节点按照命名规则进行分词处理,以得到包含任意两个叶子节点以及任意两个叶子节点之间路径的路径-上下文。
可选地,第一处理单元1002用于:针对目标项目代码,获取变更前的文件内容和变更后的文件内容;针对变更前的文件内容进行调用分析,得到第一调用图,针对变更后的文件内容进行调用分析,得到第二调用图;基于第一调用图和第二调用图中未发生变更的内容,将第一调用图和第二调用图进行合并,以得到组合调用图。
本申请实施例提供的代码识别的装置100可以参阅前述代码识别的方法部分的实施例进行理解,此处不再重复赘述。
图15所示,为本申请的实施例提供的计算机设备110的一种可能的逻辑结构示意图。该计算机设备110可以是模型训练的装置,也可以是代码识别的设备。该计算机设备110包括:处理器1101、通信接口1102、存储器1103以及总线1104。处理器1101、通信接口1102以及存储器1103通过总线1104相互连接。在本申请的实施例中,处理器1101用于对计算机设备110的动作进行控制管理,例如,处理器1101用于执行图3至图12的方法实施例中模型训练或代码识别过程,通信接口1102用于支持计算机设备110进行通信。存储器1103,用于存储计算机设备110的程序代码和数据。
其中,处理器1101可以是中央处理器单元,通用处理器,数字信号处理器,专用集成电路,现场可编程门阵列或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器1101也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,数字信号处理器和微处理器的组合等等。总线1104可以是外设部件互连标准(PeripheralComponent Interconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图15中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本申请的另一实施例中,还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当设备的处理器执行该计算机执行指令时,设备执行上述图3至图8中模型训练的方法,或者执行上述图9-12中代码识别的方法。
在本申请的另一实施例中,还提供一种计算机程序产品,该计算机程序产品包括计算机执行指令,该计算机执行指令存储在计算机可读存储介质中;当设备的处理器执行该计算机执行指令时,设备执行上述图3至图8中模型训练的方法,或者执行上述图9-12中代码识别的方法。
在本申请的另一实施例中,还提供一种芯片***,该芯片***包括处理器,该处理器用于实现上述图3至图8中模型训练的方法,或者执行上述图9-12中代码识别的方法。在一种可能的设计中,芯片***还可以包括存储器,存储器,用于保存进程间通信的装置必要的程序指令和数据。该芯片***,可以由芯片构成,也可以包含芯片和其他分立器件。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请实施例的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请实施例所提供的几个实施例中,应该理解到,所揭露的***、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请实施例各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请实施例各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

Claims (40)

1.一种模型训练的方法,其特征在于,包括:
获取多个训练样本,其中,每个训练样本为一个发生过变更的项目代码的组合调用图,所述组合调用图是通过所述项目代码变更前的代码调用图和变更后的代码调用图组合得到的,所述组合调用图通过多个节点表示所述项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示所述多个方法代码中两个方法代码之间的调用关系,所述组合调用图的每个节点对应的方法代码还对应有第一关键性信息;
针对所述每个训练样本,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,所述第一集合中包括多个路径-上下文,其中,每个路径-上下文表示所述方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息;
根据所述多个方法代码中每个方法代码对应的第一集合以及所述每个方法代码对应的第一关键性信息,对所述第一关键性模型进行训练,以得到第二关键性模型;其中:
所述第一关键性模型包括第一层、第二层和第三层,其中,所述第一层用于将所述第一集合转换为第一向量表示,所述第二层用于结合所述多个方法代码之间的调用关系对所述每个方法代码的第一向量表示进行处理以得到所述每个方法代码的第二向量表示,所述第三层用于根据所述每个方法代码的第二向量表示确定所述每个方法代码的第二关键性信息,并根据所述组合调用图中每个节点的第一关键性信息监督所述第二关键性信息,以优化所述第一关键性模型中的参数;
所述第二关键性模型用于输出待审查的目标项目代码中每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息。
2.根据权利要求1所述的方法,其特征在于,所述针对所述每个训练样本,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:
针对所述每个训练样本,使用所述第一关键性模型,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
3.根据权利要求1或2所述的方法,其特征在于,所述根据所述多个方法代码中每个方法代码对应的第一集合以及所述每个方法代码对应的第一关键性信息,对所述第一关键性模型进行训练,包括:
将所述第一集合中每个路径-上下文进行向量化处理,以得到所述每个路径-上下文的第三向量表示;
根据所述每个路径-上下文的第三向量表示,确定所述第一集合对应的所述第一向量表示;
根据所述每个方法代码的所述第一向量表示,以及所述组合调用图中所述多个方法代码之间的调用关系,确定所述每个方法代码的所述第二向量表示;
根据所述每个方法代码的所述第二向量表示,采用自注意力机制确定所述每个方法代码的第二关键性信息,并根据所述组合调用图中每个节点的第一关键性信息监督所述第二关键性信息,以优化所述第一关键性模型中的参数。
4.根据权利要求3所述的方法,其特征在于,所述将所述第一集合中每个路径-上下文进行向量化处理,以得到所述每个路径-上下文的第三向量表示,包括:
将所述每个路径-上下文的所述两个叶子节点中每个叶子节点分别做分词处理,将所述每个叶子节点分词处理后得到的多个子词的平均向量表示作为所述每个叶子节点的向量表示;
将所述两个叶子节点各自的向量表示以及所述两个叶子节点之间的路径信息的向量表示进行拼接,以得到所述每个路径-上下文的第三向量表示。
5.根据权利要求3或4所述的方法,其特征在于,所述根据所述每个路径-上下文的第三向量表示,确定所述第一集合对应的所述第一向量表示,包括:
对所述第三向量表示进行降维处理,以得到降维后的向量表示;
将所述第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到所述第一集合对应的所述第一向量表示,所述注意力大小是通过所述降维后的向量表示以及注意力向量确定的。
6.根据权利要求1-5任一项所述的方法,其特征在于,所述将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:
将所述多个方法代码中的每个方法代码转换为一个抽象语法树,所述抽象语法树包括多个叶子节点,所述多个叶子节点中的任意两个叶子节点及与所述两个叶子节点的父节点之间形成一条路径;
将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径确定为一个路径-上下文,所述第一集合包括所述抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
7.根据权利要求6所述的方法,其特征在于,所述将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径确定为一个路径-上下文,包括:
将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径中所述两个叶子节点按照命名规则进行分词处理,以得到包含所述任意两个叶子节点以及所述任意两个叶子节点之间路径的路径-上下文。
8.根据权利要求1-7任一项所述的方法,其特征在于,所述获取多个训练样本之前,所述方法还包括:
获取多个发生过变更的历史项目代码;
针对每个历史项目代码,获取变更前的文件内容和变更后的文件内容;
针对所述变更前的文件内容进行调用分析,得到第一调用图,针对所述变更后的文件内容进行调用分析,得到第二调用图;
基于所述第一调用图和所述第二调用图中未发生变更的内容,将所述第一调用图和所述第二调用图进行合并,以得到所述组合调用图。
9.一种代码识别的方法,其特征在于,包括:
接收待审查的目标项目代码,所述目标项目代码发生过变更;
根据所述目标项目代码确定对应的组合调用图,所述组合调用图是通过所述目标项目代码变更前的代码调用图和变更后的代码调用图组合得到的,所述组合调用图通过多个节点表示所述目标项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示所述多个方法代码中两个方法代码之间的调用关系;
将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,所述第一集合中包括多个路径-上下文,其中,每个路径-上下文表示所述方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息;
根据所述多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定所述目标项目代码中每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息,所述目标关键性模型包括第一层、第二层和第三层,其中,所述第一层用于将所述第一集合转换为第一向量表示,所述第二层用于结合所述多个方法代码之间的调用关系对所述每个方法代码的第一向量表示进行处理以得到所述每个方法代码的第二向量表示,所述第三层用于根据所述每个方法代码的第二向量表示确定所述每个方法代码的所述关键性信息或者所述多个方法代码的关键性排序信息。
10.根据权利要求9所述的方法,其特征在于,所述将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:
使用所述目标关键性模型,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
11.根据权利要求9或10所述的方法,其特征在于,所述根据所述多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定所述目标项目代码中每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息,包括:
将所述第一集合中每个路径-上下文进行向量化处理,以得到所述每个路径-上下文的第三向量表示;
根据所述每个路径-上下文的第三向量表示,确定所述第一集合对应的所述第一向量表示;
根据所述每个方法代码的所述第一向量表示,以及所述组合调用图中所述多个方法代码之间的调用关系,确定所述每个方法代码的所述第二向量表示;
根据所述每个方法代码的所述第二向量表示,采用自注意力机制确定所述每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息。
12.根据权利要求11所述的方法,其特征在于,所述将所述第一集合中每个路径-上下文进行向量化处理,以得到所述每个路径-上下文的第三向量表示,包括:
将所述每个路径-上下文的所述两个叶子节点中每个叶子节点分别做分词处理,将所述每个叶子节点分词处理后得到的多个子词的平均向量表示作为所述每个叶子节点的向量表示;
将所述两个叶子节点各自的向量表示以及所述两个叶子节点之间的路径信息的向量表示进行拼接,以得到所述每个路径-上下文的第三向量表示。
13.根据权利要求11或12所述的方法,其特征在于,所述根据所述每个路径-上下文的第三向量表示,确定所述第一集合对应的所述第一向量表示,包括:
对所述第三向量表示进行降维处理,以得到降维后的向量表示;
将所述第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到所述第一集合对应的所述第一向量表示,所述注意力大小是通过所述降维后的向量表示以及注意力向量确定的。
14.根据权利要求9-13任一项所述的方法,其特征在于,所述将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,包括:
将所述多个方法代码中的每个方法代码转换为一个抽象语法树,所述抽象语法树包括多个叶子节点,所述多个叶子节点中的任意两个叶子节点及与所述两个叶子节点距离最近的根节点之间形成一条路径;
将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径确定为一个路径-上下文,所述第一集合包括所述抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
15.根据权利要求14所述的方法,其特征在于,所述将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径确定为一个路径-上下文,包括:
将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径中所述两个叶子节点按照命名规则进行分词处理,以得到包含所述任意两个叶子节点以及所述任意两个叶子节点之间路径的路径-上下文。
16.根据权利要求9-15任一项所述的方法,其特征在于,所述根据所述目标项目代码确定对应的组合调用图,包括:
针对所述目标项目代码,获取变更前的文件内容和变更后的文件内容;
针对所述变更前的文件内容进行调用分析,得到第一调用图,针对所述变更后的文件内容进行调用分析,得到第二调用图;
基于所述第一调用图和所述第二调用图中未发生变更的内容,将所述第一调用图和所述第二调用图进行合并,以得到所述组合调用图。
17.一种模型训练的装置,其特征在于,包括:
获取单元,用于获取多个训练样本,其中,每个训练样本为一个发生过变更的项目代码的组合调用图,所述组合调用图是通过所述项目代码变更前的代码调用图和变更后的代码调用图组合得到的,所述组合调用图通过多个节点表示所述项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示所述多个方法代码中两个方法代码之间的调用关系,所述组合调用图的每个节点对应的方法代码还对应有第一关键性信息;
第一处理单元,用于针对所述获取单元获取的每个训练样本,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合,所述第一集合中包括多个路径-上下文,其中,每个路径-上下文表示所述方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息;
第二处理单元,用于根据所述第一处理单元得到的多个方法代码中每个方法代码对应的第一集合以及所述每个方法代码对应的第一关键性信息,对所述第一关键性模型进行训练,以得到第二关键性模型;其中:
所述第一关键性模型包括第一层、第二层和第三层,其中,所述第一层用于将所述第一集合转换为第一向量表示,所述第二层用于结合所述多个方法代码之间的调用关系对所述每个方法代码的第一向量表示进行处理以得到所述每个方法代码的第二向量表示,所述第三层用于根据所述每个方法代码的第二向量表示确定所述每个方法代码的第二关键性信息,并根据所述组合调用图中每个节点的第一关键性信息监督所述第二关键性信息,以优化所述第一关键性模型中的参数;
所述第二关键性模型用于输出待审查的目标项目代码中每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息。
18.根据权利要求17所述的装置,其特征在于,
所述第一处理单元,用于针对所述每个训练样本,使用所述第一关键性模型,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
19.根据权利要求17或18所述的装置,其特征在于,
所述第二处理单元用于:
将所述第一集合中每个路径-上下文进行向量化处理,以得到所述每个路径-上下文的第三向量表示;
根据所述每个路径-上下文的第三向量表示,确定所述第一集合对应的所述第一向量表示;
根据所述每个方法代码的所述第一向量表示,以及所述组合调用图中所述多个方法代码之间的调用关系,确定所述每个方法代码的所述第二向量表示;
根据所述每个方法代码的所述第二向量表示,采用自注意力机制确定所述每个方法代码的第二关键性信息,并根据所述组合调用图中每个节点的第一关键性信息监督所述第二关键性信息,以优化所述第一关键性模型中的参数。
20.根据权利要求19所述的装置,其特征在于,
所述第二处理单元用于:
将所述每个路径-上下文的所述两个叶子节点中每个叶子节点分别做分词处理,将所述每个叶子节点分词处理后得到的多个子词的平均向量表示作为所述每个叶子节点的向量表示;
将所述两个叶子节点各自的向量表示以及所述两个叶子节点之间的路径信息的向量表示进行拼接,以得到所述每个路径-上下文的第三向量表示。
21.根据权利要求19或20所述的装置,其特征在于,
所述第二处理单元用于:
对所述第三向量表示进行降维处理,以得到降维后的向量表示;
将所述第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到所述第一集合对应的所述第一向量表示,所述注意力大小是通过所述降维后的向量表示以及注意力向量确定的。
22.根据权利要求17-21任一项所述的装置,其特征在于,
所述第一处理单元用于:
将所述多个方法代码中的每个方法代码转换为一个抽象语法树,所述抽象语法树包括多个叶子节点,所述多个叶子节点中的任意两个叶子节点及与所述两个叶子节点的父节点之间形成一条路径;
将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径确定为一个路径-上下文,所述第一集合包括所述抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
23.根据权利要求22所述的装置,其特征在于,
所述第一处理单元用于:将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径中所述两个叶子节点按照命名规则进行分词处理,以得到包含所述任意两个叶子节点以及所述任意两个叶子节点之间路径的路径-上下文。
24.根据权利要求17-23任一项所述的装置,其特征在于,
所述获取单元还用于:
获取多个发生过变更的历史项目代码;
针对每个历史项目代码,获取变更前的文件内容和变更后的文件内容;
针对所述变更前的文件内容进行调用分析,得到第一调用图,针对所述变更后的文件内容进行调用分析,得到第二调用图;
基于所述第一调用图和所述第二调用图中未发生变更的内容,将所述第一调用图和所述第二调用图进行合并,以得到所述组合调用图。
25.一种代码识别的装置,其特征在于,包括:
接收单元,用于接收待审查的目标项目代码,所述目标项目代码发生过变更;
第一处理单元,用于根据所述接收单元接收的目标项目代码确定对应的组合调用图,所述组合调用图是通过所述目标项目代码变更前的代码调用图和变更后的代码调用图组合得到的,所述组合调用图通过多个节点表示所述目标项目代码在变更前和变更后所包含的多个方法代码,以及通过边表示所述多个方法代码中两个方法代码之间的调用关系;
第二处理单元,用于将所述第一处理单元得到的多个方法代码中的每个方法代码转换为路径-上下文的第一集合,所述第一集合中包括多个路径-上下文,其中,每个路径-上下文表示所述方法代码转为为抽象语法树后任意两个叶子节点及其中间的路径信息;
第三处理单元,用于根据所述第二处理单元得到的多个方法代码中每个方法代码对应的第一集合,以及目标关键性模型,确定所述目标项目代码中每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息,所述目标关键性模型包括第一层、第二层和第三层,其中,所述第一层用于将所述第一集合转换为第一向量表示,所述第二层用于结合所述多个方法代码之间的调用关系对所述每个方法代码的第一向量表示进行处理以得到所述每个方法代码的第二向量表示,所述第三层用于根据所述每个方法代码的第二向量表示确定所述每个方法代码的所述关键性信息或者所述多个方法代码的关键性排序信息。
26.根据权利要求25所述的装置,其特征在于,
所述第二处理单元,用于使用所述目标关键性模型,将所述多个方法代码中的每个方法代码转换为路径-上下文的第一集合。
27.根据权利要求25或26所述的装置,其特征在于,
所述第三处理单元用于:
将所述第一集合中每个路径-上下文进行向量化处理,以得到所述每个路径-上下文的第三向量表示;
根据所述每个路径-上下文的第三向量表示,确定所述第一集合对应的所述第一向量表示;
根据所述每个方法代码的所述第一向量表示,以及所述组合调用图中所述多个方法代码之间的调用关系,确定所述每个方法代码的所述第二向量表示;
根据所述每个方法代码的所述第二向量表示,采用自注意力机制确定所述每个方法代码的关键性信息或者所述目标项目代码中多个方法代码的关键性排序信息。
28.根据权利要求27所述的装置,其特征在于,
所述第三处理单元用于:
将所述每个路径-上下文的所述两个叶子节点中每个叶子节点分别做分词处理,将所述每个叶子节点分词处理后得到的多个子词的平均向量表示作为所述每个叶子节点的向量表示;
将所述两个叶子节点各自的向量表示以及所述两个叶子节点之间的路径信息的向量表示进行拼接,以得到所述每个路径-上下文的第三向量表示。
29.根据权利要求27或28所述的装置,其特征在于,
所述第三处理单元用于:
对所述第三向量表示进行降维处理,以得到降维后的向量表示;
将所述第一集合中每个路径-上下文对应的降维后的向量表示与对应的注意力大小的乘积做求和处理,以得到所述第一集合对应的所述第一向量表示,所述注意力大小是通过所述降维后的向量表示以及注意力向量确定的。
30.根据权利要求25-29任一项所述的装置,其特征在于,
所述第二处理单元用于:
将所述多个方法代码中的每个方法代码转换为一个抽象语法树,所述抽象语法树包括多个叶子节点,所述多个叶子节点中的任意两个叶子节点及与所述两个叶子节点距离最近的根节点之间形成一条路径;
将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径确定为一个路径-上下文,所述第一集合包括所述抽象语法树中所有的叶子节点进行两两组合所得到的多个路径-上下文。
31.根据权利要求30所述的装置,其特征在于,
所述第二处理单元用于:将所述任意两个叶子节点以及所述任意两个叶子节点之间的路径中所述两个叶子节点按照命名规则进行分词处理,以得到包含所述任意两个叶子节点以及所述任意两个叶子节点之间路径的路径-上下文。
32.根据权利要求25-31任一项所述的装置,其特征在于,
所述第一处理单元用于:
针对所述目标项目代码,获取变更前的文件内容和变更后的文件内容;
针对所述变更前的文件内容进行调用分析,得到第一调用图,针对所述变更后的文件内容进行调用分析,得到第二调用图;
基于所述第一调用图和所述第二调用图中未发生变更的内容,将所述第一调用图和所述第二调用图进行合并,以得到所述组合调用图。
33.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被一个或多个处理器执行时实现如权利要求1-8任一项所述的方法。
34.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被一个或多个处理器执行时实现如权利要求9-16任一项所述的方法。
35.一种计算设备,其特征在于,包括一个或多个处理器和存储有计算机程序的计算机可读存储介质;
所述计算机程序被所述一个或多个处理器执行时实现如权利要求1-8任一项所述的方法。
36.一种计算设备,其特征在于,包括一个或多个处理器和存储有计算机程序的计算机可读存储介质;
所述计算机程序被所述一个或多个处理器执行时实现如权利要求9-16任一项所述的方法。
37.一种芯片***,其特征在于,包括一个或多个处理器,所述一个或多个处理器被调用用于执行如权利要求1-8任一项所述的方法。
38.一种芯片***,其特征在于,包括一个或多个处理器,所述一个或多个处理器被调用用于执行如权利要求9-16任一项所述的方法。
39.一种计算机程序产品,其特征在于,包括计算机程序,所述计算机程序当被一个或多个处理器执行时用于实现如权利要求1-8任一项所述的方法。
40.一种计算机程序产品,其特征在于,包括计算机程序,所述计算机程序当被一个或多个处理器执行时用于实现如权利要求9-16任一项所述的方法。
CN202111425345.8A 2021-11-26 2021-11-26 一种模型训练的方法、代码识别的方法及相应装置 Pending CN116187410A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111425345.8A CN116187410A (zh) 2021-11-26 2021-11-26 一种模型训练的方法、代码识别的方法及相应装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111425345.8A CN116187410A (zh) 2021-11-26 2021-11-26 一种模型训练的方法、代码识别的方法及相应装置

Publications (1)

Publication Number Publication Date
CN116187410A true CN116187410A (zh) 2023-05-30

Family

ID=86442800

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111425345.8A Pending CN116187410A (zh) 2021-11-26 2021-11-26 一种模型训练的方法、代码识别的方法及相应装置

Country Status (1)

Country Link
CN (1) CN116187410A (zh)

Similar Documents

Publication Publication Date Title
CN111259394B (zh) 一种基于图神经网络的细粒度源代码漏洞检测方法
CN111639344B (zh) 一种基于神经网络的漏洞检测方法及装置
US11645548B1 (en) Automated cloud data and technology solution delivery using machine learning and artificial intelligence modeling
CN113723288B (zh) 基于多模态混合模型的业务数据处理方法及装置
US20240062116A1 (en) Model processing method and apparatus
CN110362663A (zh) 自适应多感知相似度检测和解析
CN114547611A (zh) 一种基于多模态特征的智能合约庞氏骗局检测方法及***
WO2021120177A1 (zh) 编译神经网络模型的方法和装置
CN112528108B (zh) 一种模型训练***、模型训练中梯度聚合的方法及装置
Kusmenko et al. On the engineering of AI-powered systems
Kroshchanka et al. A neural-symbolic approach to computer vision
CN110928535B (zh) 衍生变量部署方法、装置、设备及可读存储介质
CN112748953A (zh) 基于神经网络模型的数据处理方法、装置及电子设备
CN113159315A (zh) 一种神经网络的训练方法、数据处理方法以及相关设备
CN116187410A (zh) 一种模型训练的方法、代码识别的方法及相应装置
US20230117893A1 (en) Machine learning techniques for environmental discovery, environmental validation, and automated knowledge repository generation
CN116226850A (zh) 应用程序的病毒检测方法、装置、设备、介质及程序产品
CN115827878A (zh) 语句情感分析方法、装置以及设备
CN115328753A (zh) 一种故障预测方法及装置、电子设备、存储介质
CN113643141A (zh) 解释性结论报告生成方法、装置、设备及存储介质
CN118012781B (zh) 模型训练方法与相关方法、装置、设备及存储介质
Buchgeher et al. Task-Specific Automation in Deep Learning Processes
US20240193365A1 (en) Method and system for insightful phrase extraction from text
CN115525263A (zh) 代码补全模型的训练方法、代码补全方法和装置
CN118057329A (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