背景 :
在使用搜索引擎和電商的搜索功能時,大家一定遇到過這樣的情景:我想搜索博客園,可不小心輸成博客員了,不用擔心搜不到你想要的結果,因為建立在大數據上的搜索引擎會幫你自動糾錯,就這個例子Google和Baidu返回給我的分別是:
顯示以下查詢字詞的結果: 博客園 和 您要找的是不是: 博客園 ,他們都做到了自動糾錯,關於自動糾錯我之前也寫過一篇陋文,當時是自己實現的N-Gram模型,但是效果不是太好,主要是針對不同的語料庫算法的精確度是不一樣的,我想換個算法試試看,目前主流的計算串間的距離(相反的,你也可以理解為相似度)是Levenshtein,當要實現時,發現lucene已經做了這個事,那咱就站在巨人的肩膀上成長吧。
引用包:
lucene-core-3.1.0.jar + lucene-spellchecker-3.1.0.jar,你可以在這裡得到
使用示例:
在類SpellCorrector的main方法中加入以下代碼
//創建目錄 File dict = new File(""); Directory directory = FSDirectory.open(dict); //實例化拼寫檢查器 SpellChecker sp = new SpellChecker(directory); //創建詞典 File dictionary = new File(SpellCorrecter.class.getResource("dictionary.txt").getFile()); //對詞典進行索引 sp.indexDictionary(new PlainTextDictionary(dictionary)); //有錯別字的搜索 String search = "非常勿擾"; //建議個數,這裡我只想要最接近的那一個,你可以設置成別的數字,如3 // 查看本欄目紅顏血淚 冰上火一般的激情 在敵之手 馳風競艇王第二部 釣金龜 潇湘路一號 戲裡戲外第二季 草原狼爵士樂 拯救大兵瑞恩好了,接下來就直接運行吧,見下圖:
完整代碼和字典在這裡(限於工作原因,字典只保留部分電影名稱,你可以用你自己的語料庫)