基于Transformer分块与数据增强的语义级代码异味检测研究

《Machine Learning with Applications》:Semantic Code Smell Detection from Raw Source Code using Transformers with Chunking and Data Augmentation

【字体: 时间:2026年04月25日 来源:Machine Learning with Applications 4.9

编辑推荐:

  为解决传统代码异味检测方法依赖手工提取的软件度量指标、难以捕获深层语义信息的问题,研究人员开展了利用CodeBERT和CodeT5等预训练Transformer模型直接处理原始源代码进行语义级代码异味检测的研究。通过引入静态分块与滑动窗口分块策略处理长序列,并结合Easy Data Augmentation (EDA) 与Self-Supervised Manifold-Based Data Augmentation (SSMBA) 进行数据增强,实验表明CodeT5结合EDA的Random Swap增强在MLCQ数据集上对Data Class、God Class和Long Method三种代码异味的检测取得了最佳性能,其F1-Score优于基于CuBERT的基线方法和ChatGPT-4.1-mini,为提升代码质量评估的自动化水平提供了新思路。

  
在软件开发的复杂迷宫中,代码异味如同潜伏的陷阱,它们并非致命的错误,却会悄然侵蚀代码的可读性、可维护性与长期演化能力。随着软件系统规模的指数级增长,如何高效、精准地识别这些“坏味道”,已成为保障软件质量的关键挑战。传统的检测手段,无论是依赖专家经验的手工审查,还是基于预设规则和软件度量(如代码行数、圈复杂度)的启发式工具,都存在着劳动密集、主观性强、规则僵化或假阳性率高等诸多局限。更重要的是,这些方法大多基于从源代码抽象出的次级指标,往往丢失了代码本身丰富的上下文和结构信息,如同仅凭建筑的蓝图去评估其居住舒适度,难免失之偏颇。
近年来,机器学习技术为自动化代码异味检测带来了曙光,但大多数研究仍建立在手工特征工程和软件度量数据集之上。尽管经典算法如支持向量机、决策树等在特定场景下有效,但它们难以捕捉原始源代码中复杂的语义关系和长程依赖。与此同时,自然语言处理领域革命性的Transformer架构及其在编程语言上的预训练模型(如CodeBERT、CodeT5)展现出强大的序列建模和语义理解能力。这引发了一个核心思考:能否绕开手工度量提取的“弯道”,让模型直接“阅读”和理解原始源代码,从而实现更精准、更语义化的代码异味检测?这正是《基于Transformer分块与数据增强的原始源代码语义代码异味检测》一文旨在探索的核心命题。该研究发表在《Machine Learning with Applications》期刊上。
为了回答上述问题,研究人员设计并实施了一套系统的研究方案。其关键技术方法包括:1) 数据集与预处理:研究采用了MLCQ这一广泛认可的Java代码异味数据集,包含Data Class、God Class和Long Method三种异味类型,并按严重程度标注。通过对原始GitHub代码的抓取和清洗,构建了可用于模型直接输入的原始源代码文本文件,并进行了保持严重程度和代码长度分布平衡的分层数据集划分。2) 模型与输入处理:研究以专门为代码预训练的Transformer模型CodeBERT和CodeT5为核心。为突破模型512个令牌的输入长度限制,创新性地提出了分块策略,包括将长代码分割为不重叠片段的静态分块和允许片段间重叠以保持上下文的滑动窗口分块。3) 训练策略与逻辑整合:针对分块后单个实例对应多个代码片段的情况,设计了两种损失策略:分别为每个片段计算损失的“单独损失”和聚合所有片段信息后再计算损失的“聚合损失”。同时,为从片段级预测得出实例级结论,定义了两种分块逻辑:“组合逻辑”(任一片段预测为正则实例为正)和“多数逻辑”(超过半数片段预测为正则实例为正)。4) 数据增强:为提升模型鲁棒性,引入了两种文本级数据增强技术:Easy Data Augmentation (EDA) 中的随机交换操作,以及基于自监督流形的数据增强(SSMBA)。5) 评估与基线对比:采用精确率、召回率和F1-Score作为核心评估指标。研究设置了两个强有力的基线进行对比:一是结合CuBERT嵌入与XGBoost分类器并采用SMOTEENN处理类别不平衡的经典方法;二是使用ChatGPT-4.1-mini大语言模型进行的零样本提示检测,以评估通用大模型在此专业任务上的表现。
研究结果部分通过一系列实验揭示了不同配置下的模型性能。
  • 超参数调优结果:研究首先通过调优确定了最佳配置。实验表明,专门在代码上预训练的模型(如CodeBERT)性能显著优于仅处理自然语言的长序列模型(如Longformer),证实了领域预训练的重要性。最大序列长度设置为512令牌能获得最佳效果。对于不同的代码异味类型,最优的分块方法、分块逻辑和损失策略组合有所不同:Data Class在静态分块多数逻辑单独损失下表现最好;而God Class和Long Method则在滑动窗口分块组合逻辑单独损失下达到最优。这反映了不同异味在代码中分布模式的差异。
  • 代码异味检测结果:在确定了最优超参数配置后,研究评估了CodeBERT和CodeT5结合不同数据增强技术在三类代码异味检测上的表现。在验证集上,CodeT5模型整体上优于CodeBERT。具体而言:
    • Data Class:CodeT5在结合SSMBA (BERT-cased) 时取得最佳验证F1-Score (0.6701)。
    • God Class:CodeT5在结合EDA (Random Swap) 时取得最佳验证F1-Score (0.5667)。
    • Long Method:CodeT5在结合EDA (Random Swap) 时取得最佳验证F1-Score (0.8094),且各配置间性能接近,模型表现稳健。
    在最终测试集上与基线模型的对比中,优化后的CodeT5模型展现出了显著优势:
    • Data Class:CodeT5 (SSMBA: BERT-cased) 的F1-Score达到0.6756,远超CuBERT基线 (0.44) 和ChatGPT (0.5829)。
    • God Class:CodeT5 (EDA: Random Swap) 的F1-Score为0.5681,优于CuBERT (0.53) 和ChatGPT (0.4444)。
    • Long Method:CodeT5 (EDA: Random Swap) 的F1-Score高达0.8212,明显高于CuBERT (0.74) 和ChatGPT (0.5253)。
    值得注意的是,CuBERT基线虽然实现了极高的召回率(接近1.00),但其精确率较低,表明其倾向于过度预测正类,导致整体F1-Score不高。而ChatGPT虽然在部分情况下精确率很高,但召回率普遍偏低,说明其漏检严重,在零样本设置下对此专业任务的泛化能力有限。
