[paper note]代码生成评估模型-CodeBLEU原理分析

论文提出CodeBLEU,一种针对代码合成的自动评估方法,改进了BLEU和精确匹配,考虑了代码的语法和语义。实验结果显示,CodeBLEU在与人类评分的相关性上优于传统指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

论文信息

论文标题:CodeBLEU: a Method for Automatic Evaluation of Code Synthesis

发表时间:2020年9月

论文原文:CodeBLEU: a Method for Automatic Evaluation of Code Synthesis

论文内容

摘要

评价指标对一个领域的发展起着至关重要的作用,因为它定义了区分模型好坏的标准。在代码综合领域,常用的评估指标是 BLEU 或 精确匹配,但它们是不太适合评估代码能力,因为BLEU最初是为了评估自然语言而设计的,忽略了代码的重要语法和语义;而精确匹配因太过严格,导致低估具有相同的语义逻辑的不同输出。为了解决这个问题,我们引入了一个新的自动评估指标,称为CodeBLEU。它吸收了BLEU在n-gram匹配中的优势,并进一步通过抽象语法树(AST)引入代码语法,通过数据流引入代码语义。我们通过评估CodeBLEU与程序员在三个代码合成任务(即文本生成码、代码翻译和代码优化)上分配的质量分数之间的相关系数来进行实验。实验果表明,与BLEU和精确匹配相比,我们提出的Code-BLEU可以与程序员分配的分数实现更好的相关性。

主要思路

论文主要的思想是,在BLEU算法的基础上,增加了其余的三个指标用于解决BLEU的三个问题。

  1. BLEU对每个单词都是一样的,而代码其实是有保留字和声明名称的。对于语言的保留字和声明名称(如变量名、类名等)、常量数值(字符串、数值等),其重要性远远大于普通的名称声明。在这篇论文中,引入了带权重的 BLEU 算法,将保留字的权重设置为普通词的4倍,以应对该问题。
  2. BLEU将代码作为一串普通文本进行对比,忽略了代码语法。实际上,代码作为一个人为创建的语言,具备很强的逻辑性。该论文引入了AST语法树,通过对比语法树来引入对于代码语法的评估。
  3. BLEU将代码以自然语言的形式理解,忽略了代码语义。代码作为逻辑性很强的语言,一个语义的差别,可能带来的结果却是天差地别。该模型引入了数据流,以图的形式比较数据流的相似性,将代码语义引入评估模型中。

根据上述描述,CodeBLEU的最终得分公式如下:

C o d e B L E U = α ⋅ B L E U + β ⋅ B L E U w e i g h t + γ ⋅ M a t c h a s t + δ ⋅ M a t c h d f CodeBLEU =α · BLEU + β · BLEU_{weight} + γ · Match_{ast} + δ · Match_{df} CodeBLEU=αBLEU+βBLEUweight+γMatchast+δMatchdf

典型示例

论文中给了一正一反两个示例,来证明CodeBLEU比BLEU更加准确。

  1. 反例

在这里插入图片描述

这个例子中,参考代码是将一个double类型的数据转化为int类型。而候选代码则将数据转化成了float类型。使用BLEU算法,计算出的相似度为75.43。而考虑了语法和语义的CodeBLEU则对于返回类型的差异做了惩罚扣分,最终结果为69.73。

  1. 正例

在这里插入图片描述

参考代码的逻辑和反例相同,而候选代码中,只是变量名称换了,这丝毫不影响代码的整体逻辑。如果是人工评测,我们会打100分,因为这两段代码的功能是一样的。然而BLEU算法的打分只有68.14分,而考虑语法和语义的CodeBLEU算法的得分为83.97,一定程度上修正了误判。

实现细节

加权N‑Gram匹配

原始 BLEU 比较候选和参考之间的 n 元语法,并计算匹配的 n 元语法的比率。与自然语言的词汇量庞大、词序自由相比,编程语言是人工设计的,只有“int”、“public”等少数几个关键字。将传统的BLEU直接应用到代码综合中会忽略关键字的重要性。因此,我们引入加权n‑gram匹配,为不同的n‑gram分配不同的权重,使得关键词具有更高的权重。

计算公式如下:

p n = ∑ C ∈ C a n d i d a t e s ∑ i = 1 l µ n i ⋅ C o u n t c l i p ( C ( i , i + n ) ) ∑ C ′ ∈ C a n d i d a t e s ∑ i = 1 l µ n i ⋅ C o u n t

### CodeBLEU 的定义 CodeBLEU 是一种专门针对编程语言翻译任务设计的评估指标。该度量方法不仅考虑了自然语言处理中的 BLEU 指标,还引入了语法树匹配、名称实体匹配以及类型约束违反等多个方面来综合评价代码的质量和准确性[^3]。 ### CodeBLEU 的作用 通过结合多种因素进行评分,CodeBLEU 能够更全面地反映生成代码与目标代码之间的相似程度及其语义一致性。具体来说,在自动代码生成功能中应用此度量可以帮助开发者更好地理解模型输出的效果,并据此调整优化算法参数;对于研究者而言,则可以利用这一工具对比不同编码实现方式的好坏优劣,从而推动相关领域技术进步和发展[^3]。 ### 应用场景 #### 自动化测试框架集成 在持续集成/持续部署(CI/CD)环境中集成了基于 CodeBLEU 的自动化测试流程后,能够快速检测新提交版本是否存在潜在问题并给出量化反馈意见,提高软件质量保证效率的同时也降低了人工审核成本。 #### 编程教育平台辅助教学 借助于 CodeBLEU 提供的标准答案解析服务,学生可以获得更加精准详细的作业批改报告,帮助其发现自身不足之处进而改进学习策略;教师也可以依据这些数据统计分析班级整体水平分布情况以便因材施教制定个性化辅导计划。 ```python def calculate_codebleu(reference, candidate): """ 计算给定参考代码和候选代码之间的CodeBLEU分数 参数: reference (str): 参考代码字符串 candidate (str): 候选代码字符串 返回: float: CodeBLEU得分 """ # 这里只是一个示意性的函数结构,实际计算过程较为复杂 pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值