一種針對(duì)具體軟件歷史代碼庫的詞庫自動(dòng)構(gòu)建方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明提出了一種針對(duì)具體軟件歷史代碼庫的詞庫自動(dòng)構(gòu)建方法。主要用于在軟件開發(fā)與維護(hù)過程中了解系統(tǒng)過去所有版本的代碼庫中所使用的元素以及他們之間的關(guān)系,屬于軟件理解領(lǐng)域。
【背景技術(shù)】
[0002]隨著軟件項(xiàng)目的開發(fā),其復(fù)雜程度不斷提高,對(duì)其維護(hù)和理解的難度也不斷加大。開發(fā)者和維護(hù)者的注意力需要多次的去了解過去的系統(tǒng)版本,他們經(jīng)常面臨這樣一些問題:在過去的系統(tǒng)版本中過去的開發(fā)者定義了哪些元素以及這些元素之間存在著什么樣的關(guān)系。對(duì)于另外一些開發(fā)類似系統(tǒng)的人員來說,他們可能搜索與自己即將開發(fā)的系統(tǒng)有類似功能的系統(tǒng),去模仿類似系統(tǒng)的開發(fā),他們需要對(duì)類似的系統(tǒng)做一個(gè)全面的了解。而且在軟件版本的不斷更新中,很難也沒有大量的時(shí)間去了解所有版本的詳細(xì)代碼過程。另外,對(duì)已有代碼進(jìn)行理解或者維護(hù)時(shí),需要使用代碼搜索技術(shù)搜尋感興趣的代碼,但是不知道代碼中使用什么詞語進(jìn)行標(biāo)識(shí)符的定義的,這個(gè)時(shí)候有這樣的一個(gè)詞庫參考就非常有幫助。但考慮到軟件歷史庫過于龐大,靠人工的方法去理解軟件隨時(shí)間的變化過程相當(dāng)?shù)馁M(fèi)時(shí)費(fèi)力,甚至有時(shí)是不可能完成的任務(wù)。
[0003]目前用于代碼搜索推薦相關(guān)詞組的軟件領(lǐng)域的詞庫構(gòu)建的方法有很多。典型的的詞庫是WordNet (Princeton University,2012),但是存在很多不足之處,典型的不足時(shí)許多軟件領(lǐng)域的有關(guān)系單詞在WordNet大多不存在我們想要的關(guān)系。就促進(jìn)了許多軟件領(lǐng)域的專家在研宄軟件領(lǐng)域的詞庫構(gòu)建。比如說加拿大滑鐵盧大學(xué)的JinqiuYang.Lin Tan在2013年提出的SWordNet (Yang et al,2012)構(gòu)建方法,是基于軟件上下文推斷語義相關(guān)詞匯的方法。還有Yuan Tian, David Lo等人在2014年提出的¥<^(13;[111,利用的StackOverFlow中的問答帖提煉出有關(guān)詞組。是對(duì)WordNet的一個(gè)很好的補(bǔ)充。以上兩種較好的方法都是橫向的做出相關(guān)詞組的推薦,是對(duì)整個(gè)軟件領(lǐng)域的知識(shí)庫的構(gòu)建;但是在我們針對(duì)具體的軟件系統(tǒng)進(jìn)行代碼搜索或者代碼維護(hù)的時(shí)候,應(yīng)用這些知識(shí)庫缺乏針對(duì)性,還是會(huì)造成準(zhǔn)確度不高的結(jié)果。
【發(fā)明內(nèi)容】
[0004]技術(shù)問題:本發(fā)明的目的是提供一種針對(duì)具體軟件歷史代碼庫的詞庫自動(dòng)構(gòu)建方法。主要用于在代碼搜索過程中更準(zhǔn)確地進(jìn)行代碼搜索。使項(xiàng)目的相關(guān)人員可以更方便、更高效的對(duì)軟件系統(tǒng)有個(gè)了解。
[0005]技術(shù)方案:本發(fā)明的方法是使用知識(shí)庫構(gòu)建的想法。對(duì)本軟件系統(tǒng)所有歷史代碼庫中做一個(gè)精煉,提煉出一個(gè)屬于本軟件系統(tǒng)的詞庫(知識(shí)庫),以此獲得高效的了解一個(gè)軟件系統(tǒng)的代碼構(gòu)建過程。
[0006]本發(fā)明提出的針對(duì)具體軟件歷史代碼庫的詞庫自動(dòng)構(gòu)建方法具體步驟如下:
[0007]步驟I)提取出軟件系統(tǒng)主要為java語言開發(fā)的軟件系統(tǒng)的歷史版本庫中的代碼和注釋生成獨(dú)立的文檔語料庫,并將該語料庫分為純代碼文檔庫和純注釋文檔庫;
[0008]步驟2)對(duì)語料庫中的純代碼文檔進(jìn)行預(yù)處理,包括托肯化、去停用詞,提取元素,得到單詞和詞組以及它們?cè)诖a中的支持度(Code-TF);在托肯化的過程中,利用java中的“〈子類名>+eXtendS+〈父類名 >”的語法,基于中間單詞“extends”分析出類與類之間的的繼承關(guān)系(kind-of),利用java中的“〈類名Himplements+〈接口 >”的語法,基于中間單詞“ imp I ement s ”分析出類與接口的關(guān)系(real ize-of),得到純代碼語料庫中的詞、詞組關(guān)系庫(W\WG-Code);
[0009]步驟3)對(duì)純注釋文檔進(jìn)行詞性標(biāo)注,然后進(jìn)行預(yù)處理,包括托肯化、去停用詞,提取出純代碼文檔中的單詞或詞組以及它們?cè)诩冏⑨屩械闹С侄?Comment-TF),利用注釋匹配分析出縮略關(guān)系,得到純注釋中的詞、詞組關(guān)系庫(WWG-Comment);
[0010]步驟4)將純代碼語料庫中詞、詞組關(guān)系庫與純注釋語料庫中詞、詞組關(guān)系庫進(jìn)行整合,去除相同或多余的單詞和詞組,得到整合后的詞、詞組關(guān)系庫(W\WG關(guān)系庫);
[0011]步驟5)先將步驟4)生成的詞、詞組關(guān)系庫中的詞組關(guān)系提取出來,得到詞組關(guān)系庫;其次對(duì)詞、詞組關(guān)系進(jìn)行拆分、詞干化得到純單詞文檔;再對(duì)得到的單詞進(jìn)行詞性標(biāo)注,分析出詞組關(guān)系、同義關(guān)系、縮略關(guān)系、得到單詞關(guān)系庫;最后將詞組關(guān)系庫和單詞關(guān)系庫整理出本系統(tǒng)的完整系統(tǒng)詞庫。
[0012]進(jìn)一步,步驟I)所述的提取是指分別提取純代碼、純注釋文檔:利用注釋標(biāo)識(shí)符,
包括“/*........*/”、“//”、“/**.....*/”,提取出代碼中的注釋塊,生成獨(dú)立的純代碼語料庫和純注釋語料庫。
[0013]進(jìn)一步,步驟2)所述元素包括標(biāo)識(shí)符、類名、方法名、變量名
[0014]進(jìn)一步,步驟2)中所述的托肯化是指去除標(biāo)點(diǎn)符號(hào),比如去除數(shù)字,比如“1”,“23”;提取出單詞和詞組,并且記錄單詞和詞組的支持度,支持度就是在代碼和注釋中單詞或詞組出現(xiàn)的次數(shù);標(biāo)識(shí)單詞或詞組的成份,成份是指該單詞是類名、方法名or變量名;繼承關(guān)系分析“〈子類名Hextends+〈父類名 >”,類與接口關(guān)系分析“〈類名>+implements+〈接口 >,,等。
[0015]進(jìn)一步,步驟2)中所述的去停用詞是指指去除英文停用詞,比如介詞“作!.”,“^”;代詞“it”,“he” ;冠詞“a”,“an”,“the” ;一些只由一個(gè)單詞所構(gòu)成的標(biāo)識(shí)符。
[0016]進(jìn)一步,步驟3)中所述的是對(duì)注釋語句塊進(jìn)行詞性標(biāo)注、托肯化、去停用詞等處理,提取出單詞或詞組記錄相應(yīng)的注釋中的支持度,利用注釋匹配提取單詞的縮略關(guān)系。
[0017]進(jìn)一步,步驟3)中所述的去除停用詞是指去除英文停用詞,比如介詞“作!.”,“^”;代詞“it”,“he” ;冠詞“a”,“an”,“the” ;一些只由一個(gè)單詞所構(gòu)成的標(biāo)識(shí)符。
[0018]進(jìn)一步,步驟5)中所述詞組拆分是指在詞組拆分之間進(jìn)行詞組關(guān)系標(biāo)注,詞組是指代碼中的元素是由幾個(gè)單詞組成的,對(duì)一些按照駝峰規(guī)則和有下劃短線相連的組合詞進(jìn)行分詞。
[0019]進(jìn)一步,步驟5)中所述詞干化是將每個(gè)單詞轉(zhuǎn)化為它的原型,然后利用WordNet進(jìn)行同義關(guān)系分析。
[0020]進(jìn)一步,步驟5)中所述系統(tǒng)詞庫包括以下內(nèi)容:單詞、詞組、詞性、成份、代碼中的支持度、注釋中的支持度、總的支持度、繼承關(guān)系、詞組關(guān)系、接口的實(shí)現(xiàn)關(guān)系、同義關(guān)系、縮略關(guān)系。
[0021]有益效果:本發(fā)明提出一種針對(duì)具體軟件系統(tǒng)歷史代碼庫的詞庫構(gòu)建方法,可以直接觀察到本系統(tǒng)從誕生到目前版本所有版本中使用的元素以及元素之間的關(guān)系。主要有以下一些優(yōu)點(diǎn):
[0022](I)本發(fā)明提出的一個(gè)具體軟件系統(tǒng)的詞庫(知識(shí)庫)構(gòu)建,有利于輔助推薦系統(tǒng),推薦給用戶在軟件領(lǐng)域相關(guān)的一些單詞或詞組。
[0023](2)本發(fā)明也有利于系統(tǒng)的新維護(hù)者和演化者更方便的對(duì)本系統(tǒng)所有過去版本做一個(gè)快速、高效的理解。
[0024](3)本發(fā)明詞庫的構(gòu)建有助于對(duì)WordNet進(jìn)行一個(gè)擴(kuò)充,擴(kuò)充軟件領(lǐng)域常用詞或詞組。
[0025](4)本發(fā)明也有助于軟件領(lǐng)域本體庫的構(gòu)建,可以做一個(gè)輔助的元素提取、元素關(guān)系構(gòu)建推薦。
[0026](5)與普通的詞庫相比,具體軟件歷史代碼庫的詞庫自動(dòng)構(gòu)建方法針對(duì)的是具體軟件系統(tǒng),是對(duì)代碼庫的一個(gè)精煉,不是簡單的詞庫。所以針對(duì)具體的軟件系統(tǒng)的演化或則維護(hù),本方法能夠快速的精煉出該軟件系統(tǒng)的歷史版本庫的詞庫。
【附圖說明】
[0027]圖1是本發(fā)明的總體流程圖。
[0028]圖2是元素分類圖。
[0029]圖3是純代碼語料庫中的詞、詞組關(guān)系庫示例圖。
[0030]圖4是純注