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

简介: 根据代码识别编程语言的源代码分类器将是一个非常有用的工具,因为它可用于在线自动语法高亮和标签建议,比如可用在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"

符号化之后

print strv \n for root, dirs, files in os.walk(strv):\n\t print root, strv

预处理完成后

['print',  'strv',  'for',  'root',  ',',  'dirs',  ',',  'files',  'in',  'os',  '.',  'walk',  '(', 'strv', ')',  ':',  'print',  'root,',  '"',  'strv']

模型

近来,卷积神经网络(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!")
   }
}

结果说明:

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();
   }
}

说明:

8.png

OCaml代码片段:

# let average a b =
    let sum = a +. b in
    sum /. 2.0;;
val average : float -> float -> float = 

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,译者:夏天,审校:主题曲。

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

相关文章
|
机器学习/深度学习 编解码 人工智能
人脸表情[七种表情]数据集(15500张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
本数据集包含15,500张已划分、已标注的人脸表情图像,覆盖惊讶、恐惧、厌恶、高兴、悲伤、愤怒和中性七类表情,适用于YOLO系列等深度学习模型的分类与检测任务。数据集结构清晰,分为训练集与测试集,支持多种标注格式转换,适用于人机交互、心理健康、驾驶监测等多个领域。
|
4月前
|
机器学习/深度学习 监控 算法
基于mediapipe深度学习的手势数字识别系统python源码
本内容涵盖手势识别算法的相关资料,包括:1. 算法运行效果预览(无水印完整程序);2. 软件版本与配置环境说明,提供Python运行环境安装步骤;3. 部分核心代码,完整版含中文注释及操作视频;4. 算法理论概述,详解Mediapipe框架在手势识别中的应用。Mediapipe采用模块化设计,包含Calculator Graph、Packet和Subgraph等核心组件,支持实时处理任务,广泛应用于虚拟现实、智能监控等领域。
|
2月前
|
机器学习/深度学习 人工智能 监控
河道塑料瓶识别标准数据集 | 科研与项目必备(图片已划分、已标注)| 适用于YOLO系列深度学习分类检测任务【数据集分享】
随着城市化进程加快和塑料制品使用量增加,河道中的塑料垃圾问题日益严重。塑料瓶作为河道漂浮垃圾的主要类型,不仅破坏水体景观,还威胁水生生态系统的健康。传统的人工巡查方式效率低、成本高,难以满足实时监控与治理的需求。
|
2月前
|
机器学习/深度学习 传感器 人工智能
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在人工智能和计算机视觉的快速发展中,火灾检测与火焰识别逐渐成为智慧城市、公共安全和智能监控的重要研究方向。一个高质量的数据集往往是推动相关研究的核心基础。本文将详细介绍一个火灾火焰识别数据集,该数据集共包含 2200 张图片,并已按照 训练集(train)、验证集(val)、测试集(test) 划分,同时配有对应的标注文件,方便研究者快速上手模型训练与评估。
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
2月前
|
机器学习/深度学习 人工智能 自动驾驶
7种交通场景数据集(千张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在智能交通与自动驾驶技术快速发展的今天,如何高效、准确地感知道路环境已经成为研究与应用的核心问题。车辆、行人和交通信号灯作为城市交通系统的关键元素,对道路安全与交通效率具有直接影响。然而,真实道路场景往往伴随 复杂光照、遮挡、多目标混杂以及交通信号状态多样化 等挑战,使得视觉识别与检测任务难度显著增加。
|
2月前
|
机器学习/深度学习 人工智能 监控
坐姿标准好坏姿态数据集(图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
坐姿标准好坏姿态数据集的发布,填补了计算机视觉领域在“细分健康行为识别”上的空白。它不仅具有研究价值,更在实际应用层面具备广阔前景。从青少年的健康教育,到办公室的智能提醒,再到驾驶员的安全监控和康复训练,本数据集都能发挥巨大的作用。
坐姿标准好坏姿态数据集(图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
2月前
|
机器学习/深度学习 编解码 人工智能
102类农业害虫数据集(20000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在现代农业发展中,病虫害监测与防治 始终是保障粮食安全和提高农作物产量的关键环节。传统的害虫识别主要依赖人工观察与统计,不仅效率低下,而且容易受到主观经验、环境条件等因素的影响,导致识别准确率不足。
|
29天前
|
机器学习/深度学习 数据采集 编解码
基于深度学习分类的时相关MIMO信道的递归CSI量化(Matlab代码实现)
基于深度学习分类的时相关MIMO信道的递归CSI量化(Matlab代码实现)
|
机器学习/深度学习 人工智能 文字识别
中药材图像识别数据集(100类,9200张)|适用于YOLO系列深度学习分类检测任务
本数据集包含9200张中药材图像,覆盖100类常见中药材,适用于YOLO系列及主流深度学习模型的图像分类与目标检测任务。数据已划分为训练集(8000张)与验证集(1200张),采用标准文件夹结构和简体中文命名,适配PyTorch、TensorFlow等框架,可用于中药识别系统开发、医学辅助诊断、移动端图像识别App研发及AI科研训练,具备较强的实用性与拓展性。
589 45
|
2月前
|
机器学习/深度学习 自动驾驶 算法
道路表面缺陷数据集(裂缝/井盖/坑洼)(6000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
随着城市化与交通运输业的快速发展,道路基础设施的健康状况直接关系到出行安全与城市运行效率。长期高强度的使用、气候变化以及施工质量差异,都会导致道路表面出现裂缝、坑洼、井盖下沉及修补不良等缺陷。这些问题不仅影响驾驶舒适度,还可能引发交通事故,增加道路养护成本。
道路表面缺陷数据集(裂缝/井盖/坑洼)(6000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】

热门文章

最新文章