比人工还准确!看深度学习如何对源码进行分类

简介: 根据代码识别编程语言的源代码分类器将是一个非常有用的工具,因为它可用于在线自动语法高亮和标签建议,比如可用在StackOverflow和技术维基网站上。这个想法促使我们根据最新的AI技术编写一个对代码片段依据编程语言进行分类的模型。

编程语言是软件开发行业的主要工具。自20世纪40年代以来,已经出现了数百种编程语言,并且每天都有大量的各种编程语言的代码被推送到代码库中。

我们认为,根据代码识别编程语言的源代码分类器将是一个非常有用的工具,因为它可用于在线自动语法高亮和标签建议,比如可用在StackOverflow和技术维基网站上。这个想法促使我们根据最新的AI技术编写一个对代码片段依据编程语言进行分类的模型。

我们使用GitHub API从GitHub上收集了数十万个源代码文件。在训练模型之前,必须处理原始数据以消除和减少一些不需要的特征。最终完成的分类器的性能非常得好,你可以在本文结尾找到相关的结果,以及有关模型决策的一些解释。

数据

我们根据编程语言的受欢迎程度选择了其中的一部分。图1显示了2014年第四季度GitHub上最常用的49种语言[1]。此分析仅考虑活跃的代码库,即在此期间至少有一行代码被推送进去的存储库。我们也将HTMLXML添加到列表中,虽然人们可能并不认为它们是编程语言,但毕竟它们是与软件开发项目相关的。基于同样的原因,我们也添加了SQL。

