使用深度学习进行源代码分类

新知榜官方账号

2023-07-10 13:48:41

使用深度学习进行源代码分类

编程语言是软件开发的主要工具。自20世纪40年代以来,已经有数百种语言被发明出来,每天,大量的各种语言编写的代码活跃着代码库。我们认为,如果有一个源代码分类器,可以识别一段代码是用哪种语言编写的,这将会是非常有用的工具,可以用于在StackOverflow和技术类维基百科之类的平台上自动进行语法高亮显示和标签建议。这激励我们利用最新的用于文本分类的AI技术,训练一个模型来基于编程语言对代码片段进行分类。

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

数据

Github最受欢迎的49种语言编程语言的选择依据是它们的突出性。我们使用GitHubAPI来检索特定语言的代码仓库。我们检查了数千个代码仓库,但是忽略了大小超过100mb的仓库,以避免在下载和预处理上花费太多时间。我们使用文件扩展名来标记每个样本的编程语言。

图1显示了2014年第四季度GitHub上最常用的49种语言。其中,JavaScript是使用最多的语言,其次是Java,第三是Python。这个分析仅考虑活跃代码库,即在这期间至少有一次代码推送的存储库。

我们发现,C#是拥有最多源代码的语言,而Arduino在我们爬行的资源中是最少的。为了避免训练集不平衡,我们每一类语言最多使用10000个样本。

数据处理

在单个源代码文件使用多种语言的情况下,我们只想保留该文件的主要语言的代码片段,并删除其他所有内容。以同样的方式,可以使用正则表达式或Python中的内置解析器从代码中删除HTML标签。

在预处理步骤中,我们需要对所有文本进行标记。我们使用正则表达式提取token。在这个步骤之后,数据就为进行训练做好准备了。

模型选择

卷积神经网络(CNN)在文本分类任务中取得了显著的成果。我们的模型使用一个wordembedding层,后面跟一个有多个filter的卷积层,然后是一个max-pooling层,最后是一个softmax层。我们使用一个非晶态、随机初始化的嵌入层,因此是从头开始训练向量。

结果分析

我们对10%的数据进行了测试,并计算每个标签的准确性、精度、recall和f1-score。accuracy,precision,recall和f1-score的总体结果分别是97%、96%、96%和96%。每个标签的得分也相当高。通过使用LIME生成“explanations”,我们可以知道为什么模型选择某一个标签而不是另一个。

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

本页网址:https://www.xinzhibang.net/article_detail-7433.html

寻求报道,请 点击这里 微信扫码咨询

关键词

源代码 分类 深度学习

分享至微信: 微信扫码阅读

相关工具

相关文章