研究结论与讨论部分对上述发现进行了深入总结与阐释。本研究表明,利用专门为代码预训练的Transformer模型(特别是CodeT5)直接处理原始源代码,并结合有效的分块策略与数据增强技术,能够实现比传统度量驱动方法以及通用大语言模型(零样本)更优异的代码异味检测性能。 CodeT5的优越性可能源于其编码器-解码器架构、标识符感知的预训练目标以及多粒度的掩码预测任务,这些使其能更好地捕捉代码的语义和结构特征。在数据增强方面,EDA的随机交换操作在多数情况下表现最佳,因其在增加数据多样性的同时,对源代码语法结构的破坏风险相对较小。
这项研究的意义重大。首先,它成功验证了基于原始源代码的端到端深度学习范式在代码异味检测任务上的可行性与优越性,摆脱了对手工特征工程和专用度量提取工具的依赖,为实现更智能、更语义化的代码质量分析工具奠定了基础。其次,研究系统探索并优化了处理长代码序列的分块方法分块逻辑损失策略,为类似序列长度受限的任务提供了宝贵的技术参考。最后,通过将专门化的预训练模型通用大语言模型进行对比,研究揭示了在特定软件工程任务上,经过针对性设计和调优的专业模型相比通用模型仍具有显著性能优势,这为未来工具的选择和研发方向提供了重要启示。
当然,研究也指出了未来的改进方向,例如探索更语义保持的数据增强方法,以及利用梯度归因等技术深入理解模型究竟学习了代码的哪些特征来做出判断。总体而言,这项工作为构建下一代自动化、高精度、可扩展的代码质量守护系统迈出了坚实的一步。
相关新闻
生物通微信公众号
微信
新浪微博

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号