孟令中,王 航,薛云志+,武 斌,馬 蘭
1.中國科學院 軟件研究所,北京 100190
2.中國科學院大學,北京 100190
3.清華大學附屬小學,北京 100084
當今社會,軟件應用十分廣泛,已經成為影響國民經濟、政治乃至社會生活的重要因素。隨著軟件應用領域的不斷擴大,軟件的開發和運行環境更加多元化,信息化需求的增加導致了軟件的規模和復雜性都有了巨大的增長。影響軟件質量的因素很多,軟件本身不可避免地存在缺陷,由于系統對軟件有著強烈依賴,這種已有的或者潛在的缺陷一旦觸發勢必造成軟件的失效,將導致各領域依賴的軟件業務陷入癱瘓,進而導致嚴重的后果。
軟件失效的機理是:軟件產品中存在軟件缺陷,引起軟件在運行階段發生故障,當軟件故障沒有被系統所容忍,并引發一個或多個失效行為,最終表現出系統失效。根據IEEE標準中的定義,軟件缺陷指計算機程序中一個不正確的步驟、過程或數據定義[1];軟件故障是系統在運行時由于缺陷造成的非正常狀態的表現和反映;軟件失效是指程序的運行偏離了需求,是動態運行的結果[2],當軟件故障沒有被系統所容忍,并引發一個或多個失效行為,最終表現出系統失效。
根據美國國家技術標準研究院的一項統計,平均每年美國花費在減少各個領域軟件出現失效的經費占GDP的大約0.6%。因此對軟件失效的預測、發現及預防是及其重要的。但是由于軟件缺陷的產生會因編程人員的不同而不同,因開發語言的不同而不同,因開發對象的領域不同而具有特定的缺陷。同時由于受到各類資源與軟件交付時間的限制,很難對設計的每一個模塊每一個操作都做到完美的測試;即使有了充足的時間與人力,也并不是每個開發人員或測試人員都具備發現所有軟件失效的能力。但是隨著軟件項目中開發和測試工作的不斷開展與深入,軟件開發團隊和測試團隊會積累越來越多的有關軟件失效的數據,這就為預測、發現及預防軟件失效提供了可能。
模式是針對復雜系統中重復出現的問題而提出的一個概念,用以描述不斷重復發生的問題。在實際工程中,有經驗的專家或工作人員在分析問題和解決問題時,通常先考慮以前發生過的類似問題,并重用該問題的解決方案以解決問題,這個不斷被使用的解決方法通常稱之為模式。軟件失效模式(software failure mode)指軟件失效發生的不同方式,是可以從不斷重復出現的或類似的軟件失效中發現和抽象出的規律描述。
在國軍標GJB/Z 1391—2006中,給出了嵌入式軟件系統的失效模式,并分為輸入失效、輸出失效、程序失效、未滿足功能及性能要求失效和其他類型等[3]。但是該標準給出的失效模式為通用的失效模式,僅包含軟件失效影響,以輸入失效為例,包括:(1)未收到輸入;(2)收到錯誤輸入;(3)收到數據輕微超差;(4)收到數據中度超差等。因此在實際工作中存在以下問題:(1)僅是對軟件失效影響的模式描述,缺少相關的失效原因的模式描述,因此對于軟件開發人員與測試人員來說,還需要更多的工作經驗與項目背景去進行分析以發現軟件失效。(2)難以滿足特定領域的軟件失效的預測與測試工作。同時隨著軟件規模與軟件復雜度的增加,單個項目的軟件失效數目劇增,傳統的利用人工方式總結失效模式存在工作效率低、過程繁瑣及受到專業技能限制等問題。
因此,為了能夠高效及準確地預測和發現實際軟件項目中的軟件失效,本文利用“失效原因”和“失效影響”的組合來表示失效模式,增強對軟件失效模式的描述。并提出了一種軟件失效模式自動生成方法。該方法面向目標軟件在軟件開發和測試階段發現的大量軟件失效的文本描述,利用建立的異常分類器對軟件失效進行分類,并對分類后的文本描述進行聚類分析,自動抽取出失效影響和失效原因,最終構建成更為完善的面向該目標軟件領域的軟件失效模式庫。
本文組織結構如下:第2章介紹相關工作;第3章介紹核心方法與相關算法;第4章介紹實驗與分析;第5章是工作總結及未來工作的改進方向。
本文涉及的相關工作包括文本信息挖掘在信息領域的應用及軟件失效模式分析研究。
在計算機信息領域,文獻[4]綜述了文本挖掘技術中文本分類、摘要提取、主題檢測、搜索及文檔聚類的方法,并介紹了文本挖掘技術在電信、推薦系統、信息檢索、媒體等領域的應用。文獻[5]綜述了在現階段擁有大量新的數據來源的情況下,可以通過文本挖掘方法開展自動化的數據匯總和分析工作,有利于知識庫的擴展。文獻[6]針對網絡新聞的原始文本進行預處理,使用文本挖掘技術自動提取半結構化信息,提出了欺詐和盜竊者的行為模式與屬性統計,建立了危險身份行為模型,用于阻止未來的危險事件發生。文獻[7]應用文本挖掘技術和潛在語義分析算法自動提取海量歷史數據中的場景描述,并利用模糊關聯規則進行場景分析。文獻[8]通過面向相關文獻的開展文本挖掘工作自動獲取了數據集用以提供分類器,以解決蛋白質-蛋白質相互作用的數據繁多和嘈雜的問題。
在軟件失效研究領域,為解決軟件可靠性建模過程中所需要的不同歷史數據庫中的軟件的準確失效時間,文獻[9]提出了一種文本挖掘方法構建相應的關鍵詞字典及建立分類器,用以自動提取來自詳細描述系統維護活動的工作單和停機數據記錄,進而自動識別工作單中的故障。文獻[10]針對測試人員發現的無效失效降低開發效率的問題,利用文本挖掘方法建立了無效失效分類器,并利用決策樹方法對新的無效失效進行分類,以提高項目組的生產力。文獻[11]使用文本挖掘技術檢測惡意軟件的動態行為并進行量化分析,進而建立檢測決策模型用以提高惡意軟件的檢測率。文獻[12]利用演進樹的神經網絡模型,將失效模式進行聚類并可視化為樹形結構,并對失效模式進行分組排序,更好地進行失效模式影響分析。文獻[13]通過分析真實的操作系統失效,提出失效模式協議方法,用于發現不同工作場景下的呈現一致性的失效,以分析操作系統失效背后的機制。文獻[14]針對航空電子系統創建一個數據驅動的反饋回路,分析來自飛行器的傳感器和儀器的時空數據流,進而發現失效模型用于在可能的情況下糾正錯誤的數據。
文本聚類是指將文本聚合為由若干個文本蔟組成的集合的過程,因為同一類的文本具有很大的相似性,不同類文本具有一定的相異性。文本聚類主要包括兩個步驟:(1)對文本進行預處理,將文本表示為計算機可以識別及處理的形式;(2)采用機器學習中的相關算法對形式化的文本進行聚類分析。K-means是典型的基于距離的聚類算法,采用距離作為相似性的評價指標,即兩個對象的距離越近其相似度就越大。
基于知網的詞語語義相似度計算是利用知網中義原之間的關系進行語義計算及推理[15]。該方法可以將兩個語義表達式的整體相似度分解成一些義原對的相似度的組合,進而根據上下位關系得到語義距離并進行轉換。
為了更好地表示軟件失效模式,本文提出利用失效原因(failure cause,FC)和失效影響(failure effect,FE)一起描述軟件失效模式。其中失效原因指整個系統環境中導致產生某個特定失效模式的基本原因,包括外部設備環境、軟件系統的輸入和輸出、系統邏輯設計及程序運行等多個方面。失效影響指某個失效模式對一個系統中操作、功能或狀態所造成的一系列結果。失效影響可以分為局部影響、對上一層系統的影響以及對整個系統的影響[16]。
領域內的軟件失效數據更多的是來源于多年來軟件開發團隊和測試團隊在實際工作中所積累的豐富的失效信息。
這些軟件失效信息不僅包含一些數字信息,如報告日期、被測版本信息等,更重要的是有關失效的文本描述。這些失效文本描述具有以下特點:
(1)失效描述短小。通常有關失效的文本描述具有較少的字數,一般在150字內,是典型的短文本。
(2)有較少的語法錯誤和錯別字。與微博或微信朋友圈隨意發布不同,失效描述一般都經過測試人員認真編寫,且有的失效描述經過開發人員與測試人員多次探討,因此軟件失效的描述一般相對準確,不存在語法錯誤。
(3)語義專業化。軟件失效都是針對特定被測系統的描述,一般使用的詞匯都是軟件測試領域的專業詞匯,且由于軟件失效描述的專業性,其描述的軟件失效一般無歧義性。
(4)語義完整性。大多數短文本具有語義碎片化的特點,但是軟件失效描述文本卻與之不同。一般一條軟件失效的描述是針對一個軟件失效的情況進行詳細說明。雖然字數較少,但通常包含一個完整的主題即一個軟件失效,且清晰明確地表達了失效的情況。
(5)結構統一性。在軟件失效描述文本的前部一般是對軟件操作的描述,即失效原因的描述,后部一般是失效影響的描述,同時文本中間會有明確的標點作為分隔符。
正是由于軟件失效的文本描述具有以上特點,使得利用文本挖掘技術與機器學習算法用于軟件失效模式的自動提取存在可行性。
軟件失效模式自動生成是將短文本聚類分析技術應用于軟件失效的描述分析中。主要的關鍵核心工作包括領域字典的構建和面向失效文本描述特性的聚類算法改進。其工作流程如圖1所示。
3.2.1 軟件失效分類方法
不同類型的軟件在發生失效的時候,所表現出的異常情況也是不同的,其失效的文本描述內容也必然有所區別,因此為了提高后續失效模式聚類的準確性及減少聚類過程中的離群點,需要首先將軟件失效按照發生異常的情況進行分類。
步驟1軟件失效文本描述的提取。軟件失效的文本描述一般為結構化或半結構化信息,其中保存在管理工具(如Bugzilla、Mantis或其他缺陷系統)中的失效文本描述為結構化信息,可以通過數據庫直接導出;以軟件問題報告單(如第三方測評中心提交的成果)等文檔形式保存的因其一般都根據文檔表格模板進行編寫故而為半結構化信息,這些軟件失效的文本描述可以通過腳本語言進行批量獲取。在提取過程中,需要對數據進行初步清洗,如去除失效文本描述為空,失效文本描述小于10個漢字,非文本格式的文件,編碼異常數據等。將獲取的軟件失效文本保存在數據庫中,為后續的失效模式自動生成做準備。

