0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GitHub上現(xiàn)在托管有超過(guò)300種編程語(yǔ)言

DPVg_AI_era ? 來(lái)源:lq ? 2019-07-07 07:34 ? 次閱讀

OctoLingua的目標(biāo)是提供一種服務(wù),支持從多個(gè)粒度級(jí)別(從文件級(jí)別或片段級(jí)別到潛在的行級(jí)語(yǔ)言檢測(cè)和分類)進(jìn)行強(qiáng)大可靠的語(yǔ)言檢測(cè)。最終,該服務(wù)可以支持代碼搜索和共享、語(yǔ)法高亮顯示和差異渲染等,旨在支持開(kāi)發(fā)人員進(jìn)行日常開(kāi)發(fā)工作,同時(shí)幫助編寫高質(zhì)量的代碼。

GitHub上現(xiàn)在托管有超過(guò)300種編程語(yǔ)言。從最廣泛使用的語(yǔ)言比如Python,Java、Javascript等,到一些非常非常小眾的語(yǔ)言例如Befunge,應(yīng)有盡有。

但豐富的語(yǔ)種帶來(lái)的一個(gè)挑戰(zhàn)就是,如何即時(shí)鑒別它們?這影響到如何更好的搜索、發(fā)現(xiàn)其中的安全漏洞或者采取什么樣的語(yǔ)法高亮。

而且編程語(yǔ)言識(shí)別起來(lái),看似簡(jiǎn)單實(shí)則非常困難。文件擴(kuò)展名是一個(gè)非常重要的區(qū)分標(biāo)準(zhǔn),但很多時(shí)候非?;靵y。比如“.pl”, “.pm”, “.t”, “.pod”,都跟Perl有關(guān)系;而“.h”,C、C++、Objective-C也都有在用。

甚至還會(huì)出現(xiàn)沒(méi)有擴(kuò)展名的情況,例如一些可執(zhí)行腳本(curl,get,makefile等)。

Linguist已經(jīng)可以完成84%的語(yǔ)言檢測(cè)

那么GitHub是怎么解決上述問(wèn)題呢?GitHub高級(jí)數(shù)據(jù)科學(xué)家Kavita Ganesan首先介紹了目前GitHub官方使用的語(yǔ)言鑒別工具:Linguist。

Linguist是一個(gè)基于Ruby的應(yīng)用程序,它使用多種策略進(jìn)行語(yǔ)言檢測(cè)。比如利用命名約定和文件擴(kuò)展名,考慮Vim或Emacs模型,以及文件頂部的內(nèi)容(shebang)等。

Linguist通過(guò)啟發(fā)式方法,通過(guò)一個(gè)小樣本數(shù)據(jù)訓(xùn)練的樸素貝葉斯分類器來(lái)進(jìn)行語(yǔ)言消歧義。

雖然Linguist在文件級(jí)語(yǔ)言預(yù)測(cè)方面做得很好(準(zhǔn)確率為84%),但是當(dāng)文件使用非常特殊的命名約定時(shí),準(zhǔn)確率就大幅下降了。更重要的是,當(dāng)遇到?jīng)]有提供文件擴(kuò)展名的情況比如Gist、README文件、issue或者拉取請(qǐng)求中的代碼片段,Linguist就無(wú)能為力了。

人工智能幫助完成剩下的語(yǔ)言檢測(cè)工作

為了使語(yǔ)言檢測(cè)能夠更加健壯和可維護(hù),GitHub又開(kāi)發(fā)了一款名為OctoLingua的機(jī)器學(xué)習(xí)分類器,它基于人工神經(jīng)網(wǎng)絡(luò)(ANN)架構(gòu),可以處理棘手場(chǎng)景中的語(yǔ)言預(yù)測(cè)。

該模型的當(dāng)前版本能夠?qū)itHub托管的前50種語(yǔ)言進(jìn)行預(yù)測(cè),并在準(zhǔn)確性和性能方面超越Linguist。

OctoLingua從頭開(kāi)始使用Python + Keras,以及TensorFlow后端進(jìn)行構(gòu)建,非常準(zhǔn)確、健壯且易于維護(hù)。

數(shù)據(jù)源

OctoLingua的當(dāng)前版本使用了從Rosetta Code檢索的文件和內(nèi)部眾包的一組質(zhì)量庫(kù)的訓(xùn)練。語(yǔ)言集限制為GitHub上托管的Top 50。

Rosetta Code是一個(gè)出色的入門數(shù)據(jù)集,因?yàn)樗貌煌幊陶Z(yǔ)言表示的相同任務(wù)的源碼。例如,生成Fibonacci序列的任務(wù)可以用C、C ++、CoffeeScript、D、Java、Julia等表示。

