Perl 模糊字串比對(Approximate Matching)String::Approx 模組

文章推薦指數: 80 %
投票人數:10人

這裡介紹如何使用Perl 的 String::Approx 模組進行模糊字串比對(approximate matching)。

模糊搜尋是實務上常用的搜尋方法,當使用者輸入的關鍵字 ... Blogger舊站 關於 Facebook Flickr 物聯網 網站架設 程式設計 統計 素食 特價優惠 宗教 物聯網 網站架設 程式設計 統計 素食 特價優惠 宗教 Perl模糊字串比對(ApproximateMatching)String::Approx模組 2015/06/10 0則留言 這裡介紹如何使用Perl的String::Approx模組進行模糊字串比對(approximatematching)。

模糊搜尋是實務上常用的搜尋方法,當使用者輸入的關鍵字有些誤差時,透過模糊搜尋還是可以找到使用者想要找的資訊,例如color與colour兩個字其實是一樣的,如果使用者輸入其中一個,使用一般性的比對就找不到另外一個,或是說使用者根本把單字拼錯,那一般的搜尋就更找不到了。

在Perl程式語言中,我們可以使用String::Approx這個Perl模組可以讓您進行模糊字串比對,以下是使用的範例教學。

首先安裝String::Approx這個Perl模組,在UbuntuLinux中可以用apt安裝: apt-getinstalllibstring-approx-perl 接著就可以使用了,下面這個是一個簡單的Hello,World程式: #!/usr/bin/perl useString::Approxqw(amatch); @list=; $pattern="strong"; @matches=amatch($pattern,@list); print@matches; __DATA__ steamer strait string stringed strings strong strophe stream stem stemming 這裡我們首先引入String::Approx模組的amatch函數,然後利用amatch比對@list中的字串,搜尋$pattern這個關鍵字,並輸出比對成功的字串結果。

這裡__DATA__那一行以下的都是一般的文字資料,放在這裡的資料可以在程式中使用來讀取。

這裡我們將$pattern設為strong,而程式執行之後,搜尋出來的結果會像這樣: string stringed strings strong 除了找出strong之外,幾個類似的字眼也會一併找出來,如果使用者是要找string,但是打錯字輸入成strong,用模糊搜尋還是可以找得出來,這就是模糊搜尋的好處。

如果只是要判斷是否有比對成功,可以這樣做: if(amatch($pattern,@list)){ #matched } 在預設的情況下,amatch會比對兩個字串之間的差異,如果差異在一定的門檻值以內(預設為$pattern長度的十分之一),就會視為比對成功,差異的計算是看$pattern與比對的字串之間增加、減少或是改變了幾個字元,實際的計算方式請參考Levenshteindistance的說明。

您可以直接指定這個字串差異的門檻值,可以使用百分比,或是差異數目(edit),或是兩者同時使用: amatch($pattern,["330%"],@list); 當同時指定多個值的時候,amatch會檢查每一個門檻值,當每一個門檻值都符合的時候,才會視為比對成功。

另外也可以針對插入(Insertions)、刪除(Deletions)與替換(Substitutions)的門檻值做指定: amatch($pattern,["I2D20%S0"],@list); 加入i可以讓比對時忽略大小寫的差異: amatch($pattern,["iI2D20%S0"],@list); 如果想要檢查字串之間的Levenshteindistance,可以使用adist: useString::Approx'adist'; $dist=adist("pattern",$input); @dist=adist("pattern",@input); 另外也可以使用adistr計算相對的距離,如果距離為0代表完全符合,若是1代表完全不符合: useString::Approx'adistr'; $dist=adistr("pattern",$input); @dist=adistr("pattern",@inputs); 您可以結合adist或adistr將多個字串依照相似性來排序,這個排序方法在許多應用上都常常用到: my%d; @d{@inputs}=map{abs}adistr("pattern",@inputs); my@d=sort{$d{$a}<=>$d{$b}}@inputs; 如果您只是想要計算字串之間的Levenshteindistance,那麼也可以使用Perl的Text::Levenshtein與Text::LevenshteinXS模組,另外Text::WagnerFischer與Text::PhraseDistance也可以做類似的事情。

最後要提醒一點,String::Approx的執行速度通常比Perl內建的比對函數慢上數十倍,所以如果您需要比對大量的字串時,建議還是盡量使用一般的常規表達式來處理,真的沒辦法才使用String::Approx模組。

參考資料:SafariBooksOnline Perl,程式設計 演算法 G.T.Wang 個人使用Linux經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

LeaveaReply取消回覆 留言* Name* Email* Website 搜尋 分類Arduino(5) BeagleBoneBlack(1) DIY(54) Linux(317) macOS(33) Octave(15) Perl(12) R(47) Windows(98) WordPress(16) 個人(15) 免費(35) 兒童(30) 實用工具(85) 手機(13) 技巧(45) 有趣(99) 樹莓派(57) 物聯網(55) 玄學(11) 生活(209) 程式設計(137) 統計學(8) 網頁空間(36) 網頁開發(128) 虛擬化(7) 農業(42) 遊戲(9) 開箱(132) 雲端(4) 宗教 如何戒邪淫、遠離婚外情 戒淫寶典:《壽康寶鑑》白話有聲書 公益 台灣世界展望會 智邦公益網 igiving公益網 Yahoo奇摩公益 家扶基金會 ©2022G.T.Wang



請為這篇文章評分?