1. 程式人生 > 實用技巧 >自然語言處理1-2: 編輯距離

自然語言處理1-2: 編輯距離

原文出處:https://algorithms.tutorialhorizon.com/dynamic-programming-edit-distance-problem/

問題:假設我們現在有兩個字串s1和s2,並且給出如下所示的三個編輯操作,寫出一個演算法,當每次只能使用其中一個編輯操作時,找到將字串s1轉換成s2的最小編輯次數。

  允許的編輯操作:

  1.insert-插入一個字元

  2.delete-刪除一個字元

  3.replace-將字串中的一個字元用另一個字元代替

例如

String s1 = "horizon"
String  s2 = "horzon"
Output: 
1 {remove 'i' from string s1} String s1 = "horizon" String s2 = "horizontal" Output: 3 {insert 't', 'a', 'l' characters in string s1}

分析:從後往前依次比較字串中的每一個字元,對於每次比較之後的結果,我們執行如下兩種操作將問題變成子問題:

  1.如果兩個字串末尾的字元相等,那麼我們忽視最後一個字元,將問題轉化為找到剩下的字元組成的字串的編輯距離

  2.如果兩個字串末尾的字元不相等,那麼我們分別執行以上三種操作(insert,delete,replace),執行完之後,再遞迴的

   解決兩個字串的編輯距離。

演算法:假設我們有長度為n的字串s1和長度為m的字串s2,比較s1和s2末尾的字元:

  1.如果兩個字元相等,那麼忽視末尾字元,求前n-1和m-1的字串的編輯距離

  2.如果兩個字元不相等,那麼執行如下三種操作,並且選擇其中的最優解:

    a.在s1的末尾插入一個字元,該字元和s2末尾的字元相同,此時s1的長度是n+1,s2的長度是m。然後忽視末尾字元,求前n和前m-1的字串的編輯距離x1

    b.將s1的末尾的字元刪掉,此時s1的長度是n-1,s2的長度是m。求長度為n-1和m的字串的編輯距離x2

    c.將s1的末尾的字元用s2的末尾的字元代替,然後求前n-1和m-1的編輯距離x3

  編輯距離就是x1+1, x2+1, x3+1中的最小值

同時,我們可以用動態規劃自底向上來降低時間複雜度