本發(fā)明屬于軟件bug定位領(lǐng)域,特別提出了一種基于Stack Overflow和commit庫(kù)的bug定位方法。
背景技術(shù):
隨著開(kāi)源項(xiàng)目的逐漸流行,越來(lái)越多的軟件開(kāi)發(fā)者參與到開(kāi)源項(xiàng)目之中,開(kāi)源項(xiàng)目主持人與其他項(xiàng)目開(kāi)發(fā)者常常將項(xiàng)目的更新代碼上傳到commit庫(kù)中,修復(fù)一些在原來(lái)項(xiàng)目中存在問(wèn)題。隨著項(xiàng)目的不斷擴(kuò)大,開(kāi)發(fā)者在對(duì)開(kāi)源項(xiàng)目進(jìn)行開(kāi)發(fā)時(shí),常常會(huì)遇到新的bug問(wèn)題,為了解決遇到的bug問(wèn)題,則需要對(duì)bug進(jìn)行精確的定位。
對(duì)此,在之前的研究中,很多技術(shù)使用了LDA(Latent Dirichlet Ailocation),LSI(Latent Semantic Indexing),VSM(Vector Space Model)等模型對(duì)項(xiàng)目代碼進(jìn)行文本檢索,Laura Moreno等人對(duì)上面的模型應(yīng)用靜態(tài)分析技術(shù),即利用由軟件系統(tǒng)的源代碼中提取出的各種各樣結(jié)構(gòu)信息,如語(yǔ)法屬性、數(shù)據(jù)流從屬關(guān)系等,來(lái)加強(qiáng)相關(guān)代碼元素與查詢語(yǔ)句的關(guān)系。此外,還利用bug報(bào)告中的stack trace來(lái)進(jìn)行Bug定位的方法。對(duì)bug定位的準(zhǔn)確性做出了一些改善。
但該方法只是對(duì)單一的commit庫(kù)或者項(xiàng)目代碼,忽視了如今越來(lái)越多人參與其中的眾包知識(shí)庫(kù),bug定位的準(zhǔn)確率依舊不高。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的就在于克服上述缺陷,研制一種基于Stack Overflow和commit庫(kù)的bug定位方法。
本發(fā)明的技術(shù)方案是:
一種基于stackoverflow和commit庫(kù)的bug定位方法,其特征在于包括如下步驟:
(1)將用戶提交的問(wèn)題分解成問(wèn)題段、代碼段、stack trace段三個(gè)子段;
(2)根據(jù)步驟(1)所得到的問(wèn)題段,先進(jìn)行預(yù)處理,然后使用RAKE算法提取出關(guān)鍵字,將關(guān)鍵字對(duì)Stack Overflow問(wèn)題庫(kù)中的問(wèn)題標(biāo)簽進(jìn)行匹配,將每個(gè)問(wèn)題答案對(duì)的標(biāo)簽與問(wèn)題段的關(guān)鍵字進(jìn)行比較,計(jì)算相同標(biāo)簽所占比重,導(dǎo)出比重最高的問(wèn)題答案對(duì);
(3)根據(jù)步驟(2)得出的答案,提取出其中的代碼段,若步驟(1)分解后也 有代碼段,則整合為問(wèn)題代碼段+答案代碼段形式;
(4)對(duì)步驟(3)整合的結(jié)果,使用RAKE提取出關(guān)鍵字,設(shè)定為標(biāo)簽tag,再使用tag-LDA對(duì)commit庫(kù)進(jìn)行處理,建立主題模型,并結(jié)合標(biāo)簽進(jìn)行匹配,篩選出匹配度大于等于0.3的commit相應(yīng)代碼段;
(5)對(duì)步驟(3)得出的結(jié)果的代碼部分與步驟(4)得到的commit代碼進(jìn)行文本相似度匹配和利用由節(jié)點(diǎn)即類、class,有向線段即方法、method組成的程序依賴圖對(duì)由步驟(1)分解得到的堆棧追蹤stack trace進(jìn)行結(jié)構(gòu)相似度匹配;
(6)根據(jù)前面計(jì)算得到的文本相似度和結(jié)構(gòu)相似度進(jìn)行綜合計(jì)算,計(jì)算30%×文本相似度+70%×結(jié)構(gòu)相似度的結(jié)果,按計(jì)算結(jié)果大小進(jìn)行結(jié)果推薦。
所述步驟(1)預(yù)處理過(guò)程包括以下步驟:
a)移除數(shù)字;
b)對(duì)一些按照駝峰規(guī)則和有下劃短線相連的組合詞進(jìn)行分詞;
c)去除英語(yǔ)停用詞;
d)將詞語(yǔ)的不同形式進(jìn)行歸一化;
所述步驟(2)RAKE算法的計(jì)算公式如下:
wordScore=wordDegree(w)/wordFrequency(w)
即單詞w的得分是該單詞的度(是一個(gè)網(wǎng)絡(luò)中的概念,每與一個(gè)單詞共現(xiàn)在一個(gè)短語(yǔ)中,度就加1,考慮該單詞本身)除以該單詞的詞頻(該單詞在該文檔中出現(xiàn)的總次數(shù))。
然后對(duì)于每個(gè)候選的關(guān)鍵短語(yǔ),將其中每個(gè)單詞的得分累加,并進(jìn)行排序,RAKE將候選短語(yǔ)總數(shù)的前三分之一的認(rèn)為是抽取出的關(guān)鍵詞。
所述步驟(2)標(biāo)簽匹配的計(jì)算公式如下:
匹配度=相同標(biāo)簽個(gè)數(shù)/所有不重復(fù)標(biāo)簽個(gè)數(shù)
所述步驟(5)文本相似度的計(jì)算公式如下:
其中A,B是表示文檔一和文檔二的量化表示。文檔一和文檔二經(jīng)過(guò)分詞,去停用詞,移除數(shù)字,詞根化等預(yù)處理過(guò)程,將剩余的單詞按一定順序數(shù)值化后形成向量A,B。在信息檢索中,每個(gè)詞條擁有不同的度,一個(gè)文檔是由一個(gè)由有權(quán)值的特征向量表示的,權(quán)值的計(jì)算取決于詞條在該文檔中出現(xiàn)的頻率。余弦相似度因此可以給出兩篇文檔其主題方面的相似度。
所述步驟(5)程序依賴圖(Program Dependence Graph,PDG)的建立方法如下:程序中以類(class)作為節(jié)點(diǎn),由一個(gè)節(jié)點(diǎn)到另一個(gè)節(jié)點(diǎn)的有向線段為前一個(gè)類的方法(method)調(diào)用后一個(gè)類的方法(method)
所述步驟(5)結(jié)構(gòu)相似度的計(jì)算方法如下:
stackTrace和程序依賴圖(PDG)中某一節(jié)點(diǎn)(類class)的距離
dist(stackTrace,e)為stackTrace上的類與該節(jié)點(diǎn)之間距離的最小值
其中,e為程序依賴圖中的節(jié)點(diǎn)(類,class),λ為二者最遠(yuǎn)距離所述步驟(6)綜合文本相似度和結(jié)構(gòu)相似度方法如下:
Bug定位精準(zhǔn)度下=文本相似度*30%+結(jié)構(gòu)相似度*70%
本發(fā)明的優(yōu)點(diǎn)和效果在于:
(1)目前bug定位技術(shù)主要針對(duì)單一庫(kù)進(jìn)行檢索,功能不夠完善。而本發(fā)明利用基于眾包的知識(shí)庫(kù)(Stack Overflow),來(lái)增加bug定位的準(zhǔn)確率。
(2)本發(fā)明從文本相似度,結(jié)構(gòu)相似度兩個(gè)角度綜合匹配commit相關(guān)代碼庫(kù),給出較為準(zhǔn)確的定位。
因此,本發(fā)明主要結(jié)合了Stack Overflow問(wèn)題庫(kù)和軟件Commit庫(kù)中的信息,來(lái)對(duì)bug做出更好更精確的定位,且使用了Tag-LDA模型來(lái)對(duì)commit庫(kù)進(jìn)行匹配,使用了RAKE算法來(lái)提取問(wèn)題的關(guān)鍵字。Tag-LDA模型是對(duì)Latent Dirichlet Ailocation模型的一種拓展應(yīng)用,本發(fā)明通過(guò)Tag-LDA主題模型,推薦和文檔內(nèi)容相關(guān)的多個(gè)標(biāo)簽,并且對(duì)每個(gè)標(biāo)簽和文章相關(guān)程度的概率進(jìn)行估算,如圖2是Tag-LDA主題模型的示意圖。
RAKE(Rapid Automatic Keywords Extraction)算法對(duì)提出的問(wèn)題、以及問(wèn)題代碼進(jìn)行關(guān)鍵字提取。RAKE算法于被2010年提出,本發(fā)明應(yīng)用RAKE算法來(lái)提取關(guān)鍵詞(keyword)。
附圖說(shuō)明
圖1——本發(fā)明整體流程圖。
圖2——本發(fā)明Tag-LDA模型的示意圖。
圖3——本發(fā)明Stack Overflow上用戶提交的用戶問(wèn)題示例示意圖。
圖4——本發(fā)明Stack Overflow上的一個(gè)答案示例示意圖。
圖5——本發(fā)明Stack Overflow上的另一個(gè)答案示例示意圖。
圖6——本發(fā)明commit庫(kù)中一個(gè)示例示意圖。
圖7——本發(fā)明中在文件JSONPath.java中修改代碼的部分示意圖。
圖8——本發(fā)明中在文件JSONPath_4.java中修改代碼的部分示意圖。
具體實(shí)施方式
本發(fā)明提供一種基于Stack Overflow和commit庫(kù)的bug定位方法,下面結(jié)合附圖對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)說(shuō)明:
(1)將用戶提交的bug問(wèn)題分解成問(wèn)題段、代碼段、stack trace段三個(gè)子段。如圖3為Stack Overflow上用戶提交的一個(gè)問(wèn)題示例,為一個(gè)用戶提交的問(wèn)題,問(wèn)題文檔如下:
經(jīng)過(guò)問(wèn)題分解后,結(jié)果為
效果:將問(wèn)題分解,利于對(duì)不同性質(zhì)的文本進(jìn)行查詢,得到更準(zhǔn)確的查詢結(jié)果。
(2)根據(jù)分解得到的問(wèn)題段Json’s key’s value is string type,when only contain numbers and‘.’There are some questions#735,先進(jìn)行預(yù)處理,移除數(shù)字、停用詞,進(jìn)行分詞等操作。
得到的文本為:Json key value string type number contain question然后使用RAKE算法進(jìn)行關(guān)鍵字提取,RAKE算法計(jì)算過(guò)程為:
對(duì)Json,單詞的度wordDegree(Json)=3,詞頻wordFrequency(Json)=1
得單詞Json的得分wordScore=wordDegree(Json)/wordFrequency(Json)=3
同理,其他單詞的得分分別為
wordScore(key)=wordDegree(type)/wordFrequency(type)=4/1=4,
wordScore(value)=wordDegree(value)/wordFrequency(value)=3/1=3,
wordScore(string)=wordDegree(string)/wordFrequency(string)=2/1,
wordScore(type)=wordDegree(type)/wordFrequency(type)=2/1=2,
wordScore(contain)=wordDegree(type)/wordFrequency(type)=2/1=2,
wordScore(number)=wordDegree(type)/wordFrequency(type)=2/1=2,
wordScore(question)=wordDegree(type)/wordFrequency(type)=1/1=1
排序后選取得分大于等于2的單詞作為關(guān)鍵字,得到的關(guān)鍵字為key Json value string type contain number,共7個(gè)
將所得到的關(guān)鍵字對(duì)Stack Overflow歷史問(wèn)題庫(kù)中的每個(gè)問(wèn)題的標(biāo)簽進(jìn)行匹配,將每個(gè)歷史問(wèn)題答案對(duì)的標(biāo)簽與第二步得到的關(guān)鍵字進(jìn)行比較,計(jì)算相同標(biāo)簽所占比重。如下是問(wèn)題庫(kù)中的幾個(gè)問(wèn)題:
問(wèn)題一:
NumberFormatException when parseing in Android and JSON.String-->
double
標(biāo)簽:json string android parsing double
問(wèn)題二:
How to handle a NumberFormatException with Gson in deserialization a JSON
response
I′m reading a JSON response with Gson,which returns somtimes a NumberFormatException because an expected int value is set to an empty string.Now I′m wondering what′s the best way to handle this kind of exception.If the value is an empty string,the deserialization should be 0.
標(biāo)簽:java json deserialization gson
問(wèn)題三:
NumberFormatException in GSON when converting String to double
I am working with a JSON response that is improperly formatted.All fields are being returned as Strings.Unfortunately,l have no control over the return data.
根據(jù)公式:
匹配度=相同標(biāo)簽個(gè)數(shù)/所有不重復(fù)的標(biāo)簽個(gè)數(shù)
問(wèn)題一的匹配度為2/10=0.2,問(wèn)題二的匹配度為1/10=0.1,問(wèn)題三的匹配度為1/10=0.1。
根據(jù)計(jì)算結(jié)果,提取出匹配度最高的問(wèn)題一的問(wèn)題答案對(duì)。
效果:Stack Overflow作為基于眾包的軟件工程領(lǐng)域最受歡迎的問(wèn)答網(wǎng)站,其問(wèn)題庫(kù)中包含大量與開(kāi)發(fā)相關(guān)的問(wèn)題,利用Stack Overflow問(wèn)題庫(kù),查找bug錯(cuò)誤解答結(jié)果,給出更準(zhǔn)確的定位。
(3)將步驟2得出的最優(yōu)結(jié)果答案一中的代碼提取,與問(wèn)題的代碼段結(jié)合,整合為問(wèn)題代碼段+答案代碼段形式。
(4)對(duì)步驟3整合的結(jié)果,使用RAKE,即Rapid Automatic Keywords Extraction算法提取出關(guān)鍵字,同步驟2,推薦出關(guān)鍵字為String,JSON,java,NumberFormatException,exception,Double,將這些關(guān)鍵字設(shè)置為標(biāo)簽tag,使用tag-LDA對(duì)commit庫(kù)主題進(jìn)行處理,結(jié)合tag進(jìn)行匹配,篩選出匹配度0.3以上的commit代碼段。篩選出到如圖6的兩個(gè)commit代碼段。
效果:準(zhǔn)確快速匹配篩選出commit庫(kù)中的結(jié)果
(5)對(duì)步驟3得出的結(jié)果的代碼部分與步驟4得到的commit代碼進(jìn)行文本相似度匹配。
根據(jù)步驟4,對(duì)文件JSONPath.java和JSONPath_4.java中修改代碼的部分預(yù)處理,包括分詞,去停用詞,移除數(shù)字,詞根化等,過(guò)后:
文件JSONPath.java中修改部分的向量表示為D1
(<String,3>,<JSON,2>,<Segment,4>,<return,2>)
文件SONPath_4.java中修改部分的向量表示為D2
(<String,1>,<JSON,4>,<java,1>,<object,2>)
對(duì)步驟4所得代碼+StackTrace向量表示為D
(<String,6>,<JSON,5>,<java,1>,<NumberFormatException,3>,<exception,2>,<Double,5>)。
根據(jù)余弦公式計(jì)算文件JSONPath.java中修改部分與問(wèn)題的內(nèi)容相似度:首先量化D1和D,由于D和D1中共出現(xiàn)String,JSON,NumberFormatException,Double,Segment,return,java,exception 8個(gè)單詞,按這種順序進(jìn)行量化如下,
D1(3,2,0,0,4,2,0,0),
D(6,5,3,5,0,0,1,2)
根據(jù)余弦公式計(jì)算得cos<D,D1>=0.0921
同上處理D和D2,D和D2中共出現(xiàn)String,JSON,java,object,NumberFormatException,exception,Double 7個(gè)單詞,按順序量化如下:
D2(1,4,1,2,0,0,0)
D(6,5,1,0,3,2,5)
計(jì)算得cos<D,D2>=0.1108。
利用由節(jié)點(diǎn),即類、class,和有向線段,即方法,組成的程序依賴圖對(duì)由步驟1分解得到的堆棧追蹤,即stack trace,進(jìn)行結(jié)構(gòu)相似度匹配。
如圖7,為程序依賴圖中在文件JSONPath.java中修改代碼的部分,得結(jié)構(gòu)匹配度為0。
如圖8,為程序依賴圖中在文件JSONPath_4.java中修改代碼的部分,得結(jié)構(gòu)匹配度為1。
效果:從文本和結(jié)構(gòu)兩方面進(jìn)行匹配,分別得出相應(yīng)結(jié)果,便于下一步綜合計(jì)算。(6)根據(jù)前面計(jì)算得到的文本相似度和結(jié)構(gòu)相似度進(jìn)行綜合計(jì)算,計(jì)算30%×文本相似度+70%*結(jié)構(gòu)相似度的結(jié)果。
如步驟3,對(duì)文件JSONPath.java中修改的部分代碼
根據(jù)余弦公式計(jì)算的文本余弦匹配度cos<D,D1>=0.0921
結(jié)構(gòu)匹配度為0
綜合結(jié)果=0.02763
對(duì)文件JSONPath_4.java中修改的部分代碼
根據(jù)余弦公式計(jì)算的文本余弦匹配度cos<D,D2>=0.1108
結(jié)構(gòu)匹配度為1
綜合結(jié)果=0.73324
根據(jù)以上計(jì)算,推薦JSONPath_4.java commit部分
盡管本發(fā)明就優(yōu)選實(shí)施方式進(jìn)行了示意和描述,但本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,只要不超出本發(fā)明的權(quán)利要求所限定的范圍,可以對(duì)本發(fā)明進(jìn)行各種變化和修改。