引用
李文鵬,王建彬,林澤琦,趙俊峰,鄒豔珍,謝冰.面向開源軟體專案的軟體知識圖譜構建方法[J].電腦科學與探索,2017,11(06):851-862.
摘要:軟體複用是軟體開發中避免重複勞動的解決方案。開源軟體的原始碼、郵件列表、缺陷報告和問答文 檔等軟體資源中蘊含了規模龐大、結構複雜、語義關聯豐富的軟體知識。如何獲取知識、組織知識,以及如何 在軟體複用過程中方便地檢索軟體知識是亟待解決的問題。為了解決這些問題,面向開源軟體專案,構建了 軟體知識圖譜,並提供了基於軟體知識圖譜的軟體知識檢索。主要工作包括:針對 4 種不同型別的軟體資源, 提出了軟體知識實體的提取原則與方法;提出了軟體知識實體之間關聯關係構建的方法;實現了兩種軟體知 識檢索機制,並以文字列表和圖形視覺化相結合的方式展現檢索結果;設計了軟體知識圖譜構建框架。基於 上述工作,設計並實現了一個面向開源軟體專案的軟體知識圖譜構建工具。例項證明,所構建的軟體知識圖 譜可以更好地幫助軟體開發人員進行軟體知識的檢索與應用。
關鍵詞:軟體複用;開源軟體;軟體知識圖譜;圖資料庫
1 引言軟體複用是軟體開發中避免重複勞動的解決方案。通過軟體複用,可以提高軟體開發的效率和品質。軟體複用成功的基本前提是存在大量可複用的軟體構件,並且複用者在複用之前可以方便、有效 地找到合適的可複用構件。開源軟體是一種有效 的軟體複用模式。開源軟體的蓬勃發展,極大地豐富了可複用的軟體構件。
為了有效地組織軟體資源,更好地進行軟體復 用,本文面向開源軟體專案構建了軟體知識圖譜。 軟體知識圖譜是指由不同型別的軟體資源的軟體知 識圖有機融合構成的用以描述某一軟體的知識體 系。軟體知識圖是指由同一型別軟體資源的軟體知 識實體及其之間的關聯關係所構成的圖。軟體知識 實體指的是軟體資源中可區的、可辨識的且具有一定語義關係的單元體,而軟體知識實體之間關聯關係指的是兩兩軟體知識實體之間具有某種型別的二元關係。本文工作主要包括:
(1) 提出了軟體知識實體的提取原則與方法。分別從軟體原始碼、缺陷報告、郵件列表和問答文件4種軟體資源中提取了相應的軟體知識實體。
(2) 提出了軟體知識實體之間關聯關係構建的 方法。分析了同一型別軟體資源中的軟體知識實體 關聯關係的構建方法與不同型別軟體資源中軟體知 識實體之間的關聯關係。
(3) 設計了形式化檢索和文字檢索兩種軟體知識檢索機制,並以文字列表和圖形視覺化相結合的 方式展現檢索結果。
(4)設計了軟體知識圖譜構建框架,該框架由軟體知識提取塊、軟體知識融合模組、軟體知識圖譜 儲存管理模組與軟體知識檢索模組構成。
基於上述工作,本文設計並實現了一個面向開源軟體專案的軟體知識圖譜構建工具,並以 Lucene- Core 為例,通過應用例項展示了本文工作的有效性和合理性。
2 相關工作與技術DBPedia 從維基百科(Wikipedia)的詞條裡擷取 出結構化的知識(RDF 格式),並以語義網的形式將 擷取的知識整合在一起。DBPedia 支援使用者進行語 義化查詢維基百科相關資源的屬性和資源之間的關 系。谷歌的知識圖譜將谷歌索引的所有事物、人物 和 地 點 ,例 如 地 標 性 建 築 、名 人 、球 隊 、電 影 、藝 術 品 等 ,刻 畫 成 實 體 ,並 建 立 這 些 實 體 之 間 的 關 聯 關 系 。 早期的知識圖譜建立在諸如 Freebase、維基百科、維 基資料以及美國中央情報局出版的《世界概況》等著 名公開資料來源上,其包括了 5 億多個物件實體以及 350 億條這些物件實體之間的關聯關係。近期,谷歌又通過機器學習和資料探勘方法,從索引的網頁 中自動發現新的實體和實體關係,從而擴大並完善 了知識圖譜。這些研究主要涉及通用領域,較少涉 及軟體相關的知識。本文根據軟體資源的特點研究 軟體資源中的軟體知識提取和管理,並構建軟體知 識圖譜。
有關程式碼和文件之間的可追蹤性(traceability) 的工作很多,本文關注這一研究方向中的程式碼元素 識別和關聯技術。Bacchelli 等人開發了 Miler 工 具,用以從郵件列表中提取出包含的程式碼元素。該 工具的主要思想是:先解析出軟體專案的程式碼,再結 合駝峰命名法(camel-case)和正則表示式匹配來識別 程式碼元素。Miler 區分大小寫,可以較為準確地識別 出組合詞(如 IndexReader)和單項詞元素(如 Index)。 其中組合詞的識別準確率最高,而單項詞元素可能 是自然語言中的單詞,需要新增一定的規則進而準 確地識別單項詞元素。Dagenais 等人開發了 Reco- Doc 工具,用於對 API 的相關學習資料建模,並從中 提取出包含的程式碼元素,進而建立 API 和相關學習資 料之間的可追蹤性。RecoDoc 結合了部分程式分析 和正則匹配技術提取程式碼元素;同時還制定了一些 啟發式規則,結合上下文環境提取程式碼元素。
3 問題分析軟體資源中的軟體知識實體豐富多樣,它們之間的關聯關係也是錯綜複雜。為此需要採用合適的 模型表達軟體知識實體以及軟體知識實體之間的關 聯關係。屬性圖模型能夠很好地利用屬性表達結點 和關係豐富的資訊,因此本文采用屬性圖模型進行 軟體知識圖譜的構建。屬性圖模型的特徵如下:屬 性圖模型是由結點、有向邊和屬性組成的;結點上包 含屬性,屬性可以任何鍵值對的形式存在;每條邊都 擁有一個方向、一個標籤、一個開始結點和一個結束結點 ;就像結點一樣,邊也是有屬性的 。
基於屬性圖模型,本文的軟體知識圖譜採用如下機制統一地表示從軟體資源中提煉的結構化軟體 知識:圖中每個結點對應一個軟體知識實體;圖中的 每條有向邊代表一個語義關聯;每個軟體知識實體中的鍵值對與實體所對應的結點屬性一一對應;每 個結點或邊由全域性識別符號唯一標識。
屬性圖模型是很多圖資料庫的底層實現模型。 DB-Engines 排名前 5 的圖資料庫依次分別是 Neo4j、Titan、Virtuoso和 ArangoDB。考慮到儲存模型、查詢語言、圖資料庫成熟度等因素,由於 Neo4j 原生支援屬性圖模型,具有豐富的查詢語言,使用使用者多,成熟度高,本文選擇 Neo4j 作為軟體知識圖譜的底層儲存。
在構建面向開源專案軟體知識圖譜時,需要解 決以下 3 個問題:
(1) 軟體知識實體提取。軟體資源的型別是多 種多樣的,包括軟體原始碼、郵件列表、缺陷報告、相 關問答文件等各種不同的資源型別。同一型別的軟 件資源、資料來源也可能不同,如缺陷報告可能來自 JIRA、BugZilla 或 Lighthouse。不同的軟體資源中,軟 件知識實體的形式與特點也各不相同。
(2) 軟體知識實體關聯關係建立。同一型別的 軟體資源中所提取的軟體知識實體之間存在各種關 聯關係,由軟體資源自身特點決定;從不同型別的軟 件資源中提取的軟體知識實體也存在關聯關係,如 郵件中可能引用一個缺陷報告。
(3) 軟體知識檢索與展現。如何利用軟體知識 圖譜向軟體開發人員提供其所需的知識,並針對不 同精度需求提供不同方式的檢索。
4 解決方案本文面向開源軟體專案的軟體知識圖譜構建工具的總體框架如圖 1 所示。
面向開源專案軟體知識圖譜構建工具的輸入是開源專案的原始碼、缺陷報告、郵件列表和問答文件 等軟體資源。首先從這些軟體資源中提取出各自的 軟體知識圖,稱之為軟體知識提取;然後建立軟體知 識實體關聯關係,將來自不同型別軟體資源獨立的 軟體知識圖有機地組織在一起,形成軟體知識圖譜; 最後建立知識檢索與展現機制,面對使用者的精確檢索和模糊檢索需求,在軟體知識圖譜之上提供形式 化檢索和文字檢索兩種檢索機制。
基於上述的總體解決方案,下面將對軟體知識 實體提取、軟體知識實體關聯關係建立和軟體知識 檢索與展現 3 個問題進行詳細的闡述。
4.1 軟體知識提取4.1.1 面向軟體原始碼的軟體知識試題提取本文主要面向 Java 開源專案,因此研究面向 Java 原始碼的軟體知識實體提取。根據 Java 語言規範,Java程式碼是由包、類、介面、域、方法、語句等程式碼元素構成。為了進一步豐富程式碼結構化的知識,本文將域和方法提取為軟體知識實體,具體實體屬性內容如表1所示。
本文使用 Eclipse JDT 的 ASTParser 將每個 Java 檔案解析成一個抽象語法樹(abstract syntax tree,AST)。AST使用樹狀結構表示程式碼的抽象語法結 構,樹上每個結點都對應程式碼中的一種結構。
程式碼中的每個元素都對應抽象語法上的一個結點,使用 Visitor 設計模式遍歷所有結點提取如表1所示的包 、類 、介面 、域和方 法軟體知識實體以及對應的屬性資訊,並將這些軟體知識實體儲存至程式碼實 體池中。另外,ASTParser 只能將塊註釋關聯至對應 的程式碼元素,而對於行註釋資訊則不能自動對應到相應的程式碼元素上。對於行註釋資訊,需單獨處理,根據其在檔案中的位置與相應的程式碼實體繫結。
4.1.2 面向缺陷報告的軟體知識實體提取 開源軟體專案中常用的缺陷報告系統有 JIRA、BugZilla 和 Lighehouse,它們的差異在於不同系統中 資訊的豐富程度不同,本文通過取這些缺陷報告系 統資訊的超集來解決這個問題。如 JIRA 的缺陷報告 中有缺陷型別資訊,而 Bugzilla 中沒有該資訊,那麼 超集為包含該資訊,只是從 Bugzilla 中提取該資訊時 為 null。
缺陷報告可以看作是“問題-解決方案-反饋-參 與者”型的軟體資源。對於這類資源,可以將每個問 題、解決方案、反饋以及相應的參與者單獨提取為一 個 軟 件 知 識 實 體 。 因 此 將 “ 缺 陷 報 告 ” 、“ 補 丁 ” 、“ 缺 陷報告評論”以及相應的參與者單獨提取為軟體知 識實體,如表 2 所示。
JIRA 中每一個缺陷報告對應一個 JSON(Java- Script object notation)和多個文字格式的補丁檔案 (如果有補丁檔案)。其中 JSON 檔案中包含了除補 丁外所有與缺陷報告相關的資訊。本文使用開源 JSON 解析工具 GSON 解析 JSON 檔案,從每一個 JSON 檔案中獲取對應缺陷報告實體、補丁實體、缺 陷報告評論實體和缺陷報告使用者實體的資訊,利用 檔案解析工具 FileUtils 解析相應的補丁檔案設定補丁的“補丁內容”資訊。
4.1.3 面向郵件列表的軟體知識實體提取開源軟體專案的郵件列表歸檔通常使用 Mbox 格式。一封郵件天然就是可區分可辨識的且具有一定語義的單元體,可以將單獨的一封郵件提取為軟 件知識實體。具體屬性如表 3 所示。
開源軟體提供的郵件列表歸檔的格式多樣,本文考慮 Mbox 格式。每個 Mbox 檔案由多封郵件構 成,本文使用 Mime4j 解析出每一封郵件,以及每封郵件對應的識別符號、主題、傳送日期、傳送者、接收者和 郵件內容。
為了獲取郵件“使用者實體”的資訊 ,本文通過正則匹配從傳送者和接收者資訊中解析出名稱和郵件地址。但是,Mbox中的使用者名稱稱位置不盡相同,而且表示形式多樣。針對這種情況,本文為發現的每 一種特殊形式設計一個正則表示式,儘可能提高準 確度。
4.1.4 面向問答文件的軟體知識實體提取問答文件是“問題-解決方案-反饋-參與者”型的軟體資源 ,可 以將問題、答案、評論以及相應的參與者單獨提取為軟體知識實體,如表 4 所示。
本文問答資訊獲取自問答網站 Stack Overflow的資料 Stack Overflow Dump,解析 Dump 得到 Posts、Comments和Users 等幾個 XML 檔案,利用 XML 解析 器 SARParser 解析 Posts 提取出問題和答案實體;解析Comments提取出問答評論實體;解析 Users 提取出問答使用者實體。
4.2 軟體知識實體關聯關係建立軟體知識實體之間具有大量語義豐富的關聯關 系:同一軟體資源內部的軟體知識實體之間的關聯關係 ,這些關係往往是特有的 、與型別相關的,需要針對具體的資源型別建立起這些語義關聯關係;跨不同軟體資源的軟體知識實體之間的關聯關係,本文考慮3類:(1)程式碼元素關聯,一個軟體知識實體所 包含的資訊中直接提及了同項目中的某一個程式碼元 素 ;(2)引用關聯,一個 軟 件 知 識 實 體 通 過 超 鏈 接 或 唯一識別符號的形式引用另一個軟體知識實體;(3)使用者關聯,同一使用者在不同軟體知識實體中扮演不同角色。
4.2.1 同一資源的軟體知識實體關聯關係建立本文建立的軟體知識實體之間的關聯關係如表 5~表 8 所示。其中關係均採用集合論表示,如“實現= {(類,介面)}”中實現關係集合包括類與介面之間的實現關係。
軟體程式碼中多數關係蘊含在已提取出的軟體知識實體屬性中 。 對於“依 賴”和“調 用”關係 ,需要利用 ASTParser 將程式碼解析到每一個語句。“作者關係”蘊含在知識實體屬性中,而對於“補丁關係”、“缺陷報告評論關係”、“重複關係”而言,需 要在解析過程中,記錄下對應關係型別的對映,根據 每一條對映為實體新增關聯關係。
“傳送者”、“接收者”關係蘊含在郵件實體的“接 收者”屬性中;“回覆”關係需要在解析 Mbox 時記錄 下包含“In-Reply-To”資訊的郵件的識別符號以及對應 的“In-Reply-To”資訊,通過識別符號定位具體的郵件實 體,並在兩個郵件實體之間建立“回覆”關係。
“答案關係”、“評論關係”、“作者關係”蘊含在知 識實體屬性中,對於“重複關係”,解析 PostLinks 得到 重複關係對應的問題識別符號對,在對應的問題實體 間建立一條“重複關係”。
4.2.2 不同資源的軟體知識實體關聯關係建立對於不同型別軟體資源中的軟體知識實體,本文主要建立 3 種不同的關聯關係:程式碼元素關聯、引用關聯和使用者關聯。
4.2.2.1 程式碼元素關聯
程式碼元素關聯是指建立軟體程式碼中的軟體知識實體與其他型別軟體資源中軟體知識實體之間的關 聯關係。如果一個非程式碼軟體知識實體的屬性資訊 提及了同項目的一個程式碼元素(類、介面、域或方 法),則在該軟體知識實體與該程式碼元素對應的軟體 知識實體之間建立一條語義關聯關係。本文稱這種語義關聯關係為“程式碼引用”關 系 ,可 以 看 作 一 種 特 殊的“引用”關聯關係。程式碼元素關聯識別方法根據 RecoDoc技術實現,具體方法如下:
(1)通過基於模式匹配的方法實現對自然語言文字中的詞項進行分類。
(2)通過上下文分析的方法實現對程式碼元素的歧義消除。
(3)通過基於註釋分析的方法實現對識別結果的精化。
4.2.2.2 引用關聯
引用關聯是指建立一個軟體知識實體與其引用 的軟體知識實體之間的關聯關係。如果一個軟體知 識實體包含的資訊中包含另一個軟體知識實體對應 的超連結或全域性唯一的識別符號,則在該軟體知識實 體與包含的軟體知識實體之間建立一條語義關聯關 系。本文稱這種語義關聯關係為“引用”關係。
4.2.2.3 使用者關聯
使用者關聯是指同一使用者在不同軟體知識實體中 扮演不同角色的關聯關係。比如,某個郵件的傳送 者也是某個缺陷報告的建立者。本文根據郵件地址 與使用者名稱等資訊,識別並關聯不同型別軟體資源中 的同一使用者,進而間接建立不同型別軟體資源的軟 件知識實體之間的關聯關係。本文稱這種語義關聯關係為“同一使用者”關係。
5 軟體知識檢索與展現5.1 形式化檢索與展現本文軟體知識圖譜的底層儲存支援系統為 Neo4j。Neo4j 提供了一個宣告式的、易讀的圖查詢 語言 Cypher,可直接使用 Cypher 檢索軟體知識。
Cypher 語法對於自定義的關係、結點的標籤和 結點、關係的屬性名是區分大小寫的。當關系名稱 和結點的標籤名稱較長時,輸入拼寫正確的名稱是 困難的,對使用者是不友好的。本文借鑑 Eclipse 進 行程式碼補全的思想,根據上下文環境實時推薦程式碼 元素,開發了 Cypher 補全工具,使得使用者輸入查詢語 句時可以根據上下文推薦關係、結點的標籤和屬性名。
5.2 文字檢索與展現
本文將所有軟體知識實體的核心文字內容(表9)單獨提取成一個個的文件,並建立起文件與軟體 知識實體之間的關聯關係;然後為每個文件建立倒 排索引。在使用者進行檢索時,返回 Top K(本文 K= 100)個與檢索語句相關的文件,然後根據文件與軟 件知識實體之間的關聯關係,得到TopK個與檢索語 句相關的軟體知識實體。展示內容包含核心內容及 相應上下文資訊。
致謝本文由南京大學軟體學院2019級碩士郭越轉述 感謝國家重點研發計劃(2018YFB1403400)和國家自然科學基金(61690200)支援!