Perl 模糊字串比對(Approximate Matching)String::Approx 模組
文章推薦指數: 80 %
這裡介紹如何使用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
延伸文章資訊
- 1精簡扼要的Perl 課程講義(六):常規表達式(Regular ...
常規表達式(一) (Regular expression) # (1) 基本樣式比對"=~" 與"!~" # 比對字串,成功傳回true # 失敗傳回false "Hello World" =~...
- 2Perl 學習手札- 8. 更多關於正規表示式 - Easun.org
- 3perl字串比較的疑問 - 酷!學園
perl字串比較的疑問. « 回覆#2 於: 2004-08-31 16:29 ». twu2大哥你說的方法我也有試過.... 好比說檔案裡面擷取的字串是(exe) 而我要比對的字串 ...
- 4Perl 模糊字串比對(Approximate Matching)String::Approx 模組
這裡介紹如何使用Perl 的 String::Approx 模組進行模糊字串比對(approximate matching)。 模糊搜尋是實務上常用的搜尋方法,當使用者輸入的關鍵字 ...
- 52-3 數值和字串的互換與比較
但在其他少數情況下,數值和字串的通用性可能導致程式的錯誤,此時就需要程式設計者的介入。 以下是Perl 的比較運算元(Comparison Operators):. 比較運算說明, 用於數值 ...