在imageNet频频出现在计算机视觉研究的今天,IBM也为智能编码(AI foR code)带来了它的专属数据集&Mdash;&Mdash;codeNet。
1400万个编程项目,5亿行代码,超过55种的不同编码语言。研究人员希望这一数据集能为编码自动化领域(比如大型项目代码的调试、维护和迁移)带来便利。
独一无二的数据基础
codeNet的数据基础来自两个OJ(Online Judge)平台AIZU和AtcodeR所提交的实例。
在这种在线编程平台上提交的解决方案,除了大规模的代码数据之外,还有许多高质量的元数据(Metadata)和注释。
比如对于OJ平台的问题,就有如问题描述、内存限制、问题难度等信息。
用户提交的案例也一样:
而在平台自动审查机制下,提交的解决方案的不同状态同样也可以作为重要参考数据。
codeNet能做什么?
基准测试
当在codeNet-1K(C++ 1000基准)与最大的公开数据集之一GCJ-297上训练相同的MISIM模型,并在第三个独立的数据集POJ-104上测试这两个训练好的模型时:
这表明了codeNet-1K拥有更好的泛化能力。
而分别使用MLP、CNN、C-BERT、GNN在codeNet的几个基准上进行了代码分类、代码相似性评估和代码完成等实验后,大多数任务都获得了90%以上的准确率。
实际应用
基于不同编程语言间的规则,将几段代码转换成其他语言,对AI来说并非难事。
但如果是上千上万行,甚至是一个大型项目,其代码语义就会涉及到上下文,而上下文又可能牵扯到多个代码库。在这样的复杂语境下的语言翻译可是个不小的挑战。
在以前,通常先由机器完成程序50%~60%的迁移,涉及复杂规则的部分再由人力负责,非常棘手且费事费力。
可就在不久前,IBM通过基于codeNet的AI foR code成功将一位大型汽车客户的持续代码迁移过程(多代Java技术开发的3500个Java文件,超一百万行代码),从一年缩短到了四星期。
因为在codeNet的数据基础中,90%以上的问题的描述、输入格式说明、输出格式说明,以及50%以上的提交代码的输入和输出样本,就是确定不同语言间的代码等价与否的关键。
这就极大地推动了代码翻译的强化学习技术。
而大量于内存限制、执行时间、错误类型的元数据,也可以用来标记源代码中的潜在缺陷,并进一步训练开发代码优化系统。
codeNet数据集提供了一套利于理解和使用的技术,在协助广大开发者和研究者开发算法,推进AI编码的同时,也为企业开启IT现代化带来了持续不断的商业价值。
技术上如何实现
在统计数据时,研究者们组织所有数据成为一个严格的目录结构:最上层是project codeNet目录,下方的子目录分别为:
*数据
细分为每个问题中源码、脚本语言。
*元数据
存放所有问题的ProbleM_list.csv文件和提交案例的csv文件。
*问题描述
存放问题的HTML文件,包含文本的广泛描述。
然后使用命令行工具或像ls和gRep这样的应用程序来提取,对csv文件可使用csvkIT组件(如csvstat)。
对于数据集则采用bash脚本进行访问选择:
最后通过标记器产生标记流、AST生成解析到抽象语法树、构建数据流图以分析代码,最终将代码样本转换为可被AI算法识别和使用的表现形式:
编程自动化的未来
IBM的研究者们还在不断地改进和开发codeNet,期望它能够加速AI编程的算法进步。
而随着机器学习领域的不断发展,不仅是代码的“实现&Rdquo;,连“设计&Rdquo;也开始向计算机一侧倾靠(比如GAN通过对抗学习寻找最优解)。
未来真的可以像DNA的自我编辑那样,实现完全的自动编程吗?
建议先封装几个人类程序员,来帮计算机完成算法第一步的“精确描述问题需求&Rdquo;。