Py学习  »  Python

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

新智元 • 6 年前 • 711 次点击  

1新智元编译  

来源:blog.aylien.com

作者:Robson Montenegro

编译:刘小芹


【新智元导读】编程语言是软件开发的主要工具。自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代码,所以如果是.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/



【号外】新智元正在进行新一轮招聘,飞往智能宇宙的最美飞船,还有N个座位

点击阅读原文可查看职位详情,期待你的加入~



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/9E9Wx3d6UJ
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3259
 
711 次点击