search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

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

1新智元編譯

作者:Robson Montenegro

編譯:劉小芹

【新智元導讀】編程語言是軟體開發的主要工具。自20世紀40年代以來,已經有數百種語言被發明出來,每天大量的各種語言編寫的代碼活躍著代碼庫。本文作者從 GitHub 代碼庫收集了數十萬個源代碼文件,並訓練深度學習模型對其進行分析。在GitHub最受歡迎的49種語言中,Python排名第三。

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

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

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

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

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

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

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

混合的源代碼

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

圖:混合的語言

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

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

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

標記化(Tokenization)

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

Python

Tokenized

Pre-processed

模型

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

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

結果

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

圖:每一類的結果

放大看看:

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

一個 Scala 代碼片段:

解釋

一個 Java 代碼片段:

解釋

一個 OCaml 代碼片段:

解釋

未來的研究方向

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

1. Githut –

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.



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