本發(fā)明用于軟件復(fù)用過(guò)程中,挖掘缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)關(guān)系,降低開(kāi)發(fā)人員搜索、閱讀及學(xué)習(xí)負(fù)擔(dān)。
背景技術(shù):
:軟件開(kāi)發(fā)過(guò)程中,軟件復(fù)用希望能夠充分利用過(guò)去應(yīng)用系統(tǒng)開(kāi)發(fā)中積累的知識(shí)和經(jīng)驗(yàn),避免重復(fù)勞動(dòng),并將開(kāi)發(fā)的重點(diǎn)集中于應(yīng)用的特有的構(gòu)成成分,提高軟件開(kāi)發(fā)效率和質(zhì)量。近年來(lái),互聯(lián)網(wǎng)涌現(xiàn)出大量的開(kāi)源項(xiàng)目托管站點(diǎn),越來(lái)越多的優(yōu)質(zhì)軟件出現(xiàn)在開(kāi)發(fā)視野當(dāng)中。在這些項(xiàng)目中,不僅僅給我們提供了豐富的代碼資源,同時(shí),一些優(yōu)秀的、成熟開(kāi)源項(xiàng)目產(chǎn)生了大量的、多種形式的文檔。缺陷報(bào)告和郵件列表就是其中的兩種。這些文檔不僅僅是項(xiàng)目開(kāi)發(fā)人員的開(kāi)發(fā)記錄和交流方式,更為其他開(kāi)發(fā)人員提供了學(xué)習(xí)、復(fù)用這些項(xiàng)目的途徑。作為常見(jiàn)的兩種項(xiàng)目文檔:缺陷報(bào)告和郵件列表,為軟件開(kāi)發(fā)人員提供了寶貴的復(fù)用資源的同時(shí),也討論并記錄了開(kāi)發(fā)人員遇到的問(wèn)題。然而,隨著開(kāi)源項(xiàng)目規(guī)模的增大,開(kāi)發(fā)人員遇到的問(wèn)題也日益復(fù)雜化,問(wèn)題的答案已經(jīng)不能夠通過(guò)單一類型文檔找到答案。例如,根據(jù)郵件列表中的討論了解問(wèn)題場(chǎng)景以及社區(qū)成員的建議,根據(jù)缺陷報(bào)告中的補(bǔ)丁查看解決問(wèn)題的方法與受影響的代碼模塊等。缺陷報(bào)告與郵件列表蘊(yùn)含著豐富的軟件項(xiàng)目信息,給開(kāi)發(fā)人員帶來(lái)了極大的便利。但這些文檔的一些特點(diǎn),也給開(kāi)發(fā)人員帶了學(xué)習(xí)、復(fù)用的障礙,主要有:一、缺陷報(bào)告與郵件列表數(shù)量巨大。二、缺陷報(bào)告與郵件列表內(nèi)容繁雜。三、缺陷報(bào)告與郵件列表關(guān)聯(lián)復(fù)雜。因此,為了幫助開(kāi)發(fā)人員更好地理解與復(fù)用軟件資源,需要挖掘缺陷報(bào)告與郵件列表的關(guān)聯(lián)關(guān)系,并提供基于二者關(guān)聯(lián)關(guān)系的文檔檢索接口。綜上所述,缺陷報(bào)告與郵件列表蘊(yùn)含豐富的軟件項(xiàng)目信息,但這些信息數(shù)量巨大,內(nèi)容繁雜,并且關(guān)聯(lián)復(fù)雜,人工整理需要耗費(fèi)大量的時(shí)間與精力,且跨文檔定位開(kāi)發(fā)者所關(guān)注的信息十分困難。因此,為了幫助開(kāi)發(fā)人員更好地復(fù)用開(kāi)源項(xiàng)目資源,需要提供一種基于缺陷報(bào)告與郵件列表的語(yǔ)義關(guān)聯(lián)挖掘工具。技術(shù)實(shí)現(xiàn)要素:針對(duì)現(xiàn)有技術(shù)中存在的技術(shù)問(wèn)題,本發(fā)明的目的在于提供一種缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法。本發(fā)明的技術(shù)方案為:一種缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法,其步驟為:1)對(duì)獲取的目標(biāo)項(xiàng)目的缺陷報(bào)告與郵件列表進(jìn)行解析,得到缺陷報(bào)告的堆棧信息、代碼片段、正文文本和郵件列表的堆棧信息、代碼片段、正文文本;2)文檔顯式語(yǔ)義關(guān)聯(lián)挖掘單元根據(jù)解析結(jié)果識(shí)別缺陷報(bào)告和郵件列表之間的顯式語(yǔ)義關(guān)聯(lián),包括引用關(guān)聯(lián)和共同代碼元素關(guān)聯(lián);3)文檔隱式語(yǔ)義關(guān)聯(lián)挖掘單元根據(jù)解析結(jié)果識(shí)別缺陷報(bào)告和郵件列表之間的隱式語(yǔ)義關(guān)聯(lián),包括相似關(guān)聯(lián)和潛在語(yǔ)義關(guān)聯(lián)。進(jìn)一步的,所述引用關(guān)聯(lián)包括缺陷報(bào)告引用的關(guān)聯(lián)和郵件引用的關(guān)聯(lián)。進(jìn)一步的,獲取所述缺陷報(bào)告引用的關(guān)聯(lián)的方法為:對(duì)郵件列表的正文文本進(jìn)行模式匹配,判斷是否包含對(duì)缺陷報(bào)告的引用鏈接或缺陷報(bào)告的關(guān)鍵名;若包含,則識(shí)別關(guān)鍵名或提取引用鏈接中的關(guān)鍵名信息;然后根據(jù)關(guān)鍵名定位相應(yīng)的缺陷報(bào)告,并建立引用關(guān)聯(lián)。進(jìn)一步的,獲取所述郵件引用的關(guān)聯(lián)的方法為:對(duì)缺陷報(bào)告的正文文本進(jìn)行模式匹配,判斷是否包含對(duì)郵件的引用信息;若包含,則提取引用鏈接中的Message-ID信息;然后根據(jù)Message-ID定位相應(yīng)的郵件,并建立引用關(guān)聯(lián)。進(jìn)一步的,若一封郵件的正文文本中與一缺陷報(bào)告的正文文本中存在相同的代碼元素,即認(rèn)為兩者存在所述共同代碼元素關(guān)聯(lián)。進(jìn)一步的,根據(jù)代碼元素的來(lái)源挖掘所述共同代碼元素關(guān)聯(lián);首先對(duì)代碼元素進(jìn)行解析,其中,如果代碼元素來(lái)源為目標(biāo)項(xiàng)目的代碼元素,且為長(zhǎng)代碼元素,則:1)將該長(zhǎng)代碼元素解析成AST;2)遍歷AST節(jié)點(diǎn),讀取節(jié)點(diǎn)上的元素;3)對(duì)每個(gè)節(jié)點(diǎn),提取其所在包名信息并連接,則得到長(zhǎng)代碼元素集合;如果代碼元素來(lái)源為目標(biāo)項(xiàng)目的代碼元素,且為短代碼元素,則1)采用將該短代碼元素解析成AST;2)遍歷AST節(jié)點(diǎn),讀取節(jié)點(diǎn)上的元素,得到初始代碼元素集合;3)對(duì)該初始代碼元素集合中的元素去重,并過(guò)濾停用詞;如果代碼元素來(lái)源為其他項(xiàng)目的代碼元素,則采用命名規(guī)則的方法進(jìn)行解析;然后根據(jù)上述解析結(jié)果,判定封郵件的正文文本中與缺陷報(bào)告的正文文本中是否存在共同代碼元素關(guān)聯(lián)。進(jìn)一步的,挖掘所述隱式語(yǔ)義關(guān)聯(lián)的方法為:1)根據(jù)郵件和缺陷報(bào)告中的堆棧信息,計(jì)算郵件和缺陷報(bào)告的相似度SIM1;2)根據(jù)郵件和缺陷報(bào)告的正文文本,計(jì)算郵件和缺陷報(bào)告的相似度SIM2;3)基于相似度SIM1和SIM2,得到郵件和缺陷報(bào)告的綜合相似度SIM;然后根據(jù)綜合相似度SIM確定存在相似關(guān)聯(lián)的郵件和缺陷報(bào)告;4)獲取每一文檔的查詢向量;其中,第i個(gè)文檔的查詢向量為Vi=<Wi,1,Wi,2,...,Wi,k,...,Wi,n>,n為所有文檔出現(xiàn)詞匯總數(shù),Wi,k指第k個(gè)詞匯在該文檔i中出現(xiàn)的次數(shù);所述文檔包括郵件和缺陷報(bào)告;5)按照文檔i對(duì)應(yīng)的查詢向量,計(jì)算文檔i與其他所有文檔的余弦相似度,并按照降序進(jìn)行排序;然后取排序結(jié)果前若干個(gè)文檔為與文檔i存在潛在語(yǔ)義關(guān)聯(lián)的文檔。進(jìn)一步的,利用公式計(jì)算查詢向量Vi=<Wi,1,Wi,2,...,Wi,n>和文檔j的查詢向量Vj=<Wj,1,Wj,2,...,Wj,n>的余弦相似度Similarituy(Vi,Vj)。進(jìn)一步的,采用圖數(shù)據(jù)Neo4j表現(xiàn)挖掘出的缺陷報(bào)告與郵件列表之間的語(yǔ)義關(guān)聯(lián)。進(jìn)一步的,對(duì)缺陷報(bào)告與郵件列表進(jìn)行解析的方法為:21)首先過(guò)濾掉缺陷報(bào)告與郵件列表中的冗余文本內(nèi)容;22)根據(jù)堆棧信息特征,從步驟21)處理后的缺陷報(bào)告與郵件列表中提取堆棧信息;23)從步驟22)處理后的缺陷報(bào)告與郵件列表中提取代碼片段;然后將剩余文本為正文文本。本發(fā)明涉及的主要內(nèi)容包括:一、獲取、解析缺陷報(bào)告與郵件列表;二、挖掘缺陷報(bào)告與郵件列表中存在的顯式語(yǔ)義關(guān)聯(lián);三、挖掘缺陷報(bào)告與郵件列表中存在的隱式語(yǔ)義關(guān)聯(lián)。本文缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法包含四個(gè)子單元:文檔獲取解析單元、文檔顯式語(yǔ)義關(guān)聯(lián)挖掘單元、文檔隱式語(yǔ)義關(guān)聯(lián)挖掘單元和文檔檢索單元。優(yōu)化的,在缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法中,文檔獲取解析單元,工作流程主要包含以下步驟:步驟1:確定文檔資源網(wǎng)絡(luò)地址,采取定點(diǎn)式爬取,獲取缺陷報(bào)告與郵件列表文檔資源。步驟2:確定獲取文檔的數(shù)據(jù)格式,其中缺陷報(bào)告為JSON格式;郵件列表為mbox格式。步驟3:按照文檔格式,利用工具org.json,解析格式為JSON缺陷報(bào)告;利用ApacheJames(JavaApacheMailEnterpriseServer)的Mime4J類庫(kù)中的MimeStreamParser解析器處理單獨(dú)的郵件,并存儲(chǔ)解析出的文本(包括郵件和缺陷報(bào)告兩種類型,并按照其類型存儲(chǔ))。步驟4:從步驟3中解析出的郵件和缺陷報(bào)告兩種類型文本中識(shí)別以下內(nèi)容:a).代碼片段。缺陷報(bào)告與郵件列表中的代碼片段經(jīng)常不是完整的可編譯單元,給代碼識(shí)別帶了一定困難。本方法針對(duì)java語(yǔ)法,實(shí)現(xiàn)了基于人工規(guī)則的代碼片段識(shí)別工具,識(shí)別過(guò)程如下:1.將類定義、方法定義、條件判斷、賦值語(yǔ)句等具有程序特性的關(guān)鍵詞作為集合K={class,if,else,for,while,switch,“=”,……},利用正則表達(dá)式描述方法定義的基本文法格式F。2.對(duì)每個(gè)文本段逐行分析,若此行包含Java關(guān)鍵字或Java語(yǔ)言的特有符號(hào)(集合K),或符合方法定義F中的文法格式,則判定為代碼行。3.若以“//”開(kāi)始或以“/*”開(kāi)始,“*/”結(jié)束,則判定為注釋部分。統(tǒng)計(jì)注釋行數(shù)。4.若代碼行數(shù)加注釋行數(shù)超過(guò)文本段總行數(shù)的一半,并且段落中出現(xiàn)了大括號(hào)或小括號(hào),則判定此段落為代碼片段。b).堆棧信息。指的是程序執(zhí)行出錯(cuò)時(shí)斷點(diǎn)的堆棧調(diào)用信息報(bào)告。堆棧信息主要通過(guò)以下特征文本行進(jìn)行判定:1.異常聲明行:位于文本段開(kāi)頭,包括“java.lang....exception:”等詞。2.位于行:以“at”開(kāi)頭,指明出錯(cuò)是的斷點(diǎn)位置,位于文本段的主體部分。3.省略行:由于有的堆棧信息特別長(zhǎng),但是實(shí)際引起出錯(cuò)的只是頂部的幾個(gè)方法因此經(jīng)常將過(guò)長(zhǎng)的堆棧信息用省略號(hào)“…”表示,以“more”結(jié)尾,跟在“at”語(yǔ)句后面。4.導(dǎo)致行:以“causedby:”開(kāi)頭,后跟一系列“at”語(yǔ)句。若文本段落上述特征行出現(xiàn)超過(guò)一定的閾值,則判定此段落為堆棧信息。c).冗余文本。主要出現(xiàn)在郵件中,多為郵件開(kāi)始和結(jié)束的問(wèn)候語(yǔ)、致謝和郵件簽名。若是回復(fù)郵件,則還包含對(duì)原郵件的引用內(nèi)容。d).正文文本。除上述三種,其余內(nèi)容均被視為正文文本類型。識(shí)別順序按照冗余文本→堆棧信息→代碼片段→正文文本。即,首先過(guò)濾冗余文本內(nèi)容,減少噪音的影響。之后,根據(jù)堆棧信息特征,提取堆棧信息。然后,提取代碼片段。最后剩余文本為正文文本。其中,堆棧信息、代碼片段、正文文本作為三種有效文本,進(jìn)行下述解析。優(yōu)化的,在缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法中,文檔顯式語(yǔ)義關(guān)聯(lián)挖掘單元,主要用于識(shí)別缺陷報(bào)告和郵件列表之間的顯式語(yǔ)義關(guān)聯(lián),包括引用關(guān)聯(lián)和共同代碼元素關(guān)聯(lián)。工作流程主要包含以下步驟:步驟1:挖掘引用關(guān)聯(lián)。缺陷報(bào)告與郵件列表經(jīng)常相互引用內(nèi)容,以補(bǔ)充說(shuō)明問(wèn)題信息。挖掘引用關(guān)聯(lián),即指挖掘兩者間的引用關(guān)系,分為引用缺陷報(bào)告和引用郵件,建立關(guān)聯(lián)方法如下:a).引用缺陷報(bào)告。正文文本可通過(guò)關(guān)鍵名與鏈接兩種方式引用缺陷報(bào)告。首先,缺陷報(bào)告的關(guān)鍵名包含大寫(xiě)的開(kāi)源項(xiàng)目名簡(jiǎn)稱與數(shù)字,并以連字符相接,如“LUCENE-352”。其次,缺陷跟蹤系統(tǒng)中的每個(gè)缺陷報(bào)告都對(duì)應(yīng)一個(gè)特定的鏈接,鏈接模式如下:[網(wǎng)絡(luò)協(xié)議]://[報(bào)告類型].[社區(qū)站點(diǎn)]/[缺陷跟蹤系統(tǒng)名]/[查看方式]/[關(guān)鍵名]例如,對(duì)Lucene的一封缺陷報(bào)告的引用鏈接如下:http://issues.apache.org/jira/browse/LUCENE-352基于以上模式特征,缺陷報(bào)告引用的關(guān)聯(lián)挖掘分為以下幾個(gè)步驟:1)對(duì)郵件列表的正文文本以模式匹配的方式判斷是否包含對(duì)缺陷報(bào)告的引用鏈接或缺陷報(bào)告的關(guān)鍵名;2)若包含,則直接識(shí)別關(guān)鍵名,或提取引用鏈接中的關(guān)鍵名信息;3)根據(jù)關(guān)鍵名定位相應(yīng)的缺陷報(bào)告,并建立引用關(guān)聯(lián)。b).引用郵件。郵件的唯一標(biāo)識(shí)符Message-ID的形式為<local-part@domian>。其中l(wèi)ocal-part是郵件ID,domian是指定這個(gè)ID的主機(jī)域名。ID的唯一性由指定ID的主機(jī)負(fù)責(zé),并無(wú)規(guī)定要如何產(chǎn)生。觀察可知,由于郵件的Message-ID不如缺陷報(bào)告的關(guān)鍵名直觀簡(jiǎn)潔,如“<c68e39170909240919g11492b52qc65667ac4c5431d5@mail.gmail.com>”。因此,對(duì)郵件的引用通常只使用鏈接的方式。每封郵件對(duì)應(yīng)一個(gè)特定的鏈接,鏈接的模式如下:[網(wǎng)絡(luò)協(xié)議]://[歸檔服務(wù)器名].[社區(qū)站點(diǎn)]/[歸檔格式]/[郵件列表名]/[歸檔文件名]/[郵件ID]例如,對(duì)Lucene的一封郵件的引用鏈接如下:http://mail-archives.apache.org/mod_mbox/lucene-java-user/200808.mbox/<48a3076a.2679420a.1c53.ffffa5c4%40mx.google.com>基于以上模式特征,郵件引用的關(guān)聯(lián)挖掘分為以下幾個(gè)步驟:1)對(duì)缺陷報(bào)告的正文文本以模式匹配的方式判斷是否包含對(duì)郵件的引用信息,即引用鏈接;2)若包含,則提取引用鏈接中的Message-ID信息;3)根據(jù)Message-ID定位相應(yīng)的郵件,并建立引用關(guān)聯(lián)。步驟2:挖掘共同代碼元素關(guān)聯(lián)。若一封郵件和一個(gè)缺陷報(bào)告文件的文本中存在相同的代碼元素,即認(rèn)為兩者存在共同代碼元素關(guān)聯(lián)。根據(jù)關(guān)聯(lián)的代碼元素的來(lái)源,可以分為兩種:本項(xiàng)目(Lucene)代碼元素和其他項(xiàng)目(非Lucene)代碼元素。針對(duì)這兩種情況分別采用源碼解析與命名規(guī)則的方法進(jìn)行解析,解析過(guò)程如下:a).源碼解析,用于解析本項(xiàng)目中代碼元素。以Lunene4.0為例,由于源碼中有很多的類名、方法名都是自然語(yǔ)言的常用詞,會(huì)對(duì)關(guān)聯(lián)挖掘產(chǎn)生噪音,為避免這種情況,本方法將代碼元素分為長(zhǎng)代碼元素和短代碼元素進(jìn)行解析,解析過(guò)程如下:長(zhǎng)代碼元素,不僅包括類名與方法名等,還包括該類或方法所在的完整包名,如:org.apache.lucene.analysis.CachingTokenFilter。具體分為以下步驟:1)采用EclipseJDT提供的ASTParser將java源碼解析成AST;2)遍歷AST節(jié)點(diǎn),讀取節(jié)點(diǎn)上的類、方法、接口等元素;3)對(duì)每個(gè)節(jié)點(diǎn),提取其所在包名信息,以“.”連接,則得到長(zhǎng)代碼元素集合。短代碼元素,僅包含AST當(dāng)前結(jié)點(diǎn)的名字,如CashingTokenFilter。為了消除很多方法名都是自然語(yǔ)言常用詞的影響,需要進(jìn)一步過(guò)濾。具體步驟如下:1)采用EclipseJDT提供的ASTParser將java源碼解析成AST;2)遍歷AST節(jié)點(diǎn),讀取節(jié)點(diǎn)上的類、方法等元素,得到初始代碼元素集合;3)對(duì)集合元素去重,并過(guò)濾集合中的停用詞;4)人工篩選,刪除意義不大的詞語(yǔ),如get、size、value等元素。b).命名規(guī)則識(shí)別,用于解析其他項(xiàng)目代碼元素。在Java語(yǔ)言中,變量名遵循“駱駝拼寫(xiě)法”命名規(guī)則以增強(qiáng)其可讀性,具體有以下三種:1、小駝峰式拼寫(xiě)法。第一個(gè)詞首字母小寫(xiě),其后每個(gè)詞首字母大寫(xiě),如:firstName。2、大駝峰式拼寫(xiě)法。第一個(gè)詞以及后面每個(gè)詞的首字母均大寫(xiě),例如:FirstName。3、非標(biāo)準(zhǔn)的駝峰式字符串,即帶有連續(xù)大寫(xiě)字母與數(shù)字,如UPPER2000UPPER、hasABREVIATIONEmbedded、Client2Server2012。針對(duì)Java變量的“駱駝拼寫(xiě)法”命名規(guī)則,采用正則表達(dá)式"?<!(^|[A-Z0-9]))(?=[A-Z0-9])|(?<!(^|[^A-Z]))(?=[0-9])|(?<!(^|[^0-9]))(?=[A-Za-z])|(?<!^)(?=[A-Z][a-z])",即可識(shí)別全部該方法定義的變量名。當(dāng)兩個(gè)文檔提取出相同的代碼元素時(shí),即判定兩個(gè)文檔存在共同代碼元素關(guān)聯(lián)。優(yōu)化的,在缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法中,文檔隱式語(yǔ)義關(guān)聯(lián)挖掘單元,主要用于識(shí)別缺陷報(bào)告和郵件列表之間的隱式語(yǔ)義關(guān)聯(lián),主要包括相似關(guān)聯(lián)和潛在語(yǔ)義關(guān)聯(lián)工作流程主要包含以下步驟:步驟1:挖掘郵件和缺陷報(bào)告的相似關(guān)聯(lián)。步驟1.1:分別提取郵件和缺陷報(bào)告中的堆棧信息,包括異常類型名與出錯(cuò)位置的函數(shù)簽名,計(jì)算其相似度SIM1。步驟1.2:結(jié)合自然語(yǔ)言的多樣性,計(jì)算正文文本的相似度SIM2。步驟1.3:基于兩種相似度SIM1和SIM2,采用啟發(fā)式規(guī)則,計(jì)算文檔的綜合相似度;然后根據(jù)綜合相似度SIM確定存在相似關(guān)聯(lián)的郵件和缺陷報(bào)告。步驟2:挖掘潛在語(yǔ)義關(guān)聯(lián)。挖掘已解決的缺陷報(bào)告的補(bǔ)丁信息對(duì)語(yǔ)義關(guān)聯(lián)的貢獻(xiàn)度。步驟2.1:建立索引。對(duì)所有的缺陷報(bào)告與郵件列表建立倒排索引。步驟2.2:獲取查詢向量。假設(shè)所有文檔出現(xiàn)詞匯共n個(gè),并進(jìn)行編號(hào)。則第i個(gè)文檔(郵件或缺陷報(bào)告)經(jīng)過(guò)處理后的查詢向量為Vi=<Wi,1,Wi,2,...,Wi,n>,Wi,k指第k個(gè)詞匯在文檔i中出現(xiàn)的次數(shù)。缺陷報(bào)告的總結(jié)往往能夠突出文檔的中心思想,而補(bǔ)丁文件則解決了此缺陷所需修改的代碼信息。因此本方法結(jié)合缺陷報(bào)告的總結(jié)和補(bǔ)丁文件中的代碼元素,進(jìn)行單詞切分、停用詞過(guò)濾、詞干提取處理后,獲得該缺陷報(bào)告的查詢向量。步驟2.3:建立潛在關(guān)聯(lián)。按照文檔對(duì)應(yīng)的查詢向量,計(jì)算文檔D與其他所有文檔的余弦相似度,并按照降序進(jìn)行排序。取排序結(jié)果前3個(gè)文檔,判斷與文檔D存在潛在語(yǔ)義關(guān)聯(lián)。循環(huán)建立所有文檔的潛在語(yǔ)義關(guān)聯(lián)。其中,計(jì)算查詢向量Vi=<Wi,1,Wi,2,...,Wi,n>和Vj=<Wj,1,Wj,2,...,Wj,n>余弦相似度的方法如下:優(yōu)化的,在缺陷報(bào)告與郵件列表語(yǔ)義關(guān)聯(lián)挖掘方法中,文檔檢索單元,采用圖數(shù)據(jù)Neo4j,直觀表現(xiàn)挖掘出的缺陷報(bào)告與郵件列表之間的語(yǔ)義關(guān)聯(lián)。同時(shí)對(duì)外提供檢索接口,方便獲取缺陷報(bào)告與郵件列表。方法采用搜索引擎的PageRank算法,將算法的圖數(shù)據(jù)結(jié)構(gòu)中的文檔結(jié)點(diǎn)類比網(wǎng)頁(yè),語(yǔ)義關(guān)聯(lián)邊類比超鏈接,根據(jù)文檔之間的語(yǔ)義關(guān)聯(lián)關(guān)系對(duì)檢索結(jié)果進(jìn)行重排序。由于缺陷報(bào)告與郵件文檔數(shù)量巨大,為了提高重排序效率,本文僅對(duì)信息檢索的前100個(gè)結(jié)果進(jìn)行重排序工作。與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:以項(xiàng)目Lucene為例,通過(guò)以下實(shí)驗(yàn),對(duì)比于現(xiàn)有的技術(shù),本方法對(duì)搜索效率帶來(lái)的提升。首先從stackoverflow上刪除出Lucene相關(guān)的問(wèn)題集Sq,篩選原則為:?jiǎn)栴}帶有Lucene標(biāo)簽、問(wèn)題投票數(shù)為正、問(wèn)題答案中提及缺陷報(bào)告或郵件列表鏈接。然后,根據(jù)本方法建立的語(yǔ)義關(guān)聯(lián)圖,返回相關(guān)缺陷報(bào)告與郵件列表集合Ba,作為搜索結(jié)果。最后計(jì)算兩個(gè)值,衡量本方法的優(yōu)劣,兩個(gè)值分別為:召回率(Recall)和平均倒數(shù)排名(MRR)。兩個(gè)值得計(jì)算方法如下:1.召回率的計(jì)算評(píng)估基于語(yǔ)義關(guān)聯(lián)的檢索結(jié)果是否包含最佳答案涉及的文檔,即MC:定義Recall如下:MCi為第i個(gè)文檔2.平均倒數(shù)排名的計(jì)算采用平均倒數(shù)排名MRR指標(biāo)來(lái)衡量檢索效果。即把最佳答案涉及的缺陷報(bào)告或郵件列表在檢索系統(tǒng)中的排序取倒數(shù)作為它的準(zhǔn)確度,再對(duì)所有問(wèn)題的結(jié)果取平均值。MRR值計(jì)算公式如下:|Q|為檢索結(jié)果文檔的個(gè)數(shù),ranki為文檔i的排名實(shí)驗(yàn)一共有三組,一組對(duì)照組,兩組實(shí)驗(yàn)組。對(duì)照組是使用SVM文本檢索方法的Base組;實(shí)驗(yàn)組一使用基于已分類文檔的SVM檢索方法選取出候選答案,實(shí)驗(yàn)組二在實(shí)驗(yàn)組一的基礎(chǔ)上再考慮語(yǔ)義關(guān)聯(lián)對(duì)候選答案的影響,對(duì)結(jié)果進(jìn)行重排序。兩個(gè)實(shí)驗(yàn)組分別是Base+Classification組、Base+Classification+Relationship組。每一組的任務(wù)相同,即根據(jù)問(wèn)題集Sq中的問(wèn)題從所有缺陷報(bào)告與郵件文檔中檢索相關(guān)的文檔。實(shí)驗(yàn)結(jié)果如表1:表1為實(shí)驗(yàn)結(jié)果表方法RecallMRRBase22.22%8.05%Base+Classification26.98%13.27%Base+Classifcation+Relationship39.68%19.95%從實(shí)驗(yàn)結(jié)果可以看出,引入語(yǔ)義關(guān)聯(lián)關(guān)系后,系統(tǒng)對(duì)文檔的檢索召回率相比于Base方法有了較大的提升。在檢索結(jié)果的排名上,Base方法的MRR值很低,即相關(guān)文檔的排名太靠后,對(duì)開(kāi)發(fā)人員的幫助不大。經(jīng)過(guò)文本分類處理與語(yǔ)義關(guān)聯(lián)挖掘后,MRR值由有明顯提高,有利于高效地定位相關(guān)的缺陷報(bào)告與郵件列表,幫助開(kāi)發(fā)人員更好地復(fù)用軟件資源。附圖說(shuō)明圖1為挖掘相似關(guān)聯(lián)工作流程。圖2為挖掘潛在語(yǔ)義關(guān)聯(lián)工作流程。具體實(shí)施方式本實(shí)施實(shí)例中,挖掘項(xiàng)目Lucene的缺陷報(bào)告和郵件列表的語(yǔ)義關(guān)聯(lián),并利用圖數(shù)據(jù)庫(kù)Neo4j,存儲(chǔ)和查詢關(guān)聯(lián),以驗(yàn)證方法的效果。按照前文的敘述,方法將按照順序獲取資源→挖掘顯式語(yǔ)義→挖掘隱式語(yǔ)義→查詢文檔執(zhí)行。文檔獲取解析單元執(zhí)行步驟如下:步驟1:構(gòu)造文件地址,如“http://mail-archives.apache.org/mod_mbox/lucene-general/201509.mbox”,按照地址分別對(duì)兩類文檔進(jìn)行爬取。步驟2:按照J(rèn)son格式,解析項(xiàng)目缺陷報(bào)告,并將解析文本按照種類,存儲(chǔ)在數(shù)據(jù)庫(kù)Neo4j中。步驟3:按照MIME4J格式,解析項(xiàng)目郵件列表,將解析文本按照種類,存儲(chǔ)在數(shù)據(jù)庫(kù)Neo4j中。文檔顯示語(yǔ)義關(guān)聯(lián)挖掘單元執(zhí)行步驟如下:步驟1:識(shí)別文檔中的引用鏈接,挖掘引用關(guān)聯(lián)。包括缺陷報(bào)告內(nèi)容引用郵件列表和郵件列表引用缺陷報(bào)告兩種引用關(guān)聯(lián)。步驟2:識(shí)別文檔中的代碼元素關(guān)聯(lián),采用源碼解析方法識(shí)別項(xiàng)目Lucene的代碼元素;采用命名規(guī)則的方法識(shí)別非Lucene代碼元素,過(guò)程如下:步驟2.1:源碼解析。主要用于識(shí)別項(xiàng)目Lucene的代碼元素,包括對(duì)長(zhǎng)代碼元素和段代碼元素的識(shí)別。.長(zhǎng)代碼元素。使用EclipseJDTAST對(duì)項(xiàng)目源碼進(jìn)行解析,識(shí)別源碼中的長(zhǎng)代碼元素(包含該類或方法所在的完整包名),如org.apache.lucene.analysis.CachingTokenFilter。短代碼元素。用EclipseJDTAST對(duì)項(xiàng)目源碼進(jìn)行解析,別源碼中的長(zhǎng)代碼元素(僅含類或方法名),如CachingTokenFilter。步驟2.2:利用命名規(guī)則方法識(shí)別非Lucene項(xiàng)目的代碼元素。按照“駱駝法”命名規(guī)則,識(shí)別符合該種命名規(guī)則的變量名。步驟2.3:若文中中包含相同的代碼元素,則判定兩個(gè)文檔之間存在代碼關(guān)聯(lián),并在Neo4j數(shù)據(jù)中,建立文檔對(duì)應(yīng)節(jié)點(diǎn)之間的關(guān)聯(lián)。文檔隱式語(yǔ)義關(guān)聯(lián)挖掘單元,主要用于:一、挖掘相似關(guān)聯(lián),主要包括以下步驟(工作流程圖如圖1所示):步驟1:計(jì)算堆棧信息相似度。提取文檔i的堆棧信息的異常類型名和出錯(cuò)位置的函數(shù)簽名,組成集合STi。則文檔i和文檔j(兩個(gè)文檔分別為郵件和缺陷報(bào)告)的堆棧信息相似度為:步驟2:計(jì)算正文文本相似度。經(jīng)過(guò)對(duì)文本內(nèi)容進(jìn)行單詞切分、停用詞過(guò)濾、詞干提取處理后。按照公式:計(jì)算文檔D、Q的相似度。其中q1至qn為文檔Q處理后的關(guān)鍵字;f(qi,D)為文檔Q中的第i個(gè)分詞qi在文檔D中詞頻;avgdl為文檔集合中的平均文檔長(zhǎng)度;其中,N是所有文檔的數(shù)量,n(qi)為包含關(guān)鍵詞qi的文檔數(shù)量;k1和b為調(diào)節(jié)參數(shù)。步驟3:計(jì)算綜合相似度。去文檔D,按照上述步驟1與步驟2中的方法,分別計(jì)算文檔D與其余所有文檔的堆棧信息相似度和正文文本相似度,取兩者的平均值作為文檔D與其他文檔的綜合相似度,并進(jìn)行降序排列。取前10個(gè)文檔,判定與文檔D存在相似關(guān)聯(lián),并在Neo4j數(shù)據(jù)中,建立文檔對(duì)應(yīng)結(jié)點(diǎn)之間的關(guān)聯(lián)。二、挖掘潛在語(yǔ)義關(guān)聯(lián),主要包括以下步驟(工作流程圖如圖2所示):步驟1:為L(zhǎng)ucene項(xiàng)目的缺陷報(bào)告和郵件列表建立倒排索引。步驟2:根據(jù)缺陷報(bào)告的總結(jié)和補(bǔ)丁文件的代碼查詢,檢索文檔。步驟3:計(jì)算文檔D與其他所有文檔的相似度。計(jì)算公式為:其中Vi、Vj分別為文檔i、j的查詢向量。之后按照相似度大小降序排序,取排名前3個(gè)文檔,判定它們與文檔D存在潛在語(yǔ)義關(guān)聯(lián),并在Neo4j數(shù)據(jù)庫(kù)中,建立文檔所對(duì)應(yīng)節(jié)點(diǎn)之間的關(guān)聯(lián)。文檔檢索單元,用于驗(yàn)證方法建立關(guān)聯(lián)的效果。驗(yàn)證的方式為:從Stackoverflow上選取相關(guān)問(wèn)題,利用Neo4j,檢索文檔,對(duì)比問(wèn)題原有答案,確定是否能夠解決問(wèn)題。主要包括以下步驟:步驟1:篩選問(wèn)題集。篩選的原則是:?jiǎn)栴}帶有Lucene標(biāo)簽、問(wèn)題投票數(shù)為正、問(wèn)題答案中提及缺陷報(bào)告或郵件列表鏈接。步驟2:利用數(shù)據(jù)Neo4j,根據(jù)問(wèn)題,構(gòu)造查詢,獲取結(jié)果。步驟3:根據(jù)檢索結(jié)果,計(jì)算召回率(Recall)和平均倒數(shù)排名(MRR)。當(dāng)前第1頁(yè)1 2 3