【深度学习Github 10万+源代码分析】Python是第三受欢迎语言

【新智元导读】编程语言是软件开发的主要工具。自20世纪40年代以来,已经有数百种语言被发明出来,每天大量的各种语言编写的代码活跃着代码库。本文作者从 GitHub 代码库收集了数十万个源代码文件,并训练深度学习模型对其进行分析。在GitHub最受欢迎的49种语言中,Python排名第三。

编程语言是软件开发的主要工具。自20世纪40年代以来,已经有数百种语言被发明出来,每天,大量的各种语言编写的代码活跃着代码库。

我们认为,如果有一个源代码分类器,可以识别一段代码是用哪种语言编写的,这将会是非常有用的工具,可以用于在 StackOverflow 和技术类维基百科之类的平台上自动进行语法高亮显示和标签建议。这激励我们利用最新的用于文本分类的AI技术,训练一个模型来基于编程语言对代码片段进行分类。

我们从 GitHub 代码库收集了数十万个源代码文件。在训练模型之前,必须对原始数据进行处理以消除或减少代码中一些不需要的特征。最终训练好的分类器效果非常好,本文末提供了结果,以及对于模型的决策的一些解释。

数据:Github最受欢迎的49种语言

编程语言的选择依据是它们的突出性。图1显示了2014年第四季度GitHub上最常用的49种语言[1]。其中,JavaScript 是使用最多的语言,其次是 Java,第三是 Python。这个分析仅考虑活跃代码库,即在这期间至少有一次代码推送的存储库。我们将 HTML 和 XML 添加到列表中,尽管人们可能不认为它们是编程语言,但它们仍然与软件开发项目相关。同样的原因,我们也添加了SQL。

图1:GitHub最受欢迎的49种语言

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

混合的源代码

仔细看原始数据,我们发现一些具有挑战性的行为和特征,这并不算意外,因为这些数据是从实际的任意代码仓库中拿出的。最常见的是单个文件中有多重语言混合,这在 web 应用中最常出现,例如 JavaScript,HTML,CSS,PHP 和 ASP。下面是一个从.asp源文件中提取的ASP代码片段,可以看到语言混合的情况。

图:混合的语言

在我们的case中,我们希望为每个文档只分配一个类。因此,在单个源代码文件使用多种语言的情况下,我们只想保留该文件的主要语言(由其扩展名推断)的代码片段,并删除其他所有内容。为此,我们为每种语言使用已知的保留字(reserved words)和表达式。例如,我们知道<%php and %>之间的所有内容都是php代码,所以如果是.php文件,我们只保留这些内容,并删除其他所有内容。以同样的方式,可以使用正则表达式或 Python 中的内置解析器从代码中删除 HTML 标签。

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

图:JavaScript代码片段中有“隐藏”的C代码嵌入

标记化(Tokenization)

在预处理步骤(包括转义换行符和标记字符)之后,我们需要对所有文本进行标记。在这个步骤中,保留所有代码语法信息非常重要。我们使用 [\w']+|[""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~""\\] 正则表达式提取token。在这个步骤之后,数据就为进行训练做好准备了。

Python

Tokenized

Pre-processed

模型

最近,卷积神经网络(CNN)越来越受到各种NLP任务的欢迎。特别是在文本分类任务中,深度学习模型取得了显著的成果[2,3]。我们的模型使用一个 word embedding 层,后面跟一个有多个filter的卷积层,然后是一个max-pooling层,最后是一个softmax层(图3)。我们使用一个非晶态、随机初始化的嵌入层,因此是从头开始训练向量。

Figure 3 – CNN模型架构 (来源[2])

结果

我们对10%的数据进行了测试,并计算每个标签的准确性(accuracy),精度(precision), recall 和 f1-score。 accuracy, precision, recall 和 f1-score 的总体结果分别是97%,96%,96%和96%。每个标签的得分也相当高(图3)。

图:每一类的结果

放大看看:

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

一个 Scala 代码片段:

解释

一个 Java 代码片段:

解释

一个 OCaml 代码片段:

解释

未来的研究方向

虽然这个分类器的表现非常好,但仍有改进结果的方法。例如,尝试直接从 character 学习而不需要 word embedding 层的 character-level 模型[4]。此外,可以获得每种编程语言的版本数据,以便可以将特定版本分配给源代码片段。

References:

1. Githut – http://githut.info/

2. Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP 2014), 1746–1751.

3. Wang, P., Xu, J., Xu, B., Liu, C., Zhang, H., Wang, F., & Hao, H. (2015). Semantic Clustering and Convolutional Neural Network for Short Text Categorization. Proceedings ACL 2015, 352–357.

4. Zhang, X., Zhao, J., & LeCun, Y. (2015). Character-level Convolutional Networks for Text Classification, 1–9.

原文:http://blog.aylien.com/source-code-classification-using-deep-learning/

原文发布于微信公众号 - 新智元(AI_era)

原文发表时间:2017-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏磐创AI技术团队的专栏

Tensorboard详解(下篇)

28950
来自专栏desperate633

LintCode 不同的路径题目分析代码

有一个机器人的位于一个M×N个网格左上角(下图中标记为'Start')。 机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角(下图中标记为'F...

5520
来自专栏小詹同学

人脸识别(二)——训练分类器

这是关于人脸的第②篇原创!(源码在第三篇) 上一篇简单整理了下人脸识别的相关基础知识,这一篇将着重介绍利用pencv(2.4.9)已有的模型进行分类器训练。 ...

60490
来自专栏智能算法

数据异常到底该如何检测?(一)

小编在正式进入工作之后,面对的第一个需要去解决的问题:在网络安全监测中,如何发现异常数据?如异常用户登录,异常操作等。对于网络上的问题我确实是第一次接触这样类型...

82570
来自专栏吉浦迅科技

为啥在Matlab上用NVIDIA Titan V训练的速度没有GTX1080快?

在Matlab官方论坛上看到这个帖子,希望给大家带来参考 有一天,有人在Matlab的论坛上发出了求救帖: ? 楼主说: 我想要加快我的神经网络训练,所以把G...

57480
来自专栏人工智能的秘密

用机器学习来预测天气Part 1

  本章是使用机器学习预测天气系列教程的第一部分,使用Python和机器学习来构建模型,根据从Weather Underground收集的数据来预测天气温度。该...

43490
来自专栏企鹅号快讯

使用机器学习预测天气

作者:笨熊 本章是使用机器学习预测天气系列教程的第一部分,使用Python和机器学习来构建模型,根据从Weather Underground收集的数据来预测天气...

46250
来自专栏SDNLAB

SDN应用路由算法实现工具之Networkx

SDN(Software Defined Networking)是一种新型的网络架构,通过集中式的控制平面管理数据层面的转发等操作。网络的连通性是最基础的需求,...

37790
来自专栏北京马哥教育

搭建python机器学习环境以及一个机器学习例子

作者 | hzyido 来源 | 简书 糖豆贴心提醒,本文阅读时间6分钟,文末有秘密! 这篇文章介绍了Python机器学习环境的搭建,我用的机器学习开...

614120
来自专栏大数据挖掘DT机器学习

Python文本挖掘:基于共现提取《釜山行》人物关系

《釜山行》是一部丧尸灾难片,其人物少、关系简单,非常适合我们学习文本处理。这个项目将介绍共现在关系中的提取,使用python编写代码实现对《釜山行》文本的人物关...

51870

扫码关注云+社区

领取腾讯云代金券