專利名稱::基于編輯距離的源代碼相似度度量方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及源代碼相似度度量方法,更具體而言,涉及基于編輯距離的源代碼相似度度量方法。
背景技術(shù):
:隨著軟件行業(yè)的高速發(fā)展,常常會(huì)出現(xiàn)源代碼復(fù)用,也就是對(duì)已有的源代碼進(jìn)行拷貝并粘貼到新的上下文環(huán)境中,并且為了適應(yīng)新的上下文環(huán)境,而對(duì)原有的源代碼進(jìn)行少量的修改。為了判斷源代碼的復(fù)用率,常常需要度量這兩塊源代碼的相似度,也就是判斷這兩塊源代碼的相似性。目前,業(yè)界通常利用傳統(tǒng)的編輯距離方法來計(jì)算源代碼之間的編輯距離,從而給出相似度的度量值。在此,所述編輯距離是指將字符串sl和字符串s2變成相同字符串而需要進(jìn)行(l)把字符串sl中的字符chl替換成字符串s2中的字符ch2或相反操作;(2)刪除字符串sl中的字符chl或刪除字符串s2中的字符ch2以及(3)向字符串sl中插入字符ch2或向字符串s2中插入字符chl這三種操作的最小次數(shù)。然而,這種傳統(tǒng)的編輯距離方法中的三種編輯操作均是針對(duì)字符,并且對(duì)于任意字符使用三種編輯操作之一時(shí),均是累加一次編輯次數(shù),從未考慮到源代碼特有的詞法和語法結(jié)構(gòu),因此在判斷源代碼的相似性或度量源代碼的相似度時(shí),所給出的判斷或度量的精確度很低。例如對(duì)一段源代碼進(jìn)行幾個(gè)關(guān)鍵字的修改以及進(jìn)行幾個(gè)變量名的修改,盡管前者的修改會(huì)對(duì)程序的功能造成更大的影響,然而傳統(tǒng)的編輯距離是相同的。由此,當(dāng)用戶利用這種編輯距離進(jìn)行源代碼相似度度量或源代碼相似性判斷時(shí),會(huì)得出一些不正確的結(jié)論,尤其是當(dāng)原有的源代碼被通過非正當(dāng)手段進(jìn)行復(fù)用,也就是被剽竊而需要精確地確定源代碼的相似度時(shí),這種傳統(tǒng)的編輯距離方法無法滿足精確度的需求。因此,需要一種能夠針對(duì)源代碼特有的詞法和語法結(jié)構(gòu),在進(jìn)行源代碼相似度度量或源代碼相似性判斷時(shí),能提供更高精確度的基于編輯距離的源代碼相似度度量方法。
發(fā)明內(nèi)容本發(fā)明的目的是針對(duì)利用傳統(tǒng)的編輯距離方法進(jìn)行源代碼相似度度量時(shí)產(chǎn)生度量精確度不高的問題,而提供一種針對(duì)源代碼特有的詞法和語法結(jié)構(gòu),在進(jìn)行源代碼相似度度量或源代碼相似性判斷時(shí),能提供更高的精確度的改進(jìn)的基于編輯距離的源代碼相似度度量方法。本發(fā)明提供一種基于編輯距離的源代碼相似度度量方法,包括輸入第一源代碼塊和第二源代碼塊;識(shí)別第一源代碼塊和第二源代碼塊中的符號(hào);判斷所述符號(hào)的類型,根據(jù)所述類型設(shè)置相應(yīng)的增加值;逐一比較第一源代碼塊與第二源代碼塊中的符號(hào),利用編輯距離公式采用動(dòng)態(tài)規(guī)劃法計(jì)算編輯距離,得出相似度度量值,其中所述編輯距離公式被定義,以使得第一源代碼塊與第二源代碼塊的編輯距離取決于所述符號(hào)、對(duì)所述符號(hào)的編輯操作以及所述符號(hào)對(duì)應(yīng)的增加值。利用本發(fā)明所提供的方法,可以在進(jìn)行源代碼相似度度量或源代碼相似性判斷時(shí),提供更高的精確度。為了更好地理解本發(fā)明,下面結(jié)合附圖僅以舉例的方式對(duì)本發(fā)明的實(shí)施方案作詳細(xì)說明,其中圖l示出了根據(jù)本發(fā)明的一個(gè)實(shí)施方案計(jì)算編輯距離的流程圖。具體實(shí)施例方式在下面描述中,為說明起見,描述了很多具體細(xì)節(jié)以便全面理解本發(fā)明的實(shí)施方案。然而,對(duì)于本領(lǐng)域的技術(shù)人員來說,顯而易見的是本發(fā)明可不采用這些具體細(xì)節(jié)進(jìn)行實(shí)施。在本說明書中以及隨后的權(quán)利要求書中,將涉及到若干術(shù)語,這些術(shù)語將被定義具有下述含義。符號(hào)(token):—個(gè)程序設(shè)計(jì)語言的基本語法符號(hào)。關(guān)鍵字也稱基本字,如PASCAL語言中的begin、end、if、while和var等。標(biāo)識(shí)符用來表示各種名字,如常量名、變量名和過程名等。字面量各種類型的常數(shù),如25、3.1415、TRUE和"ABC"等。訪問修飾符可以限制類和結(jié)構(gòu),以便只有聲明它們的程序或命名空間才能寸吏用它們的符號(hào),如private、static、public、this和const等。其它不屬于關(guān)鍵字、標(biāo)識(shí)符、字面量和訪問修飾符的其他符號(hào),如運(yùn)算符、界符等?;谏衔乃觯阎袛鄡蓚€(gè)字符串sl和字符串s2的差別,可以通過計(jì)算這兩個(gè)字符串之間的編輯距離來實(shí)現(xiàn)。雖然上文已經(jīng)介紹了編輯距離,但是為了更加清楚地理解編輯距離,此處將通過公式的形式,對(duì)編輯距離進(jìn)行定義。假設(shè)d(sl,s2)表示字符串sl和s2的編輯距離,"表示一個(gè)空字符串,chl和ch2分別表示串sl和s2中的字符,lsl表示字符串s的長度,則編輯距離的計(jì)算滿足以下定義dd-0(1),d(s,")-d(〃,s)=lsl(2),d(sl+chl,s2+ch2)=min(d(sl,s2)+ifchl=ch2then0else1,〃修改操作d(sl+chl,s2)+1,〃插入操作d(sl,s2+ch2)+1)//刪除操作(3)。本發(fā)明所述的編輯距離對(duì)上述編輯距離進(jìn)行了改進(jìn),其中d(csl,cs2)表示源代碼塊csl和cs2的編輯距離,〃表示一個(gè)空源代碼塊,tcl和tc2分別表示源代碼塊csl和cs2中的符號(hào),lcsl表示源代碼塊cs的長度(即源代碼塊cs中符號(hào)的個(gè)數(shù)),score表示符號(hào)所對(duì)應(yīng)的增加值,則本發(fā)明所述的編輯距離滿足以下定義d(",'0=0(1),d(cs,'')=d('',cs)=|cs|(2),d(sl+tcl,s2+tc2)=min(d(csl,cs2)+iftcl=tc2then0elsescore,〃修改操作d(csl+tcl,cs2)+score,〃插入操作d(csl,cs2+tc2)+score)//刪除操作(3)。5在上文中已經(jīng)簡(jiǎn)單介紹了傳統(tǒng)的編輯距離方法,在此,將通過舉例的方式利用偽代碼對(duì)此作進(jìn)一步的說明,以便更好地理解本發(fā)明。作為例子,用動(dòng)態(tài)規(guī)劃法來計(jì)算兩個(gè)源代碼塊fl和f2的編輯距離,即相似度值。首先,傳統(tǒng)的編輯距離方法輸入源代碼塊fl,源代碼塊f2輸出fl,f2的相似度值computeSimilarity(f1,f2){len—fl-源代碼塊fl中的字符個(gè)數(shù)len-f2-源代碼塊f2中的字符個(gè)數(shù)〃d[i][j]表示fl中的字符1至字符i和f2中的字符1至字符j之間的編輯距離d[O]=0;for(inti=0;i<len—fl;i++)d[i+l]=d[i][O];for(intj=05j<len—f2jj++)d[O][j+l]=d[O][j];for(inti=0;i<len—fl;i++){for(intj=j<len—f2^j++){floatdl,d2,d3;if(fl的第i個(gè)字符與f2的第j個(gè)字符相等)dl-d[i][j];//無需任何編輯操作6lS6dl=d[i][j]+l;〃修改d2=d[i][j+l]+l;//刪除d3=d[i+l][j]+l;//插入d[i+1][j+1]=dl,d2,d3之中的最小值;returnd[len—fl][len—f2];〃返回相似度值本發(fā)明所提出的改進(jìn)的編輯距離方法是指在計(jì)算編輯距離時(shí),三種編輯操作均是針對(duì)一個(gè)符號(hào),而不是針對(duì)一個(gè)字符,并且在一次具體的編輯操作中是針對(duì)該符號(hào)相應(yīng)的類型。也就是說,一個(gè)符號(hào)可以是單個(gè)字符,也可以是兩個(gè)或多個(gè)字符,并且不同的符號(hào)的增加值不同,該增加值根據(jù)編輯該類型的符號(hào)對(duì)源代碼塊的影響度設(shè)置,影響度越高,增加值越大,優(yōu)選地,增加值是不大于1的正數(shù)。例如,上述增加值可以如表1中所示。<table>tableseeoriginaldocumentpage7</column></row><table>表1因此,考慮符號(hào)以及符號(hào)類型,參照?qǐng)D1,上述傳統(tǒng)的編輯距離方法可以被修改成輸入源代碼塊fl,源代碼塊f2輸出fl,f2的相似度值computeSimilarity(f1,f2){len-fl-源代碼塊fl中的符號(hào)個(gè)數(shù)len—f2-源代碼塊f2中的符號(hào)個(gè)數(shù)//d[i][j]表示fl中的符號(hào)1至符號(hào)i和f2中的符號(hào)1至符號(hào)j之間的編輯距離d[O]=0;for(inti=0;i<len一fl;i++)d[i+l]=d[i]+fl的第i個(gè)符號(hào)的增加值;for(intj=0;j<len—f2;j++)d[O][j+l]=d[O][j]+f2的第j個(gè)符號(hào)的增加值;for(inti=0;i<len一fl;i++){for(intj=0;j<len_f2;j++){floatdl,d2,d3;if(fl的第i個(gè)token與f2的第j個(gè)符號(hào)相等)dl=d[i][j];〃無需任何編輯操作elsedl=d[i][j]+兩個(gè)符號(hào)中較大的那個(gè)增加值〃修改d2=d[i][j+l]+fl中第i個(gè)符號(hào)的增加值;〃刪除d3=d[i+l][j]+f2中第j個(gè)符號(hào)的增加值;〃插入d[i+1〗[j+1]=dl,d2,d3之中的最小值;returnd[len_fl][len—f2];〃返回相似度值例如,在上述修改后的方法的任意狀態(tài),對(duì)于一個(gè)關(guān)鍵字來說無論是做修改、插入還是刪除編輯操作,其編輯距離增加值均是1;而對(duì)于一個(gè)訪問修飾符來說,其編輯距離增加值則為0.1。下面將以兩個(gè)源代碼塊為例,分別利用上述傳統(tǒng)的編輯距離方法和改進(jìn)的編輯距離方法計(jì)算相似度值。codel:publicclassFoo{protectedStringname;privateintcount;publicStringgetNameO(return皿ms;publicintgetCount(){returncount;code2:publicclassCounter{privateStringcounterName;protectedintcount;protectedStringgetCounterName(){returnthis.counterName;protectedintgetCount(){returnthis.count;利用傳統(tǒng)的編輯距離方法的計(jì)算結(jié)果(忽略代碼中的多余空格,空行)D(codel,code2)=65,其中Len(codel)=145,Len(code2)=183,那么computesimilarity(codel,code2)=1-D(codel,code2)/Min(Len(codel),Len(code2))+65/Min(145,183)=1-65/145=0.5517。利用本發(fā)明的改進(jìn)的編輯距離方法的計(jì)算結(jié)果((忽略代碼中的多余空格,空行)D(codel,code2)=2.8,其中Len(codel)=32,Len(code2)=36,computeSimilarity(codel,code2)=1-D(codel,code2)/Min(Len(codel),Len(code2))=1-2.8/Min(32,36)=l-2.8/32=0.9125事實(shí)上,這兩個(gè)代碼塊非常相似,但是利用傳統(tǒng)的編輯距離方法計(jì)算的相似度值卻遠(yuǎn)遠(yuǎn)小于利用本發(fā)明的改進(jìn)的編輯距離方法計(jì)算的相似度值,由此可見,本發(fā)明的改進(jìn)的編輯距離方法計(jì)算出來的相似度值更符合實(shí)際情況。本發(fā)明提供了一種針對(duì)源代碼特有的詞法和語法結(jié)構(gòu),在計(jì)算源代碼的編輯距離時(shí),利用符號(hào)和符號(hào)類型來補(bǔ)償編輯距離增加值,從而得出更高的精確度的編輯距離的方法,利用該方法可以更加精確地對(duì)程序源代碼進(jìn)行相似度度量。另外,盡管表1中示出了不同類型的符號(hào)的增加值,但這僅是出于示例的目的,并不是為了限定,因此,在其它的實(shí)施方式中可以根據(jù)具體的應(yīng)用而對(duì)這些增加值進(jìn)行修改。并且,盡管上文以偽代碼的形式示出了一種編輯距離的計(jì)算過程,但這僅是出于示例的目的,并不是出于限定,因此,任何能夠基于符號(hào)和符號(hào)類型來補(bǔ)償編輯距離增加值,從而計(jì)算出編輯距離的過程都可以采用。顯而易見,在此描述的本發(fā)明可以有許多變化,這種變化不能認(rèn)為偏離本發(fā)明的精神和范圍。因此,所有對(duì)本領(lǐng)域技術(shù)人員來說顯而易見的改變,都包括在本權(quán)利要求書的涵蓋范圍之內(nèi)。權(quán)利要求1.一種基于編輯距離的源代碼相似度度量方法,包括輸入第一源代碼塊和第二源代碼塊;識(shí)別第一源代碼塊和第二源代碼塊中的符號(hào);判斷所述符號(hào)的類型,根據(jù)所述類型設(shè)置相應(yīng)的增加值;逐一比較第一源代碼塊與第二源代碼塊中的符號(hào),利用編輯距離公式采用動(dòng)態(tài)規(guī)劃法計(jì)算編輯距離,得出相似度度量值,其中所述編輯距離公式被定義,以使得第一源代碼塊與第二源代碼塊的編輯距離取決于所述符號(hào)、對(duì)所述符號(hào)的編輯操作以及所述符號(hào)對(duì)應(yīng)的增加值。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述符號(hào)的類型根據(jù)編輯該符號(hào)對(duì)所述源代碼相似度的影響度確定。3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述增加值是不大于1的正數(shù)。4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述符號(hào)的類型為關(guān)鍵字,其相應(yīng)的增加值為1。5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述符號(hào)的類型為標(biāo)識(shí)符和字面量,其相應(yīng)的增加值為0.2。6.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述符號(hào)的類型為訪問修飾符,其相應(yīng)的增加值為0.1。全文摘要本發(fā)明提供一種基于編輯距離的源代碼相似度度量方法,包括輸入第一源代碼塊和第二源代碼塊;識(shí)別第一源代碼塊和第二源代碼塊中的符號(hào);判斷所述符號(hào)的類型,根據(jù)所述類型設(shè)置相應(yīng)的增加值;逐一比較第一源代碼塊與第二源代碼塊中的符號(hào),利用編輯距離公式采用動(dòng)態(tài)規(guī)劃法計(jì)算編輯距離,得出相似度度量值,其中所述編輯距離公式被定義,以使得第一源代碼塊與第二源代碼塊的編輯距離取決于所述符號(hào)、對(duì)所述符號(hào)的編輯操作以及所述符號(hào)對(duì)應(yīng)的增加值。利用本發(fā)明所提供的方法,可以在進(jìn)行源代碼相似度度量或源代碼相似性判斷時(shí),提供更高的精確度。文檔編號(hào)G06F9/44GK101425008SQ200710176688公開日2009年5月6日申請(qǐng)日期2007年11月1日優(yōu)先權(quán)日2007年11月1日發(fā)明者超劉,曹羽中,虎李,金茂忠申請(qǐng)人:北京航空航天大學(xué)