一種面向軟件維護的修改請求重新定制的方法
【專利摘要】本發(fā)明公開了軟件工程領(lǐng)域內(nèi)的一種面向軟件維護的修改請求重新定制的方法,包括以下步驟:預(yù)處理→同義詞擴充→分割標識符→匹配→排序,本發(fā)明可以有效幫助開發(fā)人員制定好的查詢語句,從而更準確地定位到要進行維護的代碼段,以提高軟件維護的效率,可用于軟件開發(fā)維護中。
【專利說明】一種面向軟件維護的修改請求重新定制的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種軟件維護方法,特別涉及一種軟件修改請求重新定制的方法。
【背景技術(shù)】
[0002]在軟件發(fā)布后,用戶可能因為增加新的需求、發(fā)現(xiàn)新的軟件故障、適應(yīng)新的環(huán)境等會提出新的修改請求,這時需要對所開發(fā)的軟件進行維護和升級。隨著軟件系統(tǒng)的不斷演化,為了執(zhí)行軟件維護的任務(wù)而對代碼進行定位變得越來越困難。維護者所寫的修改請求語言通常都與開發(fā)者所用的詞匯不一樣,因此需要花費很大的時間和精力在制定準確的查詢上,降低了維護軟件的效率?,F(xiàn)存的使用自然語言查詢的靜態(tài)代碼搜索技術(shù)對維護者的幫助并不是很大,尤其是當一個維護者不能準確地寫出關(guān)于源代碼的修改請求的時候,這些靜態(tài)代碼搜索技術(shù)就顯得很糟糕。因為傳統(tǒng)的靜態(tài)代碼搜索技術(shù)只是單純將用戶輸入的所有單詞與源代碼進行匹配,只要有一個單詞在某個標識符中出現(xiàn),就將該結(jié)果返回給用戶,如果用戶輸入的查詢語句有很大的冗余度,則可能有很多無用的結(jié)果會被反饋給用戶,給用戶判斷結(jié)果是否相關(guān)造成了很大困難;如果用戶輸入的查詢語句在源代碼無法匹配到,則沒有結(jié)果返回給用戶,而讓用戶自己制定查詢語句又給用戶造成了很大的困擾。因此,本發(fā)明提出了面向軟件維護的修改請求重新定制方法;標識符在編程語言中,是用戶編程時使用的名字,對于集合、常量、函數(shù)、語句塊也有名字,統(tǒng)統(tǒng)稱之為標識符。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的是提供一種面向軟件維護的修改請求重新定制的方法,提高數(shù)據(jù)提取的精度,方便用戶查詢語句、識別源程序。
[0004]本發(fā)明的目的是這樣實現(xiàn)的:一種面向軟件維護的修改請求重新定制的方法,包括以下步驟:
步驟I)預(yù)處理:對于用戶輸入的自然語言進行分析,用停用詞表將冗余的部分去除,得到關(guān)鍵字集合,并存入類型為string名為words的集合中;
步驟2)同義詞擴充:根據(jù)用戶輸入的自然語言的語言環(huán)境判斷集合words中的每個單詞的詞性,利用wordnet工具去尋找詞性相同的同義詞集合,并為words中的每個單詞建立該單詞的同義詞數(shù)組,將words和同義詞數(shù)組內(nèi)的單詞進行替換配對,形成動詞+名詞的短語,一起存入名為featurewords的集合中,并作為要到代碼庫中進行匹配的對象;
步驟3)分割標識符:將當前軟件程序中的有用的標識符提取出來,對所提取的標識符進行分割,這些分割后的標識符存入名為identifiers的集合中;
步驟4)匹配:將集合featurewords與集合identifiers進行匹配,若集合featurewords中的某個短語在集合identifiers中出現(xiàn),則將identifiers中并未出現(xiàn)的短語作為冗余部分去除,并對該集合identifiers中的數(shù)據(jù)集進行語義上的重新排序,然后將得到的數(shù)據(jù)集存入集合keyterms中;
步驟5)排序:統(tǒng)計集合keyterms中短語的個數(shù)為sum,并統(tǒng)有短語出現(xiàn)的方法中短語的個數(shù),記為nl、n2、".nk,再計算這些短語的個數(shù)nl、n2、…nk占sum的百分比,記為percentl, percent2,...percentk,將所得結(jié)果中的方法按照該百分比從大到小排序,并以方法名來劃分層次結(jié)構(gòu),再將方法名+方法中所包含的短語推薦給用戶。
[0005]作為本發(fā)明的改進,步驟2)在判斷單詞詞性時,依照以下原則,判斷該單詞的前一個單詞是否為名字,若不是,則確定該單詞是名詞,若是,則再次判斷該單詞的后一個單詞是否為名詞,若不是,則確定該單詞是名詞,若是,則根據(jù)該單詞在現(xiàn)有語境條件下的詞性判斷該單詞是動詞還是名詞。
[0006]作為本發(fā)明的改進,步驟3)的具體方法如下:
a)建立所用編程語言的關(guān)鍵字庫:將編程語言中的所有關(guān)鍵字都放入數(shù)據(jù)庫的數(shù)據(jù)表中;
b)提取有用標識符:將源程序與關(guān)鍵字庫進行對照,過濾掉源程序中跟編程語言相關(guān)的關(guān)鍵字,得到源程序所有的標識符,在這些標識符中去掉只有一個字母、一個字母和下劃線、一個字母和數(shù)字組成的標識符,最終所得的標識符即為有用的標識符,標識符由多個短語組成,每個短語內(nèi)有多個單詞;
c)分割標識符:對所提取的有用標識符進行分割,將所得的標識符都轉(zhuǎn)換為小寫字母,然后將標識符存入名為identifiers的集合中。
[0007]作為本發(fā)明的改進,步驟4)的具體方法如下:
a)設(shè)置門檻值:根據(jù)用戶需求設(shè)置門檻值,該門檻值用以判定用戶請求與源代碼的相似度;
b)匹配:用集合featurewords與集合identifiers進行匹配,匹配方法為,判斷集合identifiers中的短語是否滿足條件a/b >門濫值,其中a表示集合identifiers內(nèi)短語中單詞在集合featurewords內(nèi)短語中出現(xiàn)的數(shù)量,b表示變量featurewords內(nèi)短語中單詞的總數(shù)和變量identifiers內(nèi)短語中單詞的總數(shù)中較大的那一個,若滿足條件,說明標識符中某個短語可以出輸出,并存放在名為keyterms的集合中,若不滿足條件,則進行下一標識符的匹配。
[0008]本發(fā)明在操作時,當用戶輸入修改請求的自然語言時,通過判斷用戶輸入的查詢語句中的每個單詞的詞性,用wordnet來尋找詞性相同的同義詞,然后在到分割好標識符的代碼庫中去逐個匹配,當兩個短語的相似度達到一定門檻值時,便將從代碼庫中尋找到的短語推薦給用戶,以便用戶制定更好的查詢,從而使用戶更準確地定位到想要維護的代碼段,本文所提供的技術(shù)方案可以自動地判斷用戶輸入的自然語言中每個單詞的詞性,并通過詞性來尋找同義詞,當原查詢語句沒有找到任何符合條件的結(jié)果時,就用每個單詞相對應(yīng)的同義詞來替換它,從而大大降低沒有返回結(jié)果的可能性;同時,我們會對用戶輸入的自然語言進行預(yù)處理,并將處理后得到的短語作為整體到源代碼中去匹配,這樣返回給用戶的結(jié)果不會太多,且與用戶所要的結(jié)果的相關(guān)性很大,使得用戶能夠方便地去選擇。
[0009]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果在于,本方法是基于查詢單詞詞性分析技術(shù)的重新制定用戶修改請求,通過分析用戶輸入的自然語言中關(guān)鍵單詞的詞性來尋找同義詞,可以有效地解決查詢過程中的同義詞擴展問題;用短語而不是單個單詞去匹配,可以有效地縮小反饋結(jié)果的范圍,使用戶便于判斷;直接將當前程序代碼中符合條件的標識符進行語序上的重排后推薦給用戶,更加直觀明了 ;可以有效幫助開發(fā)人員制定好的查詢語句,從而更準確地定位到要進行維護的代碼段,以提高軟件維護的效率。本發(fā)明可用于軟件開發(fā)維護中。
【專利附圖】
【附圖說明】
[0010]圖1是本方法總體流程圖。
[0011]圖2是預(yù)處理用戶輸入的修改請求語言的流程圖。
[0012]圖3是提取并分割標識符的流程圖。
[0013]圖4是同義詞擴展的流程圖。
[0014]圖5是結(jié)果排序的流程圖。
[0015]圖6是單詞詞性判斷的流程圖。
[0016]圖7是十進制轉(zhuǎn)換為十六進制的源代碼。
[0017]圖8是圖7的源代碼經(jīng)步驟3)處理后得到的代碼。
[0018]圖9是以修改請求語句convert decimal to hex為例得到的結(jié)果。
【具體實施方式】
[0019]下面結(jié)合具體實施例對本發(fā)明作進一步說明:
本發(fā)明的方法是在判斷用戶輸入的查詢語句中每個單詞詞性的基礎(chǔ)上,利用wordnet來提取詞性相同的同義詞,采用標識符分割技術(shù),通過設(shè)置門檻值來向用戶推薦可替換的詞或短語,如圖1所示。
實施例
[0020]一、方法相關(guān)參數(shù)定義
1.建立一張名為character的詞性判斷表;
2.用戶輸入的查詢語句存入集合str中;
3.預(yù)處理后的查詢語句存入集合words中,words中的每個單詞存入word數(shù)組中,每個單詞的詞性存入property數(shù)組中;
4.在數(shù)據(jù)庫中建立所用編程語言的關(guān)鍵字庫表keywordLibrary;
5.每個單詞對應(yīng)的同義詞存入數(shù)組synonyml,synonym2,....synonymn中;
6.在數(shù)據(jù)庫中建立源代碼表code,導(dǎo)入code表;
7.從源代碼中提取出的有用的標識符存入向量tokens中,對這些標識符進行分割,將分割后得到的短語存入向量identifiers中;
8.將匹配后的達到門濫值的短語存入向量keyterms中。
[0021]二、方法流程
本實施例中以一個十進制轉(zhuǎn)換為十六進制的java源程序(如圖7所示)中修改十進制轉(zhuǎn)換為十六進制功能為例,該方法主要分為四個步驟:(I)判斷用戶的查詢語句每個單詞的詞性;(2)利用wordnet尋找詞性相同的同義詞(3)導(dǎo)入代碼庫并分割標識符(4)得到符合條件的短語并將結(jié)果排序。
[0022]1.判斷用戶的查詢語句每個單詞的詞性假設(shè)用戶輸入的句子為簡單句(即句子中只有一個動詞),輸入的修改請求是convertdecimal to hex ;經(jīng)過預(yù)處理后,得到關(guān)鍵字convert decimal hex ;建立一張名為character的詞性判斷表,如圖6所示,判斷方法依照以下原則,判斷該單詞的前一個單詞是否為名字,若不是,則確定該單詞是名詞,若是,則再次判斷該單詞的后一個單詞是否為名詞,若不是,則確定該單詞是名詞,若是,則根據(jù)該單詞在現(xiàn)有語境條件下的詞性判斷該單詞是動詞還是名詞,將所有的非停用詞(停用詞:文本中的常用詞匯和一些構(gòu)成句子但無實際意義的詞匯,如:介詞、形容詞等)的動詞用法和名詞用法以及他們?yōu)閯釉~和名詞的概率的統(tǒng)計結(jié)果存入表中,當無法判別一個單詞是否為動詞或名詞時,比如該單詞的前后都為名詞時,就根據(jù)它在通常的文本中是動詞的概率大還是名詞的概率大,將概率大的那一個最為它在該查詢語句中的詞性;并將其存入對應(yīng)的property數(shù)組中,如convertdecimal hex這三個關(guān)鍵字,通過判斷可知convert的詞性為動詞,decimal和hex的詞性為名詞。
[0023]2.利用wordnet尋找詞性相同的同義詞
a)將處理后得到的word數(shù)組及其詞性property數(shù)組對應(yīng)地輸入到wordnet中,通過wordnet進行分析;
b)若該單詞的詞性為V類,則到動詞詞庫中去尋找同義詞;若該單詞的詞性為η類,則到名詞詞庫中去尋找同義詞;將找到的所有詞性相同的同義詞存入對應(yīng)的synonym[l,2——,η]數(shù)組中;
c)以convertdecimal hex為例,convert的詞性為v類,貝U它的同為v類的同義詞有change, exchange, commute, win over 和 convince ;decimal 的詞性為 n 類,則它的同為 η類的同義詞有decimal fract1n ;hex的詞性為η類,則它的同為η類的同義詞有jinx,curse 和 whammy ;
d)用同義詞對原修改請求語句進行替換,如圖4所示,以convertdecimal hex為例,貝Ij替換后得到的短語有;change decimal hex, exchange decimal hex, commute decimalhex, win over decimal hex, convince decimal hex, convert decimal fract1n hex,change decimal fract1n hex, exchange decimal fract1n hex, commute decimalfract1n hex, win over decimal fract1n hex, convince decimal fract1n hex,convert decimal jinx,change decimal jinx,exchange decimal jinx,commute decimaljinx,win over decimal jinx,convince decimal jinx,convert decimal fract1n jinx,change decimal fract1n jinx, exchange decimal fract1n jinx, commute decimalfract1n jinx, win over decimal fract1n jinx, convince decimal fract1n jinx,convert decimal curse, change decimal curse, exchange decimal curse, commutedecimal curse, win over decimal curse, convince decimal curse, convert decimalfract1n curse,change decimal fract1n curse,exchange decimal fract1n curse,commute decimal fract1n curse, win over decimal fract1n curse, convincedecimal fract1n curse, convert decimal whammy, change decimal whammy, exchangedecimal whammy,commute decimal whammy,win over decimal whammy,convince decimalwhammy, convert decimal fract1n whammy, change decimal fract1n jinx, exchangedecimal fract1n whammy, commute decimal fract1n whammy, win over decimalfract1n whammy,和 convince decimal fract1n whammy共47個,一起存入 featurewords中。
[0024]3.輸入代碼庫并分割標識符
a)在數(shù)據(jù)庫中建立源代碼表code,并將其輸入到我們的程序中,同時輸入關(guān)鍵字對照庫,以十進制轉(zhuǎn)換為十六進制這個程序為例,在code中存放的就是該十進制轉(zhuǎn)換為十六進制的源代碼;
b)將源程序與keywordLibrary列表進行對照,過濾掉源代碼的注釋和關(guān)鍵字,得到程序所有的標識符,在這些標識符中去掉只有一個字母、一個字母和下劃線、一個字母和數(shù)字組成的標識符,且相同的標識符只出現(xiàn)一次,提取出剩余的標識符,存入向量tokens中;
c)對提取出的標識符進行分割,分割后的標識符存入向量identifiers,如圖3所示,以convert decimal hex為例,分割后的代碼如圖8所示。
[0025]4.得到符合條件的短語并將結(jié)果排序
a)將進行同義詞擴展后得到的短語,即向量featurewords與向量identifiers進行匹配,將到達門檻值的短語存入向量keyterms中,這里的門檻值設(shè)為0.1,即有向量identifiers內(nèi)短語中一個單詞出現(xiàn)在向量featurewords中即可;
b)統(tǒng)計整個代碼中短語的個數(shù)為sum,出現(xiàn)短語的方法中的短語的個數(shù)為nl,n2,...nk ;
c)計算這些方法中出現(xiàn)的短語的個數(shù)在總的keyterms的個數(shù)的百分比為percentl,percent2,...percentk,并將所得結(jié)果中的方法名按照該百分比從大到小排序,并以方法名來劃分層次結(jié)構(gòu),即將方法名+方法中所包含的keyterms推薦給用戶,如圖5所示;
d)以上述中的十進制轉(zhuǎn)換為十六進制程序和修改請求語句convertdecimal to hex為例,最后呈現(xiàn)給用戶的結(jié)果如圖9所示。
[0026]本發(fā)明并不局限于上述實施例,在本發(fā)明公開的技術(shù)方案的基礎(chǔ)上,本領(lǐng)域的技術(shù)人員根據(jù)所公開的技術(shù)內(nèi)容,不需要創(chuàng)造性的勞動就可以對其中的一些技術(shù)特征作出一些替換和變形,這些替換和變形均在本發(fā)明的保護范圍內(nèi)。
【權(quán)利要求】
1.一種面向軟件維護的修改請求重新定制的方法,其特征在于,包括以下步驟: 步驟I)預(yù)處理:對于用戶輸入的自然語言進行分析,用停用詞表將冗余的部分去除,得到關(guān)鍵字集合,并存入類型為string名為words的集合中; 步驟2)同義詞擴充:根據(jù)用戶輸入的自然語言的語言環(huán)境判斷集合words中的每個單詞的詞性,利用wordnet工具去尋找詞性相同的同義詞集合,并為words中的每個單詞建立該單詞的同義詞數(shù)組,將words和同義詞數(shù)組內(nèi)的單詞進行替換配對,形成動詞+名詞的短語,一起存入名為featurewords的集合中,并作為要到代碼庫中進行匹配的對象; 步驟3)分割標識符:將當前軟件程序中的有用的標識符提取出來,對所提取的標識符進行分割,這些分割后的標識符存入名為identifiers的集合中; 步驟4)匹配:將集合featurewords與集合identifiers進行匹配,若集合featurewords中的某個短語在集合identifiers中出現(xiàn),則將identifiers中并未出現(xiàn)的短語作為冗余部分去除,并對該集合identifiers中的數(shù)據(jù)集進行語義上的重新排序,然后將得到的數(shù)據(jù)集存入集合keyterms中; 步驟5)排序:統(tǒng)計集合keyterms中短語的個數(shù)為sum,并統(tǒng)有短語出現(xiàn)的方法中短語的個數(shù),記為nl、n2、".nk,再計算這些短語的個數(shù)nl、n2、".nk占sum的百分比,記為percentl, percent2,...percentk,將所得結(jié)果中的方法按照該百分比從大到小排序,并以方法名來劃分層次結(jié)構(gòu),再將方法名+方法中所包含的短語推薦給用戶。
2.根據(jù)權(quán)利要求1所述的一種面向軟件維護的修改請求重新定制的方法,其特征在于,步驟2)在判斷單詞詞性時,依照以下原則,判斷該單詞的前一個單詞是否為名詞,若不是,則確定該單詞是名詞,若是,則再次判斷該單詞的后一個單詞是否為名詞,若不是,則確定該單詞是名詞,若是,則根據(jù)該單詞在現(xiàn)有語境條件下的詞性判斷該單詞是動詞還是名
ο
3.根據(jù)權(quán)利要求1所述的一種面向軟件維護的修改請求重新定制的方法,其特征在于,步驟3)的具體方法如下: a)建立所用編程語言的關(guān)鍵字庫:將編程語言中的所有關(guān)鍵字都放入數(shù)據(jù)庫的數(shù)據(jù)表中; b)提取有用標識符:將源程序與關(guān)鍵字庫進行對照,過濾掉源程序中跟編程語言相關(guān)的關(guān)鍵字,得到源程序所有的標識符,在這些標識符中去掉只有一個字母、一個字母和下劃線、一個字母和數(shù)字組成的標識符,最終所得的標識符即為有用的標識符,標識符由多個短語組成,每個短語內(nèi)有多個單詞; c)分割標識符:對所提取的有用標識符進行分割,將所得的標識符都轉(zhuǎn)換為小寫字母,然后將標識符存入名為identifiers的集合中。
4.根據(jù)權(quán)利要求1所述的一種面向軟件維護的修改請求重新定制的方法,其特征在于,步驟4)的具體方法如下: a)設(shè)置門檻值:根據(jù)用戶需求設(shè)置門檻值,該門檻值用以判定用戶請求與源代碼的相似度; b)匹配:用集合featurewords與集合identifiers進行匹配,匹配方法為,判斷集合identifiers中的短語是否滿足條件a/b >門濫值,其中a表示集合identifiers內(nèi)短語中單詞在集合featurewords內(nèi)短語中出現(xiàn)的數(shù)量,b表示變量featurewords內(nèi)短語中單詞的總數(shù)和變量identifiers內(nèi)短語中單詞的總數(shù)中較大的那一個,若滿足條件,說明標識符中某個短語可以出輸出,并存放在名為keyterms的集合中,若不滿足條件,則進行下一標識符的匹配。
【文檔編號】G06F9/44GK104166550SQ201410396663
【公開日】2014年11月26日 申請日期:2014年8月13日 優(yōu)先權(quán)日:2014年8月13日
【發(fā)明者】孫小兵, 陸美莉 申請人:揚州大學(xué)