1.png
图表1 - 活跃代码库(点击查看原图

我们使用GitHub API来抓取代码库。下图显示了经过几天抓取后的数据形状。我们抓取了数千个代码库,但忽略了大小超过100MB的,以避免花费太多的时间进行下载和预处理。我们使用文件扩展名来标记每个样本所用的编程语言(例如,file.php是PHP源文件)。 C#是代码量最多的编程语言,而Arduino在我们爬取的资源中是最少的。为了避免训练集的不平衡,每个种类我们最多使用了一万个例子。

2.png
图表2 - 抓取的文件(点击查看原图

混杂的源代码

仔细看一下原始数据,我们发现一些令人深思的行为和特征,这并不令人惊讶,因为这些数据是从实际的代码库中抓取的。最常见的情况是单个文件混杂了多个语言,这在网络应用程序中很常见(如JavaScript、HTML、CSS、PHP和ASP)。下面这段从.asp源文件中提取出来的ASP代码说明了这种情况。

3.png
图1 - 混杂的语言

在这个例子中,我们只想为每个文档分配一个种类。因此,对于在单个源代码文件中使用混合语言,我们只保留该文件主要语言的代码片段(从其扩展名推断),并删去其他语言的所有内容。为此,我们对于每种语言使用已知的保留词和表达式。例如,我们知道<%php%>之间的所有内容都是php代码,所以如果是.php文件,我们只保留这些内容,并删除其他的内容。通过同样的方法,我们可以使用正则表达式或Python中的内置解析器从代码中剥离HTML标签。

这些文档中另一个常见的特征是嵌入式代码片段。例如,在下面的JavaScript脚本中,引号之间嵌入了C代码段。这是另一种非常常见的混合代码。我们通过用占位符替换引号之间的所有内容来化这个问题(在这个例子中,我们使用strv作为字符串占位符)。

4.png
图2 - JavaScript代码段中嵌入了“隐藏的”C代码

符号化

在预处理之后,源代码中仍然包括了转义的换行符和制表符,因此,我们需要对所有文本进行符号化。在这个步骤中,我们必须保留代码所有的语法信息。我们使用正则表达式[\w']+|[""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~""\\]来提取符号。完成这一步之后,这些数据就可以进行训练了。

Python

print "This is using getsize"
for root, dirs, files in os.walk('/tmp'):
    print root, "consumes"
AI 代码解读

符号化之后

print strv \n for root, dirs, files in os.walk(strv):\n\t print root, strv
AI 代码解读

预处理完成后

['print',  'strv',  'for',  'root',  ',',  'dirs',  ',',  'files',  'in',  'os',  '.',  'walk',  '(', 'strv', ')',  ':',  'print',  'root,',  '"',  'strv']
AI 代码解读

模型

近来,卷积神经网络(CNN)正受到越来越多的NLP项目的青睐。特别是在文本分类方面,深度学习模型取得了显着的成果[2,3]。我们的模型使用了一个单词嵌入层,然后是一个带有多个过滤器的卷积层、一个最大池层,最后是一个softmax层(图3)。我们使用了一个非静态并且随机初始化的嵌入层,因此需要从头开始训练矢量。

5.png
图3 - 卷积神经网络模型

结果

我们对10%的数据进行了测试,并计算出每个标签的准确性、精度、回调率和f1评分。总体结果分别为97%、96%、96%和96%。每个标签的成绩也相当得高(图3)。

6.png
图表3 - 每个种类的结果(点击查看原图

结果看起来还不错,让我们来看一下预测的解释说明来检查分类器是如何做出决策的。我们使用LIME生成“解释说明”,该“解释说明”高亮了与每个标签最相关的单词。这样,我们就知道了模型为什么选择这个标签而不是另一个标签。

Scala代码片段:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
   }
}
AI 代码解读

结果说明:

7.png

Java代码片段:

BufferedWriter out = null;
try {
   out = new BufferedWriter(new FileWriter("filename", true));
   out.write("aString");
} catch (IOException e) {
// error processing code
} finally {
   if (out != null) {
      out.close();
   }
}
AI 代码解读

说明:

8.png

OCaml代码片段:

# let average a b =
    let sum = a +. b in
    sum /. 2.0;;
val average : float -> float -> float = 
AI 代码解读

9.png

未来的方向

虽然分类器的性能很高,但仍有改进的空间。例如,尝试着使用直接从字符学习的字符级模型,这样就用不着单词嵌入层了[4]。此外,可以试着获取每种编程语言的版本数据,这样就能给源代码添加特定版本号了。

参考资料

  1. Githut – http://githut.info/
  2. Kim, Y. (2014). 用于语句分类的卷积神经网络。 有关2014届自然语言处理会议的经验方法 (EMNLP 2014), 1746–1751.
  3. Wang, P., Xu, J., Xu, B., Liu, C., Zhang, H., Wang, F., & Hao, H. (2015). 基于语义聚类和卷积神经网络的短文本分类。 Proceedings ACL 2015, 352–357.
  4. Zhang, X., Zhao, J., & LeCun, Y. (2015). 用于文本分类的字符级卷积网络, 1–9.

文章原标题《Source Code Classification Using Deep Learning》,作者:Robson Montenegro,译者:夏天,审校:主题曲。

文章为简译,更为详细的内容,请查看原文

目录
打赏
0
0
0
0
1807
分享
相关文章
基于深度学习的地面垃圾识别分类技术
AI垃圾分类系统结合深度学习和计算机视觉技术,实现高效、精准的垃圾识别与自动分类。系统集成高精度图像识别、多模态数据分析和实时处理技术,适用于市政环卫、垃圾处理厂和智能回收设备,显著提升管理效率,降低人工成本。
基于深度学习的地面垃圾识别分类技术
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
223 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
深度学习之动作识别与分类
基于深度学习的动作识别与分类是指通过深度学习模型从视频或传感器数据中自动识别和分类人类动作的过程。这项技术广泛应用于视频监控、安全监控、体育分析、医疗康复、虚拟现实(VR)和增强现实(AR)等领域。
232 1
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
深入浅出:使用深度学习进行图像分类
【8月更文挑战第31天】在本文中,我们将一起探索如何利用深度学习技术对图像进行分类。通过简明的语言和直观的代码示例,我们将了解构建和训练一个简单卷积神经网络(CNN)模型的过程。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供清晰的指导和启发性的见解,帮助你理解并应用深度学习解决实际问题。
如何使用深度学习实现图像分类
深度学习在图像分类中扮演着核心角色,通过卷积神经网络(CNN)自动提取图像特征并分类。本文介绍深度学习原理及其实现流程,包括数据准备、构建CNN模型、训练与评估模型,并讨论如何在阿里云上部署模型及其实用场景。
深度学习中的图像分类:从理论到实践
【8月更文挑战第31天】 本文将带你深入了解深度学习在图像分类领域的应用。我们将从理论基础出发,逐步过渡到实际的代码实现,让你能够亲手构建一个简单的图像分类模型。无论你是初学者还是有一定基础的开发者,都能从中获得启发和收获。
深度学习之分类网络
深度学习的分类网络(Classification Networks)是用于将输入数据分配到预定义类别的神经网络。它们广泛应用于图像分类、文本分类、语音识别等任务。以下是对深度学习分类网络的详细介绍,包括其基本概念、主要架构、常见模型、应用场景、优缺点及未来发展方向。
662 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等