但是,跨語(yǔ)言的覆蓋范圍并不統(tǒng)一,其中某些語(yǔ)言只有少量文件而某些文件的填充程度過(guò)于稀疏。因此,需要增加一些額外來(lái)源的訓(xùn)練集,以提高語(yǔ)言覆蓋率和性能。

目前添加新語(yǔ)言的流程現(xiàn)已完全自動(dòng)化,以編程方式從GitHub上的公共倉(cāng)庫(kù)收集源碼。選擇滿足最低資格標(biāo)準(zhǔn)的倉(cāng)庫(kù),例如具有最小數(shù)量的分支,以及涵蓋目標(biāo)語(yǔ)言和涵蓋特定文件擴(kuò)展名。

對(duì)于此階段的數(shù)據(jù)收集,使用Linguist的分類確定倉(cāng)庫(kù)的主要語(yǔ)言。

特點(diǎn):利用先驗(yàn)知識(shí)

傳統(tǒng)上,對(duì)于神經(jīng)網(wǎng)絡(luò)的文本分類問(wèn)題,通常采用基于存儲(chǔ)器的體系結(jié)構(gòu),例如遞歸神經(jīng)網(wǎng)絡(luò)(RNN)和長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)。

但是,鑒于編程語(yǔ)言在詞匯、評(píng)論風(fēng)格、文件擴(kuò)展名、結(jié)構(gòu)、庫(kù)導(dǎo)入風(fēng)格和其他微小差異,GitHub選擇了一種更簡(jiǎn)單的方法:通過(guò)以表格形式提取某些相關(guān)功能來(lái)利用所有這些信息,并投喂給分類器。目前提取的功能如下:

每個(gè)文件的前五個(gè)特殊字符

每個(gè)文件前20個(gè)令牌

文件擴(kuò)展名

存在源碼文件中常用的某些特殊字符如冒號(hào)、花括號(hào)和分號(hào)

人工神經(jīng)網(wǎng)絡(luò)(ANN)模型

上述特征作為使用具有Tensorflow后端的Keras構(gòu)建的雙層人工神經(jīng)網(wǎng)絡(luò)的輸入。

下圖顯示特征提取步驟為分類器生成n維表格輸入。當(dāng)信息沿著網(wǎng)絡(luò)層移動(dòng)時(shí),它通過(guò)dropout正則化并最終產(chǎn)生51維輸出,該輸出表示給定代碼在前50種GitHub語(yǔ)言中每一種寫入的預(yù)測(cè)概率加不寫入的概率。

GitHub使用90%的數(shù)據(jù)集進(jìn)行大約8個(gè)epochs的訓(xùn)練。此外,在訓(xùn)練步驟中從訓(xùn)練數(shù)據(jù)中刪除了一定百分比的文件擴(kuò)展名,以鼓勵(lì)模型從文件的詞匯表中學(xué)習(xí),而不是過(guò)度填充文件擴(kuò)展功能。

基準(zhǔn)

下圖顯示了在同一測(cè)試集上計(jì)算的OctoLingua和Linguist的F1得分(精確度和召回之間的調(diào)和平均值)。

這里展示三個(gè)測(cè)試。第一個(gè)是測(cè)試集不受任何干預(yù);第二個(gè)測(cè)試使用同一組測(cè)試文件,刪除了文件擴(kuò)展名信息;第三個(gè)測(cè)試也使用相同的文件集,但這次文件擴(kuò)展名被加擾,以便混淆分類器(例如,Java文件可能有“.txt”擴(kuò)展名、Python文件可能具有“.java”)擴(kuò)展名。

在測(cè)試集中加擾或刪除文件擴(kuò)展名的目的是評(píng)估OctoLingua在刪除關(guān)鍵功能或誤導(dǎo)時(shí)對(duì)文件進(jìn)行分類的穩(wěn)健性。不嚴(yán)重依賴擴(kuò)展的分類器對(duì)要點(diǎn)和片段進(jìn)行分類非常有用,因?yàn)樵谶@些情況下,人們通常不提供準(zhǔn)確的擴(kuò)展信息(例如,許多與代碼相關(guān)的文件具有.txt擴(kuò)展名)。

下表顯示了OctoLingua如何在各種條件下保持良好的性能,表明該模型主要從代碼的詞匯表中學(xué)習(xí),而不是從元信息(即文件擴(kuò)展名)中學(xué)習(xí)。但是沒(méi)有擴(kuò)展名的話Linguist完全無(wú)法鑒別。

上圖是OctoLingua與Linguist在同一測(cè)試集上的表現(xiàn)。

在訓(xùn)練期間刪除文件擴(kuò)展名的效果

如前所述,在訓(xùn)練期間,從訓(xùn)練數(shù)據(jù)中刪除了一定百分比的文件擴(kuò)展名,以鼓勵(lì)模型從文件的詞匯表中學(xué)習(xí)。下表顯示了模型在訓(xùn)練期間刪除了不同分?jǐn)?shù)的文件擴(kuò)展名的性能。

