0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GitHub上现在托管有超过300种编程语言

DPVg_AI_era 来源:lq 2019-07-07 07:34 次阅读

OctoLingua的目标是提供一种服务,支持从多个粒度级别(从文件级别或片段级别到潜在的行级语言检测和分类)进行强大可靠的语言检测。最终,该服务可以支持代码搜索和共享、语法高亮显示和差异渲染等,旨在支持开发人员进行日常开发工作,同时帮助编写高质量的代码。

GitHub上现在托管有超过300种编程语言。从最广泛使用的语言比如PythonJava、Javascript等,到一些非常非常小众的语言例如Befunge,应有尽有。

但丰富的语种带来的一个挑战就是,如何即时鉴别它们?这影响到如何更好的搜索、发现其中的安全漏洞或者采取什么样的语法高亮。

而且编程语言识别起来,看似简单实则非常困难。文件扩展名是一个非常重要的区分标准,但很多时候非常混乱。比如“.pl”, “.pm”, “.t”, “.pod”,都跟Perl有关系;而“.h”,C、C++、Objective-C也都有在用。

甚至还会出现没有扩展名的情况,例如一些可执行脚本(curl,get,makefile等)。

Linguist已经可以完成84%的语言检测

那么GitHub是怎么解决上述问题呢?GitHub高级数据科学家Kavita Ganesan首先介绍了目前GitHub官方使用的语言鉴别工具:Linguist。

Linguist是一个基于Ruby的应用程序,它使用多种策略进行语言检测。比如利用命名约定和文件扩展名,考虑Vim或Emacs模型,以及文件顶部的内容(shebang)等。

Linguist通过启发式方法,通过一个小样本数据训练的朴素贝叶斯分类器来进行语言消歧义。

虽然Linguist在文件级语言预测方面做得很好(准确率为84%),但是当文件使用非常特殊的命名约定时,准确率就大幅下降了。更重要的是,当遇到没有提供文件扩展名的情况比如Gist、README文件、issue或者拉取请求中的代码片段,Linguist就无能为力了。

人工智能帮助完成剩下的语言检测工作

为了使语言检测能够更加健壮和可维护,GitHub又开发了一款名为OctoLingua的机器学习分类器,它基于人工神经网络(ANN)架构,可以处理棘手场景中的语言预测。

该模型的当前版本能够对GitHub托管的前50种语言进行预测,并在准确性和性能方面超越Linguist。

OctoLingua从头开始使用Python + Keras,以及TensorFlow后端进行构建,非常准确、健壮且易于维护。

数据源

OctoLingua的当前版本使用了从Rosetta Code检索的文件和内部众包的一组质量库的训练。语言集限制为GitHub上托管的Top 50。

Rosetta Code是一个出色的入门数据集,因为它包含用不同编程语言表示的相同任务的源码。例如,生成Fibonacci序列的任务可以用C、C ++、CoffeeScript、D、Java、Julia等表示。

但是,跨语言的覆盖范围并不统一,其中某些语言只有少量文件而某些文件的填充程度过于稀疏。因此,需要增加一些额外来源的训练集,以提高语言覆盖率和性能。

目前添加新语言的流程现已完全自动化,以编程方式从GitHub上的公共仓库收集源码。选择满足最低资格标准的仓库,例如具有最小数量的分支,以及涵盖目标语言和涵盖特定文件扩展名。

对于此阶段的数据收集,使用Linguist的分类确定仓库的主要语言。

特点:利用先验知识

传统上,对于神经网络的文本分类问题,通常采用基于存储器的体系结构,例如递归神经网络(RNN)和长短期记忆网络(LSTM)。

但是,鉴于编程语言在词汇、评论风格、文件扩展名、结构、库导入风格和其他微小差异,GitHub选择了一种更简单的方法:通过以表格形式提取某些相关功能来利用所有这些信息,并投喂给分类器。目前提取的功能如下:

每个文件的前五个特殊字符

每个文件前20个令牌

文件扩展名

存在源码文件中常用的某些特殊字符如冒号、花括号和分号

人工神经网络(ANN)模型

上述特征作为使用具有Tensorflow后端的Keras构建的双层人工神经网络的输入。

