php发展

首页 » 常识 » 问答 » 深度学习Github10万源代码分析
TUhjnbcbe - 2022/11/27 20:52:00
皮肤病北京哪家医院好 http://pf.39.net/bdfyy/tslf/180306/6084106.html

1新智元编译

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

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

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

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

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

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

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

混合的源代码

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

图:混合的语言

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

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

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

标记化(Tokenization)

在预处理步骤(包括转义换行符和标记字符)之后,我们需要对所有文本进行标记。在这个步骤中,保留所有代码语法信息非常重要。我们使用[\w]+

[""!"#%()*+,-./:;=?

[\]^_`{

}~""\\]正则表达式提取token。在这个步骤之后,数据就为进行训练做好准备了。

Python

Tokenized

Pre-processed

模型

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

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

结果

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

图:每一类的结果

放大看看:

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

一个Scala代码片段:

解释

一个Java代码片段:

一个OCaml代码片段:

未来的研究方向

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

References:

1.Githut–

1
查看完整版本: 深度学习Github10万源代码分析