上圖在三個(gè)測(cè)試變體中刪除了不同百分比的文件擴(kuò)展名后,OctoLingua的表現(xiàn)

請(qǐng)注意,在訓(xùn)練期間沒(méi)有刪除文件擴(kuò)展名的情況下,OctoLingua對(duì)沒(méi)有擴(kuò)展名和隨機(jī)擴(kuò)展名的測(cè)試文件的性能與常規(guī)測(cè)試數(shù)據(jù)相比差距很大。而一旦在刪除某些文件擴(kuò)展名的數(shù)據(jù)集上訓(xùn)練模型時(shí),模型性能在修改的測(cè)試集上的差距就沒(méi)有那么大。

這證實(shí)了在訓(xùn)練時(shí)從一小部分文件中刪除文件擴(kuò)展名,會(huì)使分類器從詞匯表中學(xué)到更多。它還表明,文件擴(kuò)展功能雖然具有高度預(yù)測(cè)性,但卻傾向于支配并阻止將更多權(quán)重分配給內(nèi)容。

添加新語(yǔ)言支持

在OctoLingua中添加新語(yǔ)言非常簡(jiǎn)單。它首先獲取新語(yǔ)言的大量文件,這些文件分為訓(xùn)練和測(cè)試集,然后通過(guò)預(yù)處理器和特征提取器運(yùn)行。這個(gè)新的訓(xùn)練和測(cè)試裝置被添加到現(xiàn)有的訓(xùn)練和測(cè)試數(shù)據(jù)庫(kù)中。新的測(cè)試裝置允許驗(yàn)證模型的準(zhǔn)確性是否仍然可以接受。

上圖使用OctoLingua添加新語(yǔ)言、

未來(lái)計(jì)劃

截至目前,OctoLingua正處于“先進(jìn)的原型設(shè)計(jì)階段”。我們的語(yǔ)言分類引擎已經(jīng)強(qiáng)大且可靠,但還不支持我們平臺(tái)上的所有編碼語(yǔ)言。除了擴(kuò)大語(yǔ)言支持 - 這將是相當(dāng)簡(jiǎn)單的 - 我們的目標(biāo)是在各種粒度級(jí)別啟用語(yǔ)言檢測(cè)。我們當(dāng)前的實(shí)現(xiàn)已經(jīng)允許我們通過(guò)對(duì)機(jī)器學(xué)習(xí)引擎的一些小修改來(lái)對(duì)代碼片段進(jìn)行分類。將模型帶到可以可靠地檢測(cè)和分類嵌入式語(yǔ)言的階段并不是太遙遠(yuǎn)。