Fig.1 Software failure mode automatic generation method圖1 軟件失效模式自動生成方法
步驟2軟件異常分類器的建立。軟件失效的異常分類可以參考IEEE Std 610.12[1]和GJB/Z 1391[3]提供的異常分類并結合目標軟件的特性進行裁剪,建立適應于該目標軟件的異常分類。
IEEE提供的9種異常分類如下:
(1)操作系統掛起;
(2)程序掛起;
(3)程序失敗;
(4)輸入問題;
(5)輸出問題;
(6)未達到要求的性能;
(7)發現的整個產品失敗;
(8)系統錯誤信息;
(9)其他。
GJB/Z 1391提供的5種異常分類如下:
(1)輸入失效;
(2)輸出失效;
(3)程序失效;
(4)未滿足功能及性能要求失效;
(5)其他。
依據以上分類的詳細說明,針對每一種軟件異常構建其對應的異常分類字典Dic.Abnormaln,其中n表示異常分類的數量。同時可以根據目標軟件項目的歷史失效,進行相應的補充完善工作,構建更加全面的異常分類字典Dic.Abnormaln。由于不同的失效原因可能會導致相同的失效影響,因此利用詞語組合的形式構建異常字典,用以區分不同的異常分類情況。例如“輸入”+“異常”為輸入失效的異常分類字典 Dic.Abnormal1;“程序”+“異常”為程序失效的異常分類字典Dic.Abnormal3。最后利用多個異常分類字典建立一個決策樹分類器。
步驟3軟件失效的異常分類。將每一個軟件失效文本描述放入到異常分類器中進行軟件異常分類。由于建立的分類器是基于失效影響的描述,因此在分類中需要加入失效文本描述中關鍵詞位置的權重a,可以得出文本后部的系數較高。通過加入該權重的計算,可以確保每一個失效文本描述最多屬于一個軟件異常。
相關算法如下:
輸入:待分類的失效文本描述,期望閾值M,字典Dic.Abnormaln,文本位置權重系數a。
(1)失效文本描述放入軟件異常決策樹分類器中,并考慮權重系數a進行計算并分類。
(2)若低于M,則認為該失效不屬于任何異常情況,則丟棄該失效文本描述;若不低于M,則將該失效劃入到相應的軟件異常中。
輸出:失效文本描述所屬失效類別。
3.2.2 失效文本聚類分析方法
在對軟件失效文本進行異常分類后,對每一個異常分類下的失效文本描述進行聚類分析。
步驟1失效文本分詞。軟件失效文本描述具有語義專業化的特點,為減少文本分析過程中中文分詞不準確的問題,本文利用搜狗輸入法提供的計算機領域詞包建立計算機領域關鍵詞詞典Dic.Computer,并加入到公開的NLPIR分詞系統中。利用該改進的NLPIR分析系統對失效文本描述進行分詞,并保存到數據庫中。
步驟2文本預處理。由于軟件失效文本描述相對短小,內容精煉且有較少的語法錯誤和錯別字,因此在預處理過程中不需要進行去掉低頻詞、替換奇異詞等數據處理步驟。停用詞過濾是文本預處理的關鍵步驟,本文采用哈工大公開發表的停用詞表作為基礎。由于在失效文本描述中,時間副詞(如總是、同時等)、范圍副詞(都、只、一起等)及否定副詞(沒有、無法、不、不能等)對失效原因或失效影響的含義有重要影響,因此對停用詞表進行改進,將部分副詞從停用詞表中去除。之后利用改進后的停用詞表對分詞后失效文本進行處理。
步驟3文本聚類。針對每一種異常下的失效文本集合,對經過預處理后的失效文本進行K-means聚類。本文采用基于知網的詞語語義相似度計算方法得出文本相似度,用以表示聚類過程中的距離。
3.2.3 類簇標簽提取方法
對每一個類簇進行標簽提取工作,標簽提取的目的是為了后續的軟件失效原因的抽取。利用代表性樣本作為每一個類簇的標簽。
步驟1詞計算。將一個類簇內所有樣本的詞語合并成一個集合,利用文檔頻率和詞性等屬性對集合內的每一個詞語進行計算。其中文檔頻率指給定詞匯的文本描述個數,文檔頻率較高的詞一般可以很好地體現該類簇的特征;詞性,名詞和動詞可以較好地表達主題,因此會設定較高的分值。之后對每一個失效文本中的詞語進行詞語位置權重計算。根據對軟件失效文本描述的分析,可以發現絕大部分描述失效原因的文本位于整個文本的前半部分,由于類簇標簽提取的目的是為了軟件失效原因的抽取,因此對于前面部分的詞語設定較高的分值。
步驟2代表性文本提取。將步驟1計算得出的類簇內每個詞語的分值作為得分初始值。利用前文建立的計算機領域關鍵詞字典Dic.Computer,為其建立相應的初始分值,用于對每個文本描述中出現Dic.Computer中的詞語進行額外加分。之后,將每一個文本的特征詞集合中所有詞語得分的算數平均值進行排序,選取初始失效文本描述長度大于20個字且分值排序最高的前若干個文本作為該類簇的代表性文本。
3.2.4 軟件失效模式自動生成方法
本文定義的失效模式是由“失效原因”和“失效影響”組合而成。同時軟件失效文本描述具有語義完整與結構統一的特性,這為分別抽取“失效原因”和“失效影響”提供了可行途徑。
步驟1軟件失效影響的抽取。異常分類字典Dic.Abnormaln是失效影響分析的關鍵詞組合的集合,由于集合中存在語義相近的關鍵詞組合,因此需要進行語義相似度計算,設定相似度閾值M并合并相似度較高的關鍵詞組合。合并后的關鍵詞組合即作為失效影響集合并用Set(FEm)n表示,即第n個異常分類中共有m個失效影響。
步驟2軟件失效原因的抽取。利用3.2.3小節中獲取的類簇標簽,即前若干個代表性文本開展軟件失效原因的抽取。設定相似度閾值M,對代表性文本之間進行相似度計算,相關算法依舊選擇基于知網的詞語語義相似度計算方法。在迭代完成相似度大于M的文本合并后,輸出剩余的合并后的文本集合,作為該類簇的失效原因的文本集合。最后將該異常分類下所有類簇進行以上計算后的組合文本進行匯總,則匯總后的集合即可作為軟件失效原因集合并用Set(FCi)n表示,即第n個異常分類中共有i個失效原因。
步驟3軟件失效模式自動生成。計算Set(FEm)n和Set(FCi)n的笛卡爾積,并將得出的集合記為Set(FCi*FEm)n。給定相似度閾值M,并依次將該類簇內的失效文本與Set(FCi*FEm)n進行相似度比較,當大于M時,即可得到第n個異常下的一個軟件失效模式,其失效模式的文本描述由FCj和FEK組成,其中0<j≤i,0<k≤m。
實驗數據來源于國家“核高基”科技重大專項課題中實際測試工作中的軟件失效描述。測試工作持續3年以上且測試內容很廣,軟件失效數據對該目標軟件具有很強的代表性。
從缺陷管理工具Mantis中導出所有的軟件失效描述,并去除垃圾數據,得到6 739條失效文本描述。
考慮該軟件的特性和使用范圍,建立6種軟件異常用于軟件失效的異常分類,分別是輸入失效、輸出失效、程序失效、未滿足功能及性能要求、用戶體驗不佳及其他。同時相應地構建6個異常字典Dic.Abnormaln作為軟件異常分類器,每個異常分類字典包括的關鍵詞組合數目如表1所示。并以未滿足功能及性能要求的異常關鍵字字典Dic.Abnormal4為例進行說明,如表2所示。
將6 739條失效文本放入到軟件異常分類器中,同時給定閾值M=5,對于位置權重a進行如下設定:當關鍵詞處于文本的前1/3時,a=0.7;當關鍵詞處于文本的后1/3時,a=2;其余部分a=1。進行分類計算后,共有6 187條軟件失效被分入到6種異常中,其余545條軟件失效由于低于閾值,不屬于任何異常。每類軟件異常中的軟件失效文本描述數量如表3所示。
首先利用改進的NLPIR分詞系統對每類異常中的失效文本描述進行分詞,之后利用改進的停用詞表對分詞后的文本進行預處理,將經過處理后的文本信息進行保存。

