我想在C++中實現以下內容:自動校正算法
1)檢查給定單詞是否存在於字典中。字典文件是一個巨大的文件;考慮100MB或3-4百萬字。
2)對不正確的單詞提出更正建議。
3)自動完成功能。
我的做法
1)我打算建立一個樹,以便進行搜索,就會有效。
2)我沒有得到如何實現自動校正功能。
3)我可以用樹木
什麼是最好的數據結構和算法,實現了上述所有功能,實現自動完成功能?
我想在C++中實現以下內容:自動校正算法
1)檢查給定單詞是否存在於字典中。字典文件是一個巨大的文件;考慮100MB或3-4百萬字。
2)對不正確的單詞提出更正建議。
3)自動完成功能。
1)我打算建立一個樹,以便進行搜索,就會有效。
2)我沒有得到如何實現自動校正功能。
3)我可以用樹木
什麼是最好的數據結構和算法,實現了上述所有功能,實現自動完成功能?
您可以通過查看給定子樹中的所有字符串來進行自動完成。有些分數可以幫助你選擇。如果你在樹中沿着這條路走下去,並遍歷整個子樹來獲得所有可能的結果,這就好像是一樣。
對於更正,您需要在樹上實現類似http://en.wikipedia.org/wiki/Levenshtein_distance的內容。您可以使用這樣一個事實,即如果您在trie中處理了給定路徑,則可以重用根路徑末尾處的子樹中的所有字符串的結果。
如何使用「Levenshtein距離」來實現自動校正? 根據我的理解 - Levenshtein距離用於比較給定的字符串與字符串列表(字典)。但是如果我繼續比較字典中的每個字符串,它會花費很多時間。 有沒有更好的運行算法存在相同的。 – Ankith
@Ankith:BK樹是一種利用Levenshtein距離是度量空間的事實的算法,用於優化在一組字符串(字典)中搜索一個字符串(查詢)的最近鄰居。 –
1)除了樹木,另一個有趣的方法是BWT
http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
BWT後綴數組可以很容易地用於跟蹤與給定前綴字。
2)進行糾錯,現代的做法是LHS:
http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search
通過谷歌搜索隨機提供的一些鏈接:
https://cs.stackexchange.com/questions/2093/efficient-map-data-structure-supporting-approximate-lookup
https://code.google.com/p/likelike/
http://aspguy.wordpress.com/2012/02/18/the-magic-behind-the-google-search/
我一直在努力的同樣的問題。到目前爲止,我遇到的最好的解決方案是使用三元搜索樹來自動完成。三元搜索樹比嘗試更節省空間。 如果我無法在三元搜索樹中查找查找的字符串,那麼我使用已經構建的BK樹來查找最接近的匹配。 BK樹內部使用Levenshtein距離。 你
metaphones也是你可能想探索的東西,但我沒有深入metaphones。
如果你喜歡,我有一個用於BK TREE +三級搜索樹的Java解決方案。
看起來像一個trie http://en.wikipedia.org/wiki/Trie –
這是上述問題的完整解決方案https://github.com/msankith/Trie/tree/1。1 – Ankith
雖然它的工作效率很高,但我發現這是一個相當低效的解決方案。嘗試不是有效的內存。此外,這隻能糾正拼寫錯誤的拼寫字母。 – Pawan