張培園,姜 瑛
1.云南省計算機技術應用重點實驗室,昆明 650500
2.昆明理工大學 信息工程與自動化學院,昆明 650500
近年來,隨著用戶需求的不斷提高,軟件項目的代碼規模日益擴大,同時出現了大量的代碼托管平臺,例如Gitee 憑借其“高速、穩定、通用、源代碼管理”等優勢迅速獲得國內外軟件項目開發者的青睞,大量開發人員在代碼托管平臺進行代碼部署,并開源向所有開發者進行學習和交流。但是開源代碼托管平臺中項目的代碼質量參差不齊,用戶在選擇軟件代碼時,很難選擇出符合自己需求的高質量代碼。
為了滿足用戶需求,代碼托管平臺允許用戶對下載的軟件代碼進行評論,用戶可以通過發表評論與開發者交流軟件代碼的信息。用戶經常在評論中表達他們對應用程序功能的看法,例如評論“代碼運行不了,存在很多bug”,其中包含了豐富的代碼質量信息,這些信息可以作為其他用戶選擇軟件的依據,并且為應用程序的開發和演變提供幫助[1]。最近的研究表明,用戶撰寫的評論為應用程序供應商和開發人員提供了豐富的信息來源,它們包括關于bug 的信息、新功能的想法或發布功能信息,對軟件的迭代和演進提供了幫助[2]。Anchiêta等人[3]使用無監督的方法對評論進行分類,旨在總結用戶指出的主要錯誤和新功能,通過對用戶評論信息進行分析來幫助開發人員修復bug 并實現用戶所需的新功能。Li等人[4]提出了一種從應用程序市場比較評論識別移動應用程序的方法,該方法可用于提供基于不同主題的細粒度應用程序比較,幫助用戶根據自己的喜好找到所需的應用程序。
以上研究發現,通過對用戶評論進行分析,可以幫助開發人員進一步完善和維護應用程序,并且為使用者選擇軟件提供了參考。但是通過統計發現代碼托管平臺中有1 500萬代碼倉庫,用戶量超過600萬,并且由于用戶群體不同,用戶評論往往體現出數據量大、領域性強、非結構化等特點。因此,如何從海量用戶評論中綜合分析得到準確的代碼質量信息是一個亟待解決的問題。
目前國內外對于代碼質量的分析主要集中在使用靜態度量工具對代碼進行度量和研究。徐海燕等人[5]提出了包含靜態特性和動態特性的代碼質量模型,以及識別并分析用戶評論中代碼質量信息的方法。黃沛杰等人[6]針對Java代碼質量度量進行研究,選取了較有代表性的23個代碼度量元和包括代碼規模、規范性、可維護性、可擴展性和潛在危險5 個方面的質量特性,使用五種靜態測試工具對其進行度量和綜合分析。孫夢璘等人[7]選取16個度量元作為評價軟件質量的度量指標,進而建立評分值分布函數模型,并通過測試9個不同型號的軟件確定出模型參數,同時依據度量元權值的不同,對軟件進行綜合評分,以量化數據的形式計算出軟件程序代碼的質量水平。
在用戶評論分析方面,徐海燕等人[8]提出針對復雜用戶評論的代碼質量屬性判斷方法來分析用戶評論中的代碼質量信息,幫助開發者在了解用戶的代碼使用情況和用戶關注的代碼質量屬性后有針對性地提升代碼質量。Maalej等人[2]使用評論元數據,如星級和時態,以及文本分類、自然語言處理和情感分析技術,將應用程序評論分為四種類型:bug報告、功能請求、用戶體驗和評級。Panichella等人[9]提出了一種分類法,將應用程序評論分類為與軟件維護和演化相關的類別,以及一種融合自然語言處理、文本分析和情感分析三種技術的方法,自動將應用程序評論分類為建議的類別。
通過分析以上研究發現:
(1)當前大多數文獻主要對用戶評論做分類的任務來分析用戶在使用軟件過程中的反饋情況,僅對代碼質量的部分方面進行分析。例如文獻[2]對bug報告、功能請求、用戶體驗和評級四種類別的用戶評論進行分析。文獻[6]僅僅針對Java代碼中代碼規模、規范性、可維護性、可擴展性和潛在危險5 個方面的質量特性進行研究,文獻[9]認為用戶評論與信息提供、信息查詢、功能請求、問題發現四種類型的建議類別相關。然而代碼質量通常包括多個方面,例如“可讀性”“功能性”等,需要進行更細粒度的劃分。
(2)識別代碼質量信息不夠準確。例如文獻[5]通過代碼質量特征詞庫與評價對象進行匹配來識別具有代碼質量的用戶評論,對于詞庫中不存在的特征詞無法識別。文獻[6-7]使用靜態測試工具對質量特性或者度量元進行度量分析,而沒有考慮程序運行時的動態質量特性;文獻[8]對用戶評論進行主題劃分,僅判斷主題間是否存在因果連詞來識別代碼質量屬性表現結果,對于隱性的因果關系無法進行判斷,導致識別的代碼質量信息不夠準確。
因此,為了更全面地分析用戶評論中的代碼質量信息,本文通過借鑒軟件質量模型,構建代碼質量層次圖對用戶評論中的多個方面的代碼質量信息進行結構化表示,其次針對代碼質量信息識別準確率不高的問題,本文在文獻[7]的基礎上首先采用事件圖譜提取用戶評論信息,然后通過映射為代碼質量層次圖的方法對用戶評論進行分析,最后識別代碼質量信息。
本文的主要貢獻有:(1)基于ISO軟件質量模型,構建代碼質量層次圖。(2)提出一種模式匹配的方法識別事件屬性,并構建基于代碼用戶評論的事件圖譜。(3)提出事件圖譜到代碼質量層次圖的映射方法并進一步識別代碼質量信息。
在針對代碼的用戶評論中,用戶會對使用代碼過程中存在的問題或者針對代碼存在的某些質量屬性發表主觀的評價,并且這些評價通常能夠體現多個方面的代碼質量信息。因此,本文首先構建代碼質量層次圖對代碼質量信息進行結構化表示;其次通過構建針對代碼用戶評論的事件圖譜對用戶評論中的事件進行提取;然后將事件圖譜映射為代碼質量層次圖并對代碼質量信息進行識別;最后識別代碼質量信息,以此得到用戶評論中的代碼質量信息。基于事件圖譜的用戶評論代碼質量分析方法流程圖如圖1所示。