Table 1 Abnormal classification dictionary statistics表1 異常分類字典的統計信息

Table 2 Category 4 exclusive category dictionary content(part)表2 第四類異常分類字典(部分)

Table 3 Abnormal classification statistics of software failure text表3 軟件失效文本的異常分類統計
利用基于知網的詞語語義對相似度進行計算,同時經過多次實驗,將失效文本數/30作為每類異常的類簇個數,開始對每類異常中的失效文本開展K-means聚類分析。
后續均以第四類異常為例,其中聚類個數設定為80個(2 419/30≈80),統計每個類簇的樣本數量如圖2所示。其中失效文本的樣本總和在20到40區間內的類簇個數最多,達到了44個,樣本數小于40個類簇個數為64個,占總類簇個數的80%。
對每個異常分類下的每個類簇內進行詞計算。其中對于詞語位置權重a進行如下設定:當關鍵詞處于文本的前1/3時,a=2;當關鍵詞處于文本的后1/3時,a=0.7;其余部分a=1。

Fig.2 The number of failure text in cluster圖2 類簇中失效文本個數分布
同時給定計算機領域關鍵詞字典Dic.Computer內詞語的額外值均為1,計算得出每一個失效文本的詞語的算數平均值。
以第四類異常為例,由于類簇內樣本總數小于20的類簇占總類簇的25%,樣本總數小于40的類簇個數占總類簇的80%,同時類簇內的文本有較高的相似度,因此選擇每個類簇內排序最高的10個文本作為該類簇的代表性文本。以第四類簇內的類簇22的部分代表性文本為例,如表4所示。

