1. 程式人生 > >利用R語言如何進行文字比較演算法——LD演算法

利用R語言如何進行文字比較演算法——LD演算法

在日常應用中,文字比較是一個比較常見的問題。文字比較演算法也是一個老生常談的話題。
文字比較的核心就是比較兩個給定的文字(可以是位元組流等)之間的差異。目前,主流的比較文字之間的差異主要有兩大類。一類是基於編輯距離(Edit Distance)的,例如LD演算法。一類是基於最長公共子串的(Longest Common Subsequence),例如Needleman/Wunsch演算法等。
LD演算法(Levenshtein Distance)又成為編輯距離演算法(Edit Distance)。他是以字串A通過插入字元、刪除字元、替換字元變成另一個字串B,那麼操作的過程的次數表示兩個字串的差異。
例如:字串A:kitten如何變成字串B:sitting。
第一步:kitten——》sitten。k替換成s
第二步:sitten——》sittin。e替換成i
第三步:sittin——》sitting。在末尾插入g
故kitten和sitting的編輯距離為3
樓主一開始遇到這個問題的時候也是思考良久,覺得利用R語言很難實現,但是R最大的優點就是包多,經過千辛萬苦的谷歌翻牆搜尋,讓我找到了解決方法:
例題:設計一個演算法,求下列所示專業名稱中與“電腦科學與技術”最相似的名稱:
1、電腦科學與應用,2、計算機科學技術,3、金融學電腦科學與應用,4、計算科學與技術
程式碼如下:

k1<-“電腦科學與技術”
k2<-‘電腦科學與應用’
k3<-‘計算機科學技術’
k4<-‘金融學電腦科學與應用’
k5<-‘計算科學與技術’
kn<-c(k2,k3,k4,k5)
agrep(k1,kn,max =1.1, value = TRUE,useBytes = T,costs = NULL)

[1] “計算機科學技術” “計算科學與技術”

其中引數max控制的是可以匹配的最大距離,useBytes控制的是按照字元比較還是Bytes比較。

下面貼出一個演算法,返回一組資料中所有相似的字串

km<-c(k1,k2,k3,k4,k5)
lapply(km, agrep, km, value = TRUE)

[1]

[1] “電腦科學與技術” “計算機科學技術” “計算科學與技術”

[2]
[1] “電腦科學與應用” “金融學電腦科學與應用”

[3]
[1] “電腦科學與技術” “計算機科學技術”

[4]
[1] “金融學電腦科學與應用”

[5]
[1] “電腦科學與技術” “計算科學與技術”
做完這個東西我不禁在想,好在找到一個函式巧妙的實現了這個問題,若沒有實現,我該怎麼辦,樓主在搜尋的過程中看到很多人用C語言或其他程式語言實現了這個問題,看來自己的程式設計技巧還要好好提高。明天繼續加油