下图显示特征提取步骤为分类器生成n维表格输入。当信息沿着网络层移动时,它通过dropout正则化并最终产生51维输出,该输出表示给定代码在前50种GitHub语言中每一种写入的预测概率加不写入的概率。

GitHub使用90%的数据集进行大约8个epochs的训练。此外,在训练步骤中从训练数据中删除了一定百分比的文件扩展名,以鼓励模型从文件的词汇表中学习,而不是过度填充文件扩展功能。

基准

下图显示了在同一测试集上计算的OctoLingua和Linguist的F1得分(精确度和召回之间的调和平均值)。

这里展示三个测试。第一个是测试集不受任何干预;第二个测试使用同一组测试文件,删除了文件扩展名信息;第三个测试也使用相同的文件集,但这次文件扩展名被加扰,以便混淆分类器(例如,Java文件可能有“.txt”扩展名、Python文件可能具有“.java”)扩展名。

在测试集中加扰或删除文件扩展名的目的是评估OctoLingua在删除关键功能或误导时对文件进行分类的稳健性。不严重依赖扩展的分类器对要点和片段进行分类非常有用,因为在这些情况下,人们通常不提供准确的扩展信息(例如,许多与代码相关的文件具有.txt扩展名)。

下表显示了OctoLingua如何在各种条件下保持良好的性能,表明该模型主要从代码的词汇表中学习,而不是从元信息(即文件扩展名)中学习。但是没有扩展名的话Linguist完全无法鉴别。

上图是OctoLingua与Linguist在同一测试集上的表现。

在训练期间删除文件扩展名的效果

如前所述,在训练期间,从训练数据中删除了一定百分比的文件扩展名,以鼓励模型从文件的词汇表中学习。下表显示了模型在训练期间删除了不同分数的文件扩展名的性能。

上图在三个测试变体中删除了不同百分比的文件扩展名后,OctoLingua的表现

请注意,在训练期间没有删除文件扩展名的情况下,OctoLingua对没有扩展名和随机扩展名的测试文件的性能与常规测试数据相比差距很大。而一旦在删除某些文件扩展名的数据集上训练模型时,模型性能在修改的测试集上的差距就没有那么大。

这证实了在训练时从一小部分文件中删除文件扩展名,会使分类器从词汇表中学到更多。它还表明,文件扩展功能虽然具有高度预测性,但却倾向于支配并阻止将更多权重分配给内容。

添加新语言支持

在OctoLingua中添加新语言非常简单。它首先获取新语言的大量文件,这些文件分为训练和测试集,然后通过预处理器和特征提取器运行。这个新的训练和测试装置被添加到现有的训练和测试数据库中。新的测试装置允许验证模型的准确性是否仍然可以接受。

上图使用OctoLingua添加新语言、

未来计划

截至目前,OctoLingua正处于“先进的原型设计阶段”。我们的语言分类引擎已经强大且可靠,但还不支持我们平台上的所有编码语言。除了扩大语言支持 - 这将是相当简单的 - 我们的目标是在各种粒度级别启用语言检测。我们当前的实现已经允许我们通过对机器学习引擎的一些小修改来对代码片段进行分类。将模型带到可以可靠地检测和分类嵌入式语言的阶段并不是太遥远。

我们也在考虑开源我们模型的可能性,如果您有兴趣,我们很乐意听取社区的意见。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    9

    文章

    1879

    浏览量

    33269
  • 人工智能
    +关注

    关注

    1777

    文章

    44051

    浏览量

    231006
  • GitHub
    +关注

    关注

    3

    文章

    457

    浏览量

    15948