圖1 基于事件圖譜的用戶評論代碼質量分析流程圖Fig.1 User comment code quality analysis process based on event graph
在代碼托管平臺中,用戶通過發表評論對代碼的使用情況提出不同的見解。通過對用戶評論進行分析發現,在用戶評論中,用戶能夠對不同方面的代碼質量進行闡述,但是由于使用代碼的用戶群體不同,以及軟件需求的多樣性,用戶評論中體現的代碼質量信息涉及眾多方面。為了分析用戶評論中的代碼質量,本文基于代碼質量模型[8]、ISO軟件質量模型[10],構建代碼質量層次圖(code quality hierarchy diagram,CQHD)。
定義1代碼質量層次圖表示為CQHD={V,E},V={vroot,vatt,vasp,vres},E={
其中V表示代碼質量層次圖中的節點,包含四種類型節點,vroot表示第一層以代碼質量作為源節點。vatt表示第二層代碼質量屬性節點,由于用戶評論中體現出多個方面的代碼質量子屬性,因此本文參考文獻[8]提出的11個代碼質量屬性作為代碼質量層次圖中第二層的節點。vasp表示第三層代碼質量屬性表現節點,表示對上一層代碼質量屬性的具體表現,并且通常具有明顯的情感傾向,因此將情感傾向作為該層節點的屬性。vres表示第四層代碼質量屬性表現結果節點,是上一層代碼質量屬性表現引起的某種結果;E表示代碼質量層次圖中的邊,

圖2 代碼質量層次圖(CQHD)Fig.2 Code quality hierarchy diagram(CQHD)
在圖2 中,本文使用圓圈代表每一層中的單個節點,使用實線表示相鄰層次之間的層級關系,使用虛線表示第二層中相鄰代碼質量屬性之間的關系。
通過分析發現,代碼質量的體現是以用戶評論中所描述的事件為單位的,用戶評論中用戶所描述的事情可以被看作事件,事件是一種描述特定人、物、事在特定時間和特定地點相互作用的客觀事實[11]。針對代碼的用戶評論中的事件與代碼質量密切相關,通過抽取事件可以認識和理解用戶所關注的代碼質量,例如用戶評論“網頁不能訪問服務器了”中描述了“訪問”這一事件,其體現出代碼質量中的“功能性”,事件的具體內容即為代碼質量屬性表現,并且當兩個事件之間存在因果關系時,則一個事件可以作為另外一個事件的代碼質量屬性表現結果。事件圖譜可以對用戶評論中的事件進行提取以及對事件之間的關系進行分析和結構化表示,因此本文參考文獻[12]提出的事件圖譜構建流程對代碼用戶評論中的事件圖譜進行構建,通過事件觸發詞識別、事件要素識別和事件關系識別建立事件圖譜,并基于事件圖譜對代碼質量進行分析。
事件觸發詞提取是事件抽取的基礎,是能夠明確表示事件發生的詞或者短語,通常是動詞和名詞[13]。本文借鑒文獻[14]中的方法,提取用戶評論中動詞、名詞和動名詞作為觸發詞擴展表,然后對分詞后的用戶評論提取詞特征、詞性特征、句法特征、語義特征和上下文特征,使用支持向量機(support vector machine,SVM)與觸發詞擴展表相結合的方法對用戶評論中的觸發詞進行識別。
在完成了事件觸發詞識別之后,需要對事件元素進行識別,事件元素是事件發生的參與者,同樣體現代碼質量信息。在代碼用戶評論中,事件的主體元素表示主導或者實施該事件的成分,是體現代碼質量的主體對象,可以為分析評論是否對同一主體進行評價提供依據并對判斷事件之間的關系提供幫助。事件的客體元素表示事件主體實施該事件的主要接受者,同樣體現了代碼質量信息,事件的方式元素是引領體現代碼質量事件發生的成分,通常以關聯詞語的形式存在,是事件之間關系的直接體現。另外用戶可能對當前事件發生的狀態進行描述,體現代碼運行時的狀態,也是體現代碼質量的重要成分。
定義2事件元素表示為一個四元組,Event_elements={S,O,Q,T}。其中S表示主體屬性,O表示客體屬性,Q表示方式屬性,S表示狀態屬性。
針對代碼評論領域事件元素的語義解釋如表1所示。

表1 代碼評論事件元素表Table 1 Code reviews event elements
通過分析用戶評論發現,代碼用戶評論具有固定句法搭配比較頻繁、領域詞匯搭配相對固定等特點,并且事件元素與詞性密切相關。例如主體和客體元素通常為名詞(noun,n),方式元素通常為連詞(conjunction,conj)。因此,本文首先對用戶評論進行分詞和詞性標注,然后為了進一步識別事件屬性,挖掘各個事件屬性與觸發詞之間的句法關系和存在的普遍規律,本文使用依存句法分析獲取用戶評論中詞與詞之間的句法關系。研究發現在依存句法中,事件元素通常與事件觸發詞表現為主謂關系(subject-verb,SBV)、動賓關系(verb-object,VOB)定中關系(attribute,ATT)、狀中結構(adverbial,ADV)、動補結構(complement,CMP)等關系。當評論中的詞與事件觸發詞為SBV 關系或者ATT關系,并且其詞性為名詞時,可以作為事件的主體屬性,與觸發詞為VOB 關系且詞性為名詞時,在評論中通常作為賓語,可以作為事件的客體屬性。評論中的連詞往往引領事件觸發詞,因此與觸發詞為ADV 關系的連詞可以作為事件的方式屬性。狀態屬性是作為修飾事件觸發詞當前狀態的成份,因此與觸發詞為ADV結構,或是動賓關系的形容詞(adjective,a),或是CMP關系的動詞(verb,v)以及修飾動補關系的ADV 結構的詞,可以作為事件的狀態屬性。因此,本文通過制定句法規則模板識別各個事件元素,得到事件結果集。事件元素識別規則如表2所示。

表2 事件元素識別規則Table 2 Event element identification rules
算法1識別事件元素
輸入:分詞結果集words;詞性標注結果集postags;事件觸發詞word;評論依存句法結果sdp。
輸出:識別得到的事件元素集event。
算法1 中,識別事件元素的時間復雜度為O(n),其中n表示評論依存句法結果集合中節點的個數。
在完成事件元素識別之后,研究發現用戶評論中可能存在多個事件,針對不同的事件,雖然通常體現出不同的代碼質量屬性,但是根據代碼評論的語言習慣,往往兩個事件之間存在某種邏輯關系進行銜接,因此為了幫助分析代碼質量屬性之間的關系,需要識別兩個事件之間的關系。
本文將事件之間的關系劃分為轉折關系、并列關系、時序關系、原因關系和結果關系。其中轉折關系主要體現在事件主體屬性不同,并且具有相反情感傾向。例如用戶評論“界面很好看,可是代碼看不懂”中兩個事件主體屬性是“界面”和“代碼”,并且情感傾向相反。并列關系的事件之間通常體現相同的情感傾向,例如用戶評論“已經安裝成功了,功能很全面”。原因關系和結果關系也是常見并且重要的一類關系,由于事件發生的先后順序不同,原因關系是指后一事件是前一事件所發生的原因,相反當前一事件作為后一事件發生的原因時則為結果關系。李良毅等人認為事件時序關系識別有助于讀者理清文章脈絡,把握全局發展趨勢,提出一種雙路依存注意力機制來聚合事件句信息,可以使事件時序關系模型的性能得到顯著提高[15]。本文借鑒文獻[16]中提出的隱式關系識別模型將兩個事件的事件元素向量化,使用SVM 機器學習的方法對事件之間的關系進行識別。
通過以上步驟,可以對用戶評論進行分析,并構建事件圖譜。以用戶評論“可能是因為環境配置出錯了,所以網頁不能訪問服務器了,而且代碼一直報錯”為例構建事件圖譜如圖3所示。

圖3 事件圖譜示例圖Fig.3 Example for event graph
在構建了針對代碼用戶評論的事件圖譜之后,可以得到用戶評論中一個或多個事件以及事件之間的關系。事件中包含了豐富的代碼質量信息,為了將代碼質量信息進行結構化表示,需要根據事件圖譜中的事件信息以及事件之間的關系將事件圖譜映射為代碼質量層次圖。由于事件觸發詞是作為事件的核心,體現了具體的代碼質量屬性,因此將事件觸發詞與代碼質量屬性進行映射,事件元素包含了事件的具體描述,與代碼質量屬性表現進行映射,當事件關系為結果關系時,即后一件事件為前一事件的結果,因此,可以向下映射出第四層代碼質量屬性表現結果的節點,當事件關系為原因關系時,即后一事件為前一事件的原因,因此先出現代碼質量屬性表現結果的節點,可以向上映射出第三層代碼質量屬性表現的節點。另外,當事件關系為轉折關系、并列關系和時序關系時,往往存在不同的代碼質量屬性以及情感傾向,因此,以事件元素的情感傾向映射為代碼質量屬性間關系。代碼事件圖譜到代碼層次圖映射規則如表3所示。

表3 事件圖譜到代碼質量層次圖映射表Table 3 Event graph to code quality hierarchy graph
算法2代碼質量層次圖映射算法
輸入:事件圖譜中的事件events;事件之間的關系relations。
輸出:映射得到的代碼質量層次圖G。
在算法2中,映射代碼質量層次圖的時間復雜度為O(e),其中e表示事件圖譜中事件的個數。
通過以上方法,可以將事件圖譜映射為代碼質量層次圖。以上文用戶評論為例,將圖3映射得到的代碼質量層次圖如圖4所示。

圖4 代碼質量層次圖示例圖Fig.4 Example of code quality hierarchy diagram
在使用事件圖譜映射為代碼質量層次圖之后可以發現,代碼質量層次圖可以將用戶評論中的多個方面的代碼質量信息進行結構化表示,通過對代碼質量層次圖進行遍歷,可以進一步識別代碼質量信息。但是通過對大量代碼質量層次圖分析發現,由于用戶評論中事件和事件關系不同,導致映射得到的代碼質量層次圖結構不同。當評論中只存在一個事件時,則映射得到的只有三層節點的代碼質量層次圖,例如用戶評論“這個軟件界面真好看”,映射得到的代碼質量層次圖僅包含了前三層節點,缺少第四層節點。當用戶評論中只存在事件的狀態屬性時,則映射得到的代碼質量層次圖僅包含第一層和第四層節點,例如用戶評論“簡直太棒了”映射得到的代碼質量層次圖缺少第二層和第三層節點,因此為了方便對代碼質量信息進行識別,本文將一個代碼質量信息描述為一個代碼質量三元組E=(a,e,r)。
其中E表示一個代碼質量信息,并且包括三個元素,a表示代碼質量屬性,e表示代碼質量屬性表現,r表示代碼質量屬性表現結果。又由于每條用戶評論中往往包含多個代碼質量信息,因此使用代碼質量三元組集對一條評論中多個代碼質量信息進行表示CodeAttInfo={E1,E2,…,En}。其中CodeAttInfo表示一條評論的代碼質量信息,第n個代碼質量三元組表示為En。
從代碼質量層次圖的第二次節點開始,每層節點的信息與代碼質量三元組的三個元素是一一對應的,因此,為了獲取代碼質量層次圖中的代碼質量信息,可以對代碼質量層次圖進行深度優先搜索,即除最高層節點以外,從第二層節點開始進行遍歷搜索至最低層節點,得到一個代碼質量信息,直至代碼質量層次圖中的所有節點遍歷完成,識別得到最終的代碼質量信息。
算法3識別代碼質量信息
在算法3 中,識別代碼質量信息的時間復雜度為O(t),其中t表示代碼質量層次圖中代碼質量屬性節點的數量。
通過以上遍歷代碼質量層次圖的方法,可以識別出用戶評論中的代碼質量信息。例如上文圖4 中識別到的代碼質量信息為:codeAttInfo={(運行性能,環境配置出錯,網頁不能訪問服務器),(可靠性,代碼一直報錯,null)}。
本文從開源中國推出的代碼托管平臺Gitee網頁中爬取了與代碼相關的用戶評論,選取了總共21 500條評論進行實驗。
使用本文方法對用戶評論進行分析,由于代碼質量層次圖中的結構不同,識別得到的代碼質量三元組類別不同,具有不同類型代碼質量三元組的用戶評論數量和占用戶評論數的比例以及示例如表4所示。

表4 不同類型代碼質量三元組的評論數量及示例Table 4 Number of comments and examples for different categories of code quality triples
為了驗證本文方法對每種代碼質量三元組識別的有效性,以文獻[5]和文獻[8]方法作為對比方法進行實驗,并分析上文四種代碼質量三元組類型的識別結果。對比結果如圖5所示。

圖5 識別代碼質量三元組對比結果圖Fig.5 Graph of identify code quality triplet comparison results
實驗結果表明,本文方法對于類別1 和類別3 的代碼質量三元組識別數量均優于對比文獻方法,是由于基于事件圖譜可以提取事件之間隱性的因果關系,因此識別得到的具有代碼質量屬性表現結果的三元組數量較多。文獻[8]方法對于第2 種類別的代碼質量三元組識別數量更多是由于存在部分代碼質量屬性表現結果未被識別導致,并且對于類型3的代碼質量三元組未進行識別。文獻[5]方法對第4 種類別的代碼質量三元組較多,原因是文獻[5]使用句型規則匹配來識別評價對象和評價觀點,評價觀點識別的誤差會導致代碼質量信息識別出現誤差,另外文獻[5]方法并未對代碼質量屬性表現結果進行識別,對代碼質量信息識別不夠全面。
針對識別到代碼質量屬性的代碼質量三元組所對應的13 330 條用戶評論,參考文獻[8]中提到的11 種代碼質量信息,統計識別到的每種代碼質量屬性的數量如圖6所示。
由圖6可知,本文方法可以對11種代碼質量屬性進行識別,并且用戶往往更關注的是功能性,對可重用性關注度較低。與對比實驗相比,文獻[8]方法采用主題識別可能會出現主題漏判的情況導致代碼質量屬性識別不夠充分,文獻[5]方法過于依賴特征詞庫和詞性規則,當評論中出現詞庫中未收錄的特征詞時無法進行識別,因此,除個別代碼質量屬性(“編程規范性”“可維護性”和“可靠性”)外,本文方法對其余代碼質量屬性識別都優于對比實驗方法。
為了進一步分析本文方法準確性,將本文方法與對比實驗方法分析得到的結果與人工標注的結果進行對比,計算識別到三種代碼質量信息的準確率如表5所示。

表5 識別代碼質量信息準確率Table 5 Accuracy of identification code quality information 單位:%
由表5 發現本文方法對三種代碼質量信息識別的平均準確率為86.9%,文獻[5]方法的平均準確為75.0%,文獻[8]方法的平均準確率為75.2%,因此本文方法準確率均優于對比文獻方法。在算法時間復雜度方面,本文方法時間復雜度為O(n+e+t),優于對比實驗方法。但是由于本文方法依賴依存句法分析的結果,當用戶評論中存在代碼片段或者以中英文結合的方式時,無法使用依存句法進行分析,導致存在一定的誤差,下一步需要進一步優化算法,減少對依存句法的依賴,進一步提高代碼質量信息識別的準確性。
本文提出代碼質量層次圖的構建方法,并將用戶評論信息使用事件圖譜進行結構化表示,然后將其映射為代碼質量層次圖,并基于該代碼質量層次圖對代碼質量信息進行識別。實驗結果表明,本文方法針對數據量大,結構復雜等特點的代碼用戶評論中的代碼質量信息能夠進行有效識別。但是,由于本文方法依賴依存句法關系,導致在抽取事件元素時存在誤差,最終導致識別代碼質量信息存在偏差。下一步需要持續改進算法,同時考慮回復評論對原始評論的影響,對殘缺的代碼質量信息進行推理和補全,得到更準確的代碼質量信息。