當前位置:
首頁 > 新聞 > 「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

1新智元編譯

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

編程語言是軟體開發的主要工具。自20世紀40年代以來,已經有數百種語言被發明出來,每天,大量的各種語言編寫的代碼活躍著代碼庫。

我們認為,如果有一個源代碼分類器,可以識別一段代碼是用哪種語言編寫的,這將會是非常有用的工具,可以用於在 StackOverflow 和技術類維基百科之類的平台上自動進行語法高亮顯示和標籤建議。這激勵我們利用最新的用於文本分類的AI技術,訓練一個模型來基於編程語言對代碼片段進行分類。

我們從 GitHub 代碼庫收集了數十萬個源代碼文件。在訓練模型之前,必須對原始數據進行處理以消除或減少代碼中一些不需要的特徵。最終訓練好的分類器效果非常好,本文末提供了結果,以及對於模型的決策的一些解釋。

數據:Github最受歡迎的49種語言

編程語言的選擇依據是它們的突出性。圖1顯示了2014年第四季度GitHub上最常用的49種語言[1]。其中,JavaScript 是使用最多的語言,其次是 Java,第三是 Python。這個分析僅考慮活躍代碼庫,即在這期間至少有一次代碼推送的存儲庫。我們將 HTML 和 XML 添加到列表中,儘管人們可能不認為它們是編程語言,但它們仍然與軟體開發項目相關。同樣的原因,我們也添加了SQL。

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

圖1:GitHub最受歡迎的49種語言

我們使用 GitHub API 來檢索特定語言的代碼倉庫。下圖顯示了經過幾天爬行後的數據形狀。我們檢查了數千個代碼倉庫,但是忽略了大小超過100mb的倉庫,以避免在下載和預處理上花費太多時間。我們使用文件擴展名來標記每個樣本的編程語言(例如,file.php 是一個 PHP 源文件)。我們發現,C#是擁有最多源代碼的語言,而 Arduino 在我們爬行的資源中是最少的。為了避免訓練集不平衡,我們每一類語言最多使用10000個樣本。

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

混合的源代碼

仔細看原始數據,我們發現一些具有挑戰性的行為和特徵,這並不算意外,因為這些數據是從實際的任意代碼倉庫中拿出的。最常見的是單個文件中有多重語言混合,這在 web 應用中最常出現,例如 JavaScript,HTML,CSS,PHP 和 ASP。下面是一個從.asp源文件中提取的ASP代碼片段,可以看到語言混合的情況。

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

圖:混合的語言

在我們的case中,我們希望為每個文檔只分配一個類。因此,在單個源代碼文件使用多種語言的情況下,我們只想保留該文件的主要語言(由其擴展名推斷)的代碼片段,並刪除其他所有內容。為此,我們為每種語言使用已知的保留字(reserved words)和表達式。例如,我們知道<%php and %>之間的所有內容都是php代碼,所以如果是.php文件,我們只保留這些內容,並刪除其他所有內容。以同樣的方式,可以使用正則表達式或 Python 中的內置解析器從代碼中刪除 HTML 標籤。

這些文檔中的另一個常見特徵是嵌入式代碼片段( embedded code snippets)。例如,在下面的 JavaScript 腳本中,引號之間有一個嵌入的 C 代碼片段。這是另一種非常常見的混合代碼。我們通過用佔位符替換引號之間的所有內容來減輕這個問題(在這個case,我們使用 strv 作為佔位符)。

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

圖:JavaScript代碼片段中有「隱藏」的C代碼嵌入

標記化(Tokenization)

在預處理步驟(包括轉義換行符和標記字元)之後,我們需要對所有文本進行標記。在這個步驟中,保留所有代碼語法信息非常重要。我們使用 [w"]+|[""!"#$%&"()*+,-./:;<=>?@[]^_`{|}~""\] 正則表達式提取token。在這個步驟之後,數據就為進行訓練做好準備了。

Python

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

Tokenized

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

Pre-processed

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

模型

最近,卷積神經網路(CNN)越來越受到各種NLP任務的歡迎。特別是在文本分類任務中,深度學習模型取得了顯著的成果[2,3]。我們的模型使用一個 word embedding 層,後面跟一個有多個filter的卷積層,然後是一個max-pooling層,最後是一個softmax層(圖3)。我們使用一個非晶態、隨機初始化的嵌入層,因此是從頭開始訓練向量。

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

Figure 3 – CNN模型架構 (來源[2])

結果

我們對10%的數據進行了測試,並計算每個標籤的準確性(accuracy),精度(precision), recall 和 f1-score。 accuracy, precision, recall 和 f1-score 的總體結果分別是97%,96%,96%和96%。每個標籤的得分也相當高(圖3)。

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

圖:每一類的結果

放大看看:

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

結果看起來不錯,但是讓我們來看一下預測解釋來檢查分類器是如何做出決定的。我們使用LIME生成「explanations」,高亮與每個標籤最相關的詞。這樣,我們可以知道為什麼模型選擇某一個標籤而不是另一個。

一個 Scala 代碼片段:

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

解釋

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

一個 Java 代碼片段:

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

解釋

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

一個 OCaml 代碼片段:

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

解釋

「深度學習Github 10萬+源代碼分析」Python是第三受歡迎語言

未來的研究方向

雖然這個分類器的表現非常好,但仍有改進結果的方法。例如,嘗試直接從 character 學習而不需要 word embedding 層的 character-level 模型[4]。此外,可以獲得每種編程語言的版本數據,以便可以將特定版本分配給源代碼片段。

References:

1.Githut – http://githut.info/

2.Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP 2014), 1746–1751.

3.Wang, P., Xu, J., Xu, B., Liu, C., Zhang, H., Wang, F., & Hao, H. (2015). Semantic Clustering and Convolutional Neural Network for Short Text Categorization. Proceedings ACL 2015, 352–357.

4.Zhang, X., Zhao, J., & LeCun, Y. (2015). Character-level Convolutional Networks for Text Classification, 1–9.

原文:http://blog.aylien.com/source-code-classification-using-deep-learning/

點擊閱讀原文可查看職位詳情,期待你的加入~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

普京:領導AI者將統領世界,未來戰爭派無人機上場即可
麥肯錫3000高管調查:要想利用AI取得成功,你需要知道這10個秘訣
「57行代碼搞定8600萬美元項目」用開源工具DIY車牌識別系統
「業界」基於騰訊Angel的LDA*入選VLDB,超越微軟LightLDA
「AI引爆智能投資革命」十大AI領袖與金融專家演講乾貨大放送

TAG:新智元 |