何燁辛,谷 林,孫 晨
(1.西安工程大學 計算機科學學院,陜西 西安 710048;2.西安科技大學 管理學院,陜西 西安 710054)
在互聯(lián)網(wǎng)飛速發(fā)展與數(shù)據(jù)大爆炸的時代,海量的數(shù)據(jù)如何有效地進行特征提取是自然語言處理領域一個重要的研究方向。在自然語言處理領域和人工智能領域中,高效地實現(xiàn)人與計算機之間用自然語言進行有效通信的各種理論和方法是現(xiàn)今學者們廣泛研究的內(nèi)容。在計算機學科相關教育教學中,編譯錯誤信息是衡量學生代碼正確性和代碼質(zhì)量的一個重要指標,而編譯錯誤信息特征的提取不僅可以有效地進行特征的聚類與分類等研究,還可以為計算機學科的教育教學中學生編程問題提供針對性的指導,從而提高學生的編程效率,提升編程興趣。在文本特征提取中,目前已有的特征提取方法包含詞袋模型[1-3]、信息增益(information gain,IG)[4-5]、詞頻-逆向文件頻率模型[6-9](term frequency-inverse document frequency,TF-IDF)以及word2vec文本特征提取[10-11]等相關方法。文獻[12]提出了一種方法用來解決從英語和意大利語文本中以無監(jiān)督的方式提取關鍵詞或短語的問題。這種方法的主要特征是由兩種方法集成,單詞嵌入模型(例如word2vec或GloVe能夠捕獲單詞及其上下文的語義)和聚類算法(能夠識別術語的本質(zhì))并選擇較重要的一個或多個來表示文本的內(nèi)容以更優(yōu)的方式實現(xiàn)英語和意大利語關鍵詞或短語提取。文獻[13]使用word2vec將單詞表示為矢量形式的模型計算英語單詞之間的相似度。使用英語維基百科中的320 000條文章作為語料庫,利用余弦相似度計算方法確定相似度值。然后,該模型通過測試集黃金標準WordSim-353(多達353對單詞)和SimLex-999(多達999對單詞)進行測試,并根據(jù)人類判斷將它們標記為相似值。皮爾遜相關性用于找出相關性的準確性。文獻[14]使用word2vec模型進行短文本的詞向量生成,使用該方法的前提是忽略不同詞性的詞語對短文本的影響力,引入詞性改進特征權重計算方法,將詞性對文本分類的貢獻度嵌入到傳統(tǒng)的TF-IDF算法中計算短文本中詞的權重,并結(jié)合word2vec詞向量生成短文本向量,最后利用SVM實現(xiàn)短文本分類。文獻[15]利用詞間向量余弦的相似性構(gòu)造了一種迭代算法來識別相似詞。算法利用種子情感詞在通用的漢語情感詞匯(DSL、NSL和HSL)中,自動生成新的替代情感詞。最后,情感詞自動從備選詞中選擇相似情感詞的詞匯比較和統(tǒng)計分析方法,利用word2vec自動構(gòu)建用于教育目的特定領域的漢語情感詞典;文獻[16]尋求通過將無監(jiān)督的深度神經(jīng)網(wǎng)絡技術與詞嵌入方法相集成來提高ATS的質(zhì)量。首先,開發(fā)了基于單詞嵌入的文本摘要,并且展示了word2vec表示比傳統(tǒng)的BOW表示提供了更好的結(jié)果。其次,結(jié)合word2vec和無監(jiān)督特征學習方法提出其他模型,以合并來自不同來源的信息。文獻[11]是使用維基百科語料庫,通過word2vec訓練得到相應的詞模型,然后加權分配模型中的詞向量與對應詞的TF-IDF值,建立了對應的短文本特征表達方法。
根據(jù)上述研究,目前基于word2vec文本特征提取方法的研究立足不同視角,涉足多個方面,國內(nèi)外學者使用基于word2vec詞向量模型的應用十分廣泛,而對于編譯錯誤信息文本數(shù)據(jù)的研究目前仍比較少。該文主要是針對Java程序的編譯錯誤信息,希望能夠提取該序列主要成分,即編譯錯誤信息特征。相對于單一使用word2vec詞向量表示模型,word2vec和卷積神經(jīng)網(wǎng)絡相結(jié)合的模型可以增強數(shù)據(jù)的精度,增大數(shù)據(jù)的處理量,更好地表示編譯錯誤信息特征向量。因此該文主要使用的方法是結(jié)合word2vec工具中的skip-gram模型與CNN神經(jīng)網(wǎng)絡,以無監(jiān)督學習的方式從大量編譯錯誤信息中學習語義信息,達到編譯錯誤特征提取的目的。
該文構(gòu)建了一種適用于編譯錯誤信息的特征化表示方法,運用word2vec和CNN神經(jīng)網(wǎng)絡相結(jié)合的方法提取編譯器錯誤信息的語義特征,最終形成編譯錯誤信息空間向量模型的特征化表示。具體流程如圖1所示。
圖1 編譯錯誤信息特征提取流程
機器學習相關算法中實現(xiàn)計算機與人之間利用自然語言進行通信的首要任務是用數(shù)學數(shù)字表示文本特征,最常見的表示方式為使用詞向量來表示某個詞語。在現(xiàn)今的研究中,利用神經(jīng)網(wǎng)絡模型訓練大量的數(shù)據(jù)是獲得詞向量表示的主要方法,神經(jīng)網(wǎng)絡模型表示詞向量的基本思想不但可以包含詞間的潛在語義關系,同時可以高效地避免維數(shù)災難。word2vec最先是由Mikolov在2013年提出的[17],是一種基于淺層神經(jīng)的詞向量生成模型。該模型的主要作用是求得低維度的詞向量,并對相關數(shù)據(jù)詞語與上下文語義之間關系進行建模。該方法得出的詞向量的維度一般處于100~300之間,可以更好地解決傳統(tǒng)空間向量模型高維稀疏的問題。近年來,word2vec被廣泛應用到文本特征提取工作中。word2vec主要包含兩個模型:跳字模型(skip-gram)和連續(xù)詞袋模型(continuous bag of words,CBOW)。skip-gram是給定input word來預測上下文,而CBOW是給定上下文來預測input word。
CBOW模型包括輸入層、投影層和輸出層。假設以(context(w),w)為例,context(w)構(gòu)成是由w前后各x個詞。其中輸入層中的詞向量涵蓋context(w)中2x個詞v(context(w)1),v(context(w)2),…,v(context(w)2x);投影層是求和累加輸入層中的2x個向量,如公式(1)。其技術原理如圖2(a)所示。
(1)
skip-gram模型包括三層,分別為輸入層、投影層和輸出層。其中,輸入層輸入當前特征詞,詞的詞向量Wt∈Rm;輸出為該特征詞上下文窗口中詞出現(xiàn)的概率;投影層的目的是使目標函數(shù)L值最大化。假定有一組詞序列ω1,ω2,…,ωN,則:
(2)
其中,N為詞序列的長度;c為當前特征詞的上下文長度;p(ωj+1|ωj)為在已知當前詞ωj出現(xiàn)的概率下,其上下文特征詞ωj+1出現(xiàn)的概率。通過skip-gram模型訓練得到的全部詞向量,組成詞向量矩陣X∈Rmn。以xi∈Rm表示特征詞i在m維空間中的詞向量[18]。其技術原理如圖2(b)所示。
(a)
(b)
該文將采用word2vec工具中的skip-gram模型進行編譯錯誤信息文本詞向量生成的相關訓練。主要是利用Hierarchical Softmax構(gòu)造的一棵Huffman樹作為word2vec模型的輸出層訓練詞向量。其具體流程如下所示:
步驟1:取詞完成。采用分詞-滑動窗口的方式進行取詞,如圖3所示。
圖3 分詞-滑動窗口取詞
步驟2:構(gòu)造編譯錯誤信息詞典并統(tǒng)計詞頻。
步驟3:構(gòu)造樹形結(jié)構(gòu)。核心技術是Hierarchical Softmax構(gòu)造的一棵Huffman樹;生成節(jié)點并初始化各非葉節(jié)點的中間向量和葉節(jié)點的詞向量,如圖4所示。
圖4 Huffman樹結(jié)構(gòu)圖
步驟4:訓練中間向量和詞向量。
卷積神經(jīng)網(wǎng)絡(convolutional neural network,CNN)是一種多層神經(jīng)網(wǎng)絡。其構(gòu)建主要是模仿生物的視知覺,可用來進行監(jiān)督學習和非監(jiān)督學習,是深度學習的代表算法之一。卷積神經(jīng)網(wǎng)絡隱含層內(nèi)的卷積核參數(shù)共享和層間連接的稀疏性使得卷積神經(jīng)網(wǎng)絡能夠以較小的計算量對格點化(grid-like topology)特征。該神經(jīng)網(wǎng)絡模型包含3層結(jié)構(gòu),分別為輸入層、卷積層和“池化+連接層”,如圖5所示。
1.2.1 輸入層
輸入層又稱數(shù)據(jù)輸入層,主要是對原始數(shù)據(jù)進行預處理;其中包括去均值、歸一化和PCA降維。
該文利用word2vec工具的skip-gram模型訓練編譯錯誤信息語料庫中的數(shù)據(jù),生成對應詞向量。則輸入層輸入的數(shù)據(jù)為編譯錯誤信息序列中各個詞匯對應的詞向量,是一個表示編譯錯誤信息句子的矩陣,如公式(3)所示。其維度為m×n,其中每個詞是由一個n維的詞向量進行表示。
(3)
圖5 卷積神經(jīng)網(wǎng)絡結(jié)構(gòu)
1.2.2 卷積層
卷積層是卷積神經(jīng)網(wǎng)絡最重要的一個層次,主要有兩個關鍵的操作,分別是局部關聯(lián)和窗口滑動。
在卷積層中輸入的是公式(3)所示的維度為m×n的矩陣,用來表示編譯錯誤信息句子矩陣。在卷積層進行卷積操作時,卷積核的寬度的選取與詞向量的維度保持一致,這樣的方式可以保證卷積核在每次滑動過的位置是一個完整的詞向量。
卷積計算如公式(4)所示:
yi=f(∑wi·xi:i+h-1+b)
(4)
其中,wi表示為卷積核的權重矩陣,xi:i+h-1表示第i行到i+h-1行的詞向量矩陣,b表示偏置,函數(shù)f表示激活函數(shù)。
當編譯錯誤信息經(jīng)過卷積相關操作后,最終可以得到一個n-h+1維的向量y,如公式(5)所示。
y=[y1,y2,…,yn-h+1]
(5)
1.2.3 池化+連接層
池化是存在于連續(xù)的卷積層中間的,主要作用是用于數(shù)據(jù)和參數(shù)量的壓縮,充分減少過擬合現(xiàn)象,更方便優(yōu)化。連接層是所有的神經(jīng)元的權重連接,通常是處于卷積神經(jīng)網(wǎng)絡的尾部進行。
卷積層之后,通常需要在CNN之間添加池化。池化的主要作用是不斷降低維數(shù),減少CNN神經(jīng)網(wǎng)絡中的參數(shù)和計算次數(shù)。極大地縮短了訓練時間并控制過度擬合。目前最常見的池類型是最大池化(max pooling),它在每個窗口中占用最大值。將卷積層輸出的編譯錯誤信息特征向量中提取最大值表示為最重要的編譯錯誤信息特征,相同卷積核卷積池化后的標量組合得到這個窗口大小的特征向量,將所有窗口下的特征向量進行連接層的連接,最終組合成為完整的編譯錯誤信息的特征向量。
SVM(support vector machine),又稱支持向量機,是二分類模型中的一種。它的主要原理是定義在特征空間上的間隔最大的線性分類器。是一種基于統(tǒng)計學習理論的機器學習方法,由貝爾實驗室中的Vapnik首次提出。支持向量機學習的主要目的就是用于尋找類別間隔最大化的分類邊界,最終將所求解問題轉(zhuǎn)化為一個凸二次規(guī)劃問題并進行求解。其步驟如下:
(1)將數(shù)據(jù)轉(zhuǎn)為支持向量機包的格式;
(2)對數(shù)據(jù)進行歸一化處理;
(3)優(yōu)先選擇徑向基核函數(shù);
(4)通過交叉驗證尋找最佳函數(shù);
(5)使用最佳參數(shù)訓練編譯錯誤信息數(shù)據(jù)。
結(jié)果評定可以直觀地證明方法使用的準確性。該文采用文本分類技術中經(jīng)常使用的評價指標作為實驗結(jié)果評定的依據(jù)。為了驗證模型的編譯錯誤信息特征提取效果,針對結(jié)果的測評,該文引入以下三個指標對分類器的結(jié)果進行評價,分別為準確率、召回率和F1-Score值,其中F1-Score值是準確率和召回率的綜合指標,如式(6)、(7)所示。
(1)準確率(precision)。
(6)
(2)召回率(recall)。
(7)
(3)F1-Score值。
(8)
其中,TP(cj)表示應為cj的樣本且被正確分成cj類的樣本數(shù);FN(cj)表示應為cj類的樣本沒有被正確分成cj類的樣本數(shù);FP(cj)表示不為cj類的樣本但被分為cj類的樣本數(shù)。
2.1.1 數(shù)據(jù)來源
該文采用某校2018級軟件工程系四個班級共151名學生《面向?qū)ο蟪绦蛟O計課程》學習期間所提交的Java編程作業(yè),主要選取的是在實現(xiàn)單一方法時學生編寫Java代碼的短片段所遇到的相關錯誤提示。將Java編譯錯誤信息分為三類,分別為語法錯誤、語義錯誤和邏輯錯誤。語法錯誤是指程序中單詞的拼寫,標點和順序等錯誤。語義錯誤是處理代碼的含義,是由錯誤的編程語言解釋方式導致的錯誤。這些類型的錯誤大多數(shù)是Java和類似語言所特有的,但是比語法錯誤更抽象。邏輯錯誤一般是指編程過程中發(fā)生導致偏離程序本身意思的錯誤,程序可以通過編譯并成功運行,但是運行結(jié)果與期望值不符。編譯錯誤信息語料庫中有錯誤信息652條,其中訓練集文本數(shù)520條,測試集文本數(shù)132條。
2.1.2 數(shù)據(jù)預處理
在實驗開始之前,首先需要對數(shù)據(jù)進行降噪處理。需要刪除編譯錯誤信息文本數(shù)據(jù)中的標點符號和一些無意義的常用詞,在編譯錯誤信息中利用正則表達式讀取無意義常用詞和數(shù)字并剔除它,同時將符號利用正則表達式替換為一個空格,用空格將數(shù)據(jù)進行分割。
實驗中利用機器學習的支持向量機(SVM)算法將編譯錯誤信息特征進行分類實驗,測評結(jié)果采用所有類別的平均值進行展示。實驗結(jié)果如表1所示。使用word2vec結(jié)合CNN的方法可以大大減少直接對文本向量化而出現(xiàn)部分編譯錯誤文本特征丟失,從而降低編譯錯誤信息文本分類的準確性。相較單一使用word2vec進行編譯錯誤信息特征提取的方法,word2vec與CNN相結(jié)合的方法對編譯錯誤信息特征表示的效果顯著提升。
表1 實驗結(jié)果 %
該文提出了一種基于word2vec與CNN神經(jīng)網(wǎng)絡相結(jié)合的編譯錯誤信息特征提取的方法。為了更全面且準確地使用向量表示編譯錯誤信息,采用word2vec工具中skip-gram模型對編譯錯誤信息文本進行低維的詞向量表示,然后結(jié)合卷積神經(jīng)網(wǎng)絡提取編譯錯誤信息文本中最重要的特征表示,在池化+連接池層中組合成完整的編譯錯誤信息特征表示。最后經(jīng)過相關實驗,通過SVM分類方法將word2vec模型和word2vec+CNN模型進行結(jié)果比對。結(jié)果表明word2vec+CNN方法能較好地適用于編譯錯誤信息特征提取。下一步將針對該模型進一步進行優(yōu)化,以提高編譯錯誤信息特征提取的準確性,更好地得到編譯錯誤信息的有效分類。