【技术实现步骤摘要】
一种基于Transformer模型的代码复杂度分析方法
[0001]本专利技术涉及一种复杂度判断方法,具体涉及一种基于Transformer模型的复杂度判断方法,属于深度学习领域。
技术介绍
[0002]近年来,基于代码的机器学习领域已成为备受瞩目的研究领域。其原因在于,日益增长的代码量和难以保证的代码质量给软件开发带来了巨大的挑战。同一项需求功能,新手开发人员可能会设计时间复杂度为O(n2)的程序,而经验丰富的开发人员则可能只需要O(n)的时间复杂度即可完成。当项目规模小、代码量较少时,这些差异不易察觉,开发人员可能忽视其重要性。然而随着项目需求和规模的不断增加,代码的庞大和维护困难度加大,机器硬件的限制也导致项目时间成本增加,因此对代码复杂度进行分析变得至关重要。
[0003]尽管存在基于代码进行时间复杂度分析的方法,比如靠人工去事前分析,采用大O复杂度表示法,对代码进行分析,但是存在一些困难,包括:(1)由于部分开发人员是转行进入IT专业,因此并不了解复杂度分析的重要性。(2)当项目变得庞大,由于代码之间的嵌套 ...
【技术保护点】
【技术特征摘要】
1.一种基于Transformer模型的代码复杂度分析方法,其特征在于包含以下步骤:步骤(1)从代码数据库中提取大于等于O(n)复杂度的Java代码数据集,并构建训练语料。步骤(2)对训练语料进行预处理,以便于后续的代码抽象语法树构建。步骤(3)基于预处理过的训练语料生成Java代码的抽象语法树,并进行初步处理。步骤(4)对抽象语法树进行预处理,获得代码结构信息步骤(5)将预处理后的Java代码以及其结构信息输入Transformer模型进行训练。步骤(6)用户输入待处理的Java代码,并将其预处理后输入训练好的模型以获得代码复杂度分析结果。2.根据权利要求1所述的一种基于Transformer模型的代码复杂度分析方法,其特征在于步骤(1)通过从代码数据库中提取大于等于O(n)复杂度的Java代码数据集,构建训练语料。该步骤的目的是获取具有足够复杂度的Java代码样本,以便于训练模型对于复杂代码的判定能力的提高。在该步骤中,数据集的构建应当基于严格的复杂度定义,以确保训练语料的质量和有效性。通过构建高质量的训练语料,可为后续的代码抽象语法树构建和Transformer模型训练提供可靠的基础。步骤(1.1)通过对数据集进行分析,本方法首先采用了过滤掉代码复杂度为O(1)的代码题目的策略。经过筛选后,本方法的训练语料中仅包含代码复杂度为O(n)及其以上的Java代码,以确保训练语料具有足够的复杂度。数据集的分析表明,当代码复杂度为O(1)时,题目的最优耗时与最长耗时间隔通常小于200毫秒。因此,过滤掉复杂度为O(1)的代码题目可以有效提高训练语料的质量,提高模型的泛化性能,并确保训练语料的有效性。步骤(1.2)针对每一个题目,本方法在步骤(2)中通过分析最优耗时提交的代码的理论时间复杂度,计算出代码复杂度的O(n)。接着,根据O(n)的计算结果,计算出代码复杂度的间隔,包括[O(n),O(nlog(n)),O(n2),O(n3)]。然后,对该题目的每一个通过的代码进行标签划分,以获得代码标签。标签划分依据代码复杂度所处的间隔,即将代码分为O(n)、O(nlog(n))、O(n2)和O(n3)四个类别。通过对代码进行标签划分,本方法能够对不同类别的代码进行区分和统计,以提高代码复杂度分析的精度和有效性。步骤(1.3)为了保证模型的泛化能力和可靠性,本方法在数据集处理过程中采用了随机打乱排序的策略。在步骤(1)中,本方法首先从代码数据库中提取大于等于O(n)复杂度的Java代码数据集,并构建训练语料。接着,对数据集进行随机打乱排序,以确保模型在训练和测试时不会出现过拟合现象,同时可以避免模型学习到数据集的局部特征。通过随机打乱排序,可以使训练数据更加随机化和均匀化,从而提高模型的泛化能力和鲁棒性,有效避免数据集中的潜在偏差问题。3.根据权利要求1所述的一种基于Transformer模型的代码复杂度分析方法,其特征在于步骤(2)中训练语料预处理,具体子步骤包括:步骤(2.1)去掉源代码中无论是单行,还是多行的注释,并去掉代码中多余的空行。步骤(2.2)为了减少Java代码中的噪声影响,本方法在进行代码预处理时会对常量字符串和常量数字进行替换。具体地,本方法将代码中的常量字符串替换为[MASKSTRING](被遮掩的字符串),将常量数字替换为[MASKNUMBER](被遮掩的数字)。这样可以减少代码中常量字符串和常量数字的干扰,同时还能够保留代码中的重要结构信息,提高代码的可读性
和可解释性。步骤(2.3)为了进一步提高代码的可读性和可解释性,本方法在进行代码预处理时还会对代码字符进行分解。具体地,对于每一个代码字符,本方法将其分解成与代码命名相关的子字符,并将子字符个数设置为至多5个。例如,对于代码字符getRawdata,本方法将其分解为[get,raw,data]。如果代码字符超过5个,本方法将对其进行截断,以避免代码字符过长。如果代码字符少于5个,本方法将使用<PAD>字符进行补齐,以保证输...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。