我是一個Java初學者,試圖寫一個程序,將輸入匹配到預定義的字符串列表。我曾看過Levenshtein的距離,但我遇到過這樣的問題:模糊字符串搜索,包括文字互換
如果我有一個像「牛肉片」的輸入,我希望它與「牛肉片」相匹配。問題在於,根據Levenshtein距離,「牛肉片」更接近「金槍魚片」之類的東西,這當然是錯誤的。
我應該用Lucene這樣的東西嗎?是否在Java類中使用Lucene方法?
謝謝!
我是一個Java初學者,試圖寫一個程序,將輸入匹配到預定義的字符串列表。我曾看過Levenshtein的距離,但我遇到過這樣的問題:模糊字符串搜索,包括文字互換
如果我有一個像「牛肉片」的輸入,我希望它與「牛肉片」相匹配。問題在於,根據Levenshtein距離,「牛肉片」更接近「金槍魚片」之類的東西,這當然是錯誤的。
我應該用Lucene這樣的東西嗎?是否在Java類中使用Lucene方法?
謝謝!
你需要計算你的搜索詞的relevance到輸入字符串。 Lucene確實有內置的相關性計算,並且this article可能是理解它們的一個好開始(我剛剛對它進行了掃描,但它似乎合理地具有權威性)。
的基本過程是這樣的:
HashSet
S,每學期之一。或者,如果您想對每個單詞賦予不同的權重,請使用HashMap
,其中單詞是關鍵字。處理拼寫錯誤有一個簡單的技巧:在初始化期間,您將創建包含搜索項潛在拼寫錯誤的集。 Peter Norvig的文章「How to Write a Spelling Corrector」描述了這個過程(它使用Python代碼,但是Java實現當然是可能的)。
Lucene的不基於Levenshtein距離支持模糊搜索。
https://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Fuzzy%20Searches
但Lucene是指在一組文檔,而不是字符串搜索來搜索,所以Lucene的可能是你矯枉過正。還有其他Java實現可用。看看http://www.merriampark.com/ldjava.htm
感謝您對尼山的迴應。正如你上面鏈接的那樣,我嘗試了Levenshtein距離的Java實現,但是我遇到了問題中所述的問題。 – abroekhof 2011-04-07 13:08:46
應該可以給Levenshtein距離適用的話,而不是字符。然後,爲了匹配單詞,你可以在角色層面再次應用Levenshtein,以便「牛肉片」中的「filet」應該匹配「牛肉片」中的「fillet」。
Lucene是可能是錯誤的做法(它的意思是找到在一組的文件,而不是一個單一的文件匹配),但方式,它建立和搜索索引可能對您有所幫助(尤其是「相關性」算法)。 **問題可以幫助人們給你一個很好的答案**:你的意見是什麼?你的單詞列表有多長?你需要處理拼寫錯誤嗎? – Anon 2011-04-07 12:44:57
感謝您的反饋意見:我的輸入將是從xml文檔解析的字符串。不應該有太多的拼寫錯誤,但如果它們確實發生,那麼覆蓋它們會很好。我的字符串數字列表1000左右 – abroekhof 2011-04-07 13:05:21