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

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

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

    关注

    10

    文章

    1936

    浏览量

    34564
  • 人工智能
    +关注

    关注

    1791

    文章

    46734

    浏览量

    237254
  • GitHub
    +关注

    关注

    3

    文章

    466

    浏览量

    16366

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

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

收藏 人收藏

    评论

    相关推荐

    编程语言的误区与常见问题

    : 选择编程语言时,应考虑项目需求、个人兴趣以及语言的适用性。例如,如果你对Web开发感兴趣,那么学习JavaScript可能是一个好选择。 认识到没有一
    的头像 发表于 11-15 09:35 67次阅读

    MCU编程语言和开发环境介绍

    MCU编程语言 MCU编程语言是用于编写MCU程序的高级编程语言,它们使得开发者能够更高效地开
    的头像 发表于 11-01 11:51 401次阅读

    C语言与其他编程语言的比较

    C语言作为一历史悠久的编程语言,自其诞生以来,一直在软件开发领域扮演着重要角色。它以其高效、灵活和可移植性强的特点,成为了系统级编程的首选
    的头像 发表于 10-29 17:30 155次阅读

    plc的编程语言主要有哪三

    PLC(可编程逻辑控制器)的编程语言多种多样,但其中最为常用和广泛认知的三主要编程语言是梯形图
    的头像 发表于 10-21 17:04 556次阅读

    GitHub推出GitHub Models服务,赋能开发者智能选择AI模型

    8月2日,全球领先的代码托管平台GitHub宣布了一项重大创新——GitHub Models服务的正式推出。该服务被定位为AI时代的工程师助手,旨在帮助全球超过1亿的
    的头像 发表于 08-02 15:39 508次阅读

    abb工业机器人的编程语言是什么

    ABB工业机器人的编程语言主要是RAPID(Robot Application Programming Interface for Development),它是一高级编程
    的头像 发表于 06-16 16:49 2286次阅读

    PLC编程语言和C语言的区别

    在工业自动化和计算机编程领域中,PLC(可编程逻辑控制器)编程语言和C语言各自扮演着重要的角色。尽管两者都是
    的头像 发表于 06-14 17:11 2388次阅读

    fpga三编程语言

    FPGA(现场可编程门阵列)的编程涉及到三主要的硬件描述语言(HDL):VHDL(VHSIC Hardware Description Language)、Verilog以及Syst
    的头像 发表于 03-15 14:36 1004次阅读

    fpga芯片用什么编程语言

    FPGA芯片主要使用的编程语言包括Verilog HDL和VHDL。这两语言都是硬件描述语言,用于描述数字系统的结构和行为。
    的头像 发表于 03-14 16:07 1429次阅读

    编程语言之间的区别和联系

    编程语言是一人与计算机之间进行交流的方式,不同的编程语言有着不同的特点和用途。本文将对四常见
    的头像 发表于 02-05 14:16 1405次阅读

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

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

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

    2023 年,Python 仍然是使用 GitHub 的开发者中最受欢迎的选择之一,占据了几乎 18% 的份额,在所有编程语言中保持领先地位,连续第四年增长 0.5%,巩固了其作为最受欢迎语言
    的头像 发表于 12-18 14:51 2860次阅读
    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 6次下载

    脚本语言编程语言的区别

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

    Python编程语言属于什么语言

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