2011-04-07 39 views
4

我是一個Java初學者,試圖寫一個程序,將輸入匹配到預定義的字符串列表。我曾看過Levenshtein的距離,但我遇到過這樣的問題:模糊字符串搜索,包括文字互換

如果我有一個像「牛肉片」的輸入,我希望它與「牛肉片」相匹配。問題在於,根據Levenshtein距離,「牛肉片」更接近「金槍魚片」之類的東西,這當然是錯誤的。

我應該用Lucene這樣的東西嗎?是否在Java類中使用Lucene方法?

謝謝!

+2

Lucene是可能是錯誤的做法(它的意思是找到在一組的文件,而不是一個單一的文件匹配),但方式,它建立和搜索索引可能對您有所幫助(尤其是「相關性」算法)。 **問題可以幫助人們給你一個很好的答案**:你的意見是什麼?你的單詞列表有多長?你需要處理拼寫錯誤嗎? – Anon 2011-04-07 12:44:57

+0

感謝您的反饋意見:我的輸入將是從xml文檔解析的字符串。不應該有太多的拼寫錯誤,但如果它們確實發生,那麼覆蓋它們會很好。我的字符串數字列表1000左右 – abroekhof 2011-04-07 13:05:21

回答

2

你需要計算你的搜索詞的relevance到輸入字符串。 Lucene確實有內置的相關性計算,並且this article可能是理解它們的一個好開始(我剛剛對它進行了掃描,但它似乎合理地具有權威性)。

的基本過程是這樣的:

  • 初始化:令牌化搜索字詞,並將其存儲在一系列HashSet S,每學期之一。或者,如果您想對每個單詞賦予不同的權重,請使用HashMap,其中單詞是關鍵字。
  • 處理:對每個輸入字符串進行標記,並對每組搜索項進行探測,以確定它們對輸入的適用程度。參見上面的算法描述。

處理拼寫錯誤有一個簡單的技巧:在初始化期間,您將創建包含搜索項潛在拼寫錯誤的集。 Peter Norvig的文章「How to Write a Spelling Corrector」描述了這個過程(它使用Python代碼,但是Java實現當然是可能的)。

1

Lucene的不基於Levenshtein距離支持模糊搜索。

https://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Fuzzy%20Searches

但Lucene是指在一組文檔,而不是字符串搜索來搜索,所以Lucene的可能是你矯枉過正。還有其他Java實現可用。看看http://www.merriampark.com/ldjava.htm

+0

感謝您對尼山的迴應。正如你上面鏈接的那樣,我嘗試了Levenshtein距離的Java實現,但是我遇到了問題中所述的問題。 – abroekhof 2011-04-07 13:08:46

1

應該可以給Levenshtein距離適用的話,而不是字符。然後,爲了匹配單詞,你可以在角色層面再次應用Levenshtein,以便「牛肉片」中的「filet」應該匹配「牛肉片」中的「fillet」。