我們也在考慮開(kāi)源我們模型的可能性,如果您有興趣,我們很樂(lè)意聽(tīng)取社區(qū)的意見(jiàn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1916

    瀏覽量

    34382
  • 人工智能
    +關(guān)注

    關(guān)注

    1787

    文章

    46061

    瀏覽量

    235079
  • GitHub
    +關(guān)注

    關(guān)注

    3

    文章

    461

    瀏覽量

    16237

原文標(biāo)題:GitHub機(jī)器學(xué)習(xí)代碼分類器:僅憑代碼輕松鑒別300種編程語(yǔ)言

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    labview是什么編程語(yǔ)言寫的

    的一圖形化編程語(yǔ)言。它并不是用傳統(tǒng)的文本編程語(yǔ)言(如C++、Python等)編寫的,而是采用了一
    的頭像 發(fā)表于 09-04 16:00 ?150次閱讀

    GitHub推出GitHub Models服務(wù),賦能開(kāi)發(fā)者智能選擇AI模型

    8月2日,全球領(lǐng)先的代碼托管平臺(tái)GitHub宣布了一項(xiàng)重大創(chuàng)新——GitHub Models服務(wù)的正式推出。該服務(wù)被定位為AI時(shí)代的工程師助手,旨在幫助全球超過(guò)1億的
    的頭像 發(fā)表于 08-02 15:39 ?387次閱讀

    abb工業(yè)機(jī)器人的編程語(yǔ)言是什么

    ABB工業(yè)機(jī)器人的編程語(yǔ)言主要是RAPID(Robot Application Programming Interface for Development),它是一高級(jí)編程
    的頭像 發(fā)表于 06-16 16:49 ?1680次閱讀

    PLC編程語(yǔ)言和C語(yǔ)言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語(yǔ)言和C語(yǔ)言各自扮演著重要的角色。盡管兩者都是
    的頭像 發(fā)表于 06-14 17:11 ?1594次閱讀

    PLC常用編程語(yǔ)言有哪些

    在工業(yè)自動(dòng)化領(lǐng)域,PLC(Programmable Logic Controller,可編程邏輯控制器)作為一核心控制設(shè)備,其編程語(yǔ)言的選擇對(duì)于控制系統(tǒng)的設(shè)計(jì)、開(kāi)發(fā)和維護(hù)具有重要影響
    的頭像 發(fā)表于 06-14 16:58 ?726次閱讀

    fpga三編程語(yǔ)言

    FPGA(現(xiàn)場(chǎng)可編程門陣列)的編程涉及到三主要的硬件描述語(yǔ)言(HDL):VHDL(VHSIC Hardware Description Language)、Verilog以及Syst
    的頭像 發(fā)表于 03-15 14:36 ?802次閱讀

    fpga芯片用什么編程語(yǔ)言

    FPGA芯片主要使用的編程語(yǔ)言包括Verilog HDL和VHDL。這兩語(yǔ)言都是硬件描述語(yǔ)言,用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)和行為。
    的頭像 發(fā)表于 03-14 16:07 ?1297次閱讀

    plc編程語(yǔ)言與c語(yǔ)言的聯(lián)系 c語(yǔ)言和PLC有什么區(qū)別

    PLC編程語(yǔ)言與C語(yǔ)言的聯(lián)系 PLC(可編程邏輯控制器)是一針對(duì)自動(dòng)化控制系統(tǒng)的特殊計(jì)算機(jī)。PLC編程
    的頭像 發(fā)表于 02-05 14:21 ?3165次閱讀

    編程語(yǔ)言之間的區(qū)別和聯(lián)系

    編程語(yǔ)言是一人與計(jì)算機(jī)之間進(jìn)行交流的方式,不同的編程語(yǔ)言有著不同的特點(diǎn)和用途。本文將對(duì)四常見(jiàn)
    的頭像 發(fā)表于 02-05 14:16 ?1086次閱讀

    選擇云服務(wù)器租用托管有哪些優(yōu)勢(shì)?

    云服務(wù)器租用托管服務(wù)好嗎?選擇云服務(wù)器租用托管有哪些優(yōu)勢(shì)?關(guān)于云服務(wù)器租用托管的話題RAKsmart小編今天來(lái)為您做詳細(xì)的解答。
    的頭像 發(fā)表于 01-10 10:21 ?344次閱讀

    Python奪冠!GitHub 2023年度編程語(yǔ)言排行榜

    2023 年,Python 仍然是使用 GitHub 的開(kāi)發(fā)者中最受歡迎的選擇之一,占據(jù)了幾乎 18% 的份額,在所有編程語(yǔ)言中保持領(lǐng)先地位,連續(xù)第四年增長(zhǎng) 0.5%,鞏固了其作為最受歡迎語(yǔ)言
    的頭像 發(fā)表于 12-18 14:51 ?2721次閱讀
    Python奪冠!<b class='flag-5'>GitHub</b> 2023年度<b class='flag-5'>編程</b><b class='flag-5'>語(yǔ)言</b>排行榜

    GitHub入門與實(shí)踐

    GitHub 是一個(gè)基于 Git 版本控制系統(tǒng)的代碼托管平臺(tái),它提供了許多功能和用途,主要面向軟件開(kāi)發(fā)和協(xié)作。以下是 GitHub 的主要用途和一些關(guān)鍵技術(shù):GitHub 的主要用途:
    發(fā)表于 12-14 09:53 ?4次下載

    腳本語(yǔ)言編程語(yǔ)言的區(qū)別

    腳本語(yǔ)言編程語(yǔ)言是計(jì)算機(jī)語(yǔ)言的兩個(gè)主要分類。盡管兩者都是用于編寫計(jì)算機(jī)程序的工具,但它們?cè)谠O(shè)計(jì)和運(yùn)行方式存在一些顯著的區(qū)別。下面將詳細(xì)探
    的頭像 發(fā)表于 11-22 14:33 ?2523次閱讀

    Python編程語(yǔ)言屬于什么語(yǔ)言

    Python編程語(yǔ)言屬于高級(jí)編程語(yǔ)言中的一。它是一通用、面向?qū)ο?、解釋?/div>
    的頭像 發(fā)表于 11-22 14:31 ?1148次閱讀

    淺談PLC 5標(biāo)準(zhǔn)的編程語(yǔ)言

    IEC 1131-3的編程語(yǔ)言是IEC工作組 對(duì)世界范圍的PLC廠家的編程語(yǔ)言合理地吸收、借鑒的基礎(chǔ)形成的一套針對(duì)工業(yè)控制系統(tǒng)的國(guó)際
    發(fā)表于 11-15 11:14 ?672次閱讀
    淺談PLC 5<b class='flag-5'>種</b>標(biāo)準(zhǔn)的<b class='flag-5'>編程</b><b class='flag-5'>語(yǔ)言</b>