原文标题:GitHub机器学习代码分类器:仅凭代码轻松鉴别300种编程语言

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    plc编程语言与c语言的联系 c语言和PLC有什么区别

    PLC编程语言与C语言的联系 PLC(可编程逻辑控制器)是一种针对自动化控制系统的特殊计算机。PLC编程
    的头像 发表于 02-05 14:21 1292次阅读

    选择云服务器租用托管有哪些优势?

    云服务器租用托管服务好吗?选择云服务器租用托管有哪些优势?关于云服务器租用托管的话题RAKsmart小编今天来为您做详细的解答。
    的头像 发表于 01-10 10:21 211次阅读

    Python夺冠!GitHub 2023年度编程语言排行榜

    2023 年,Python 仍然是使用 GitHub 的开发者中最受欢迎的选择之一,占据了几乎 18% 的份额,在所有编程语言中保持领先地位,连续第四年增长 0.5%,巩固了其作为最受欢迎语言
    的头像 发表于 12-18 14:51 2057次阅读
    Python夺冠!<b class='flag-5'>GitHub</b> 2023年度<b class='flag-5'>编程</b><b class='flag-5'>语言</b>排行榜

    GitHub入门与实践

    GitHub 是一个基于 Git 版本控制系统的代码托管平台,它提供了许多功能和用途,主要面向软件开发和协作。以下是 GitHub 的主要用途和一些关键技术:GitHub 的主要用途:
    发表于 12-14 09:53 3次下载

    脚本语言编程语言的区别

    脚本语言编程语言是计算机语言的两个主要分类。尽管两者都是用于编写计算机程序的工具,但它们在设计和运行方式上存在一些显著的区别。下面将详细探讨脚本
    的头像 发表于 11-22 14:33 1489次阅读

    Python编程语言属于什么语言

    Python编程语言属于高级编程语言中的一种。它是一种通用、面向对象、解释型编程语言。Pytho
    的头像 发表于 11-22 14:31 675次阅读

    什么是C语言?单片机有什么特点?为什么要用C语言编程

    随着技术的发展,电子产品越来越多,方便了我们的日常生活,大多数电子产品上都有单片机,而单片机是通过执行软件逻辑来实现功能的。而单片机编程最合适的编程语言是汇编语言,但是最常用、最普及的
    的头像 发表于 11-21 10:06 761次阅读
    什么是C<b class='flag-5'>语言</b>?单片机有什么特点?为什么要用C<b class='flag-5'>语言</b><b class='flag-5'>编程</b>?

    基于Rust开发的编程语言

    Move 是一门由 Rust 语言开发的一门面向资产的编程语言,最早由 Facebook (现 Meta )投入大量的人力物力开发,用于 Libra (现 Dime )项目,处理全球性大规模支付系统的
    的头像 发表于 11-17 12:30 375次阅读

    浅谈PLC 5种标准的编程语言

    IEC 1131-3的编程语言是IEC工作组 对世界范围的PLC厂家的编程语言合理地吸收、借鉴的基础上形成的一套针对工业控制系统的国际编程
    发表于 11-15 11:14 426次阅读
    浅谈PLC 5种标准的<b class='flag-5'>编程</b><b class='flag-5'>语言</b>

    五种支持plc编程语言有哪些

    在PLC控制系统设计中,不同型号的PLC编程软件对以上五种编程语言的支持种类是不同的,所以不但对PLC的硬件性能了解外,也要了解PLC对编程语言
    发表于 08-31 14:54 704次阅读
    五种支持plc<b class='flag-5'>编程</b>的<b class='flag-5'>语言</b>有哪些

    51单片机编程开发之C语言基础二

    和我们平时说话使用的语言一样,任何编程语言都有它的语法要求,正所谓无规矩不成方圆,一门语言有了完善的规则才能成为一种可推广的语言。上一篇内容
    发表于 07-28 15:43 267次阅读
    51单片机<b class='flag-5'>编程</b>开发之C<b class='flag-5'>语言</b>基础二

    59.Github 被黑了?No Access?Why?

    GitHub
    充八万
    发布于 :2023年07月11日 23:15:16

    PLC编程语言的特点

    PLC的编程语言与一般计算机语言相比,具有明显的特点,它既不同于高级语言,也不同与一般的汇编语言,它既要满足易于编写,又要满足易于调试的要求
    的头像 发表于 07-04 17:13 607次阅读

    西门子PLC编程语言介绍

    PLC目前有5种标准的编程语言,包括图形化编程语言和文本化编程语言
    发表于 06-29 16:00 983次阅读
    西门子PLC<b class='flag-5'>编程</b><b class='flag-5'>语言</b>介绍

    基于PASCAL的高级编程语言——SCL编程语言

    根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST
    发表于 06-20 10:20 1123次阅读
    基于PASCAL的高级<b class='flag-5'>编程</b><b class='flag-5'>语言</b>——SCL<b class='flag-5'>编程</b><b class='flag-5'>语言</b>