Table 4 Class 22 cluster representative text(part)表4 第22類簇代表性文本(部分)
利用基于知網的詞語語義相似度計算對異常分類字典Dic.Abnormaln內的關鍵詞組合進行合并,避免出現類似的失效影響。以表2為例,經過相似度計算合并后的關鍵詞組合如表5所示。例如,表2中關鍵詞詞組“內容-未漢化”和“菜單-未漢化”在計算相似度得分時較高,被合并成一個關鍵詞詞組“內容-未漢化”。
經過計算合并后的第四類異常的失效影響集合為Set(FE38)4,由162個關鍵詞詞組合并為38個關鍵詞詞組,即38個失效影響。

Table 5 The fourth class of abnormal dictionary after merger(part)表5 合并后的第四類異常字典(部分)
給定相似度閾值M為7,并對每個類簇內選擇的排序前10的文本進行相似度計算并合并,將合并后的文本集合作為該類簇的失效原因。將第四類異常分類下的80個類簇均完成相應的類簇內文本合并,合并后的集合記為Set(FC287)4,即第四類異常抽取出287個失效原因。
計算Set(FE38)4和Set(FC287)4的笛卡爾積,并記為Set(FC287*FE38)4。依次將第四類類簇的失效文本與Set(FC287*FE38)4進行相似度計算,當大于給定的閾值M=8時,即可得到一個相應的軟件失效,并利用失效原因和失效影響對失效模式進行描述。自動生成的部分第四類軟件失效模式如表6所示。

Table 6 Automatically generated failure mode(part)表6 自動生成的失效模式(部分)
根據上述計算工作,可以得出第四類異常下的軟件失效模式172條。利用同樣的方法對其他異常下的文本進行失效模式自動生成工作,最后該實驗生成軟件失效模式共計428條。
本文提出了利用“失效原因”和“失效影響”組合的形式對失效模式進行詳細描述,為此提出了基于文本挖掘的軟件失效模式自動生成方法。該失效模式的描述方式相比于現有的國內外標準,可以更好地幫助技術人員開展目標軟件的失效預防和發現等工作;同時可以解決傳統人工分析和總結失效模式中效率低下,需要專業經驗及過程繁瑣的問題。但在實際工作中,對軟件失效文本描述的異常分類強烈依賴于依據異常分類字典Dic.Abnormaln構建的分類器,因此為提高異常分類的準確率和召回率,后期需要分析更多的失效影響數據不斷訓練該分類器;同時軟件失效模式強烈依賴于發現的軟件失效的數量,失效文本描述的樣本越多,越能開展聚類工作,也就越能準確地抽取出失效模型,因此對于失效文本描述樣本數較少的軟件系統,使用該方法具有一定的局限性。
未來的研究將在本文的基礎上,不僅對關鍵的失效文本進行分析,而且擬將軟件失效中包含的其他信息,如被測對象、被測軟件行業專用詞匯、測試方法和失效嚴酷度等均作為有關信息加入到失效模式的分析中,提高失效文本聚類的準確性,并最終提高目標軟件的失效模式自動生成的能力。