2009-01-27 80 views
3

我使用Levenshtein算法來滿足這些要求:Levenshtein算法:我如何滿足這種文本編輯要求?

當發現N個字符的字,詞在我的字典數據庫建議作爲修正爲:

的有1 N個字符的每一個字字典與所發現的詞語不同的性格。 例如: 創建詞:bearn,字典詞:熊

每個有N個字符的N + 1個字符的詞典單詞等於找到的單詞。 例如: 找到的單詞:bear,詞典單詞:熊

每個包含N-1個字符的N-1個字符的字典單詞都與找到的單詞相等。 例子: 發現一句話:熊,字典裏的單詞:熊

我使用這個實現在C++ Levenshtein算法來尋找當一個字有1萊文斯坦號(這是萊文斯坦數爲所有三種情況) ,但是我該如何選擇要建議的單詞呢?我閱讀了Boyer-Moore-Horspool和Knuth-Morris-Pratt,但我不確定他們中的哪一個能夠有所幫助。

#include <string> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int levenshtein(const string &s1, const string &s2) 
{ 
    string::size_type N1 = s1.length(); 
    string::size_type N2 = s2.length(); 
    string::size_type i, j; 
    vector<int> T(N2+1); 

    for (i = 0; i <= N2; i++) 
     T[i] = i; 

    for (i = 0; i < N1; i++) { 
     T[0] = i+1; 
     int corner = i; 
     for (j = 0; j < N2; j++) { 
     int upper = T[j+1]; 
     if (s1[i] == s2[j]) 
      T[j+1] = corner; 
     else 
      T[j+1] = min(T[j], min(upper, corner)) + 1; 
     corner = upper; 
     } 
    } 
    return T[N2]; 
} 

回答

0

爲什麼要將建議限制爲單個單詞,爲什麼不包含一組單詞?如果你只限於一個單詞,你可以通過一些預先計算的使用頻率或其他內容來排序結果。此頻率可根據用戶從建議中選擇的內容進行更新。

此外,在原始單詞中沒有拼寫錯誤的情況下,您可能需要優先考慮N + 1個案例,這更像是自動完成。無論如何,我不認爲有一個正確的方法來做到這一點,也許如果你的要求更具體,這將是更容易縮小範圍。

此外,您不需要了解Python就能理解Norvig文章中描述的算法。

2

正如我在其他地方所說的,Boyer-Moore並不適合這樣做。既然你想同時搜索多個刺,那麼Wu和Manber的算法應該更符合你的喜好。

我已經發布了一個概念驗證C++代碼以回答another question。注意那裏提到的警告。

0

如果我理解正確,那麼你的問題沒有正確的答案。您正在使用Levenshtein識別給定單詞的三個建議 - 您需要制定一個規則來決定使用哪一個以及哪些要過濾掉。或者你應該全部使用它們?

就像感興趣的事情一樣,Damerau對Levenshtein的擴展可能會讓你感興趣,其中兩個交換字符也被認爲給出1分,而不是2分,這是Levenshtein返回的結果。