2013-08-23 46 views
0

字符串我試圖比較使用一些衆所周知的算法如Levenstein distancestring simmetrics(與SmithWatermanGotoh ALG得到了最好的結果)不同的解決方案庫中有兩個字符串(產品名稱)。比較兩個使用已知算法

兩個字符串是:

iPhone 3GS 32 GB黑色

蘋果iPhone 3 GS 16GB黑色

萊文施泰因正在整個字符串非常糟糕,如果有的話是在不同的順序(這是從算法的工作原理預計的),所以我試圖逐字比較。

我面臨的問題是,檢測相似 '單詞' 是與空間炭劃分(」 3GS '的方式 - >' 3個GS ';' 32 GB ' - >' 16GB')。

我的代碼比較短(字數,如果==然後str.length)字符串較長的一個。單詞分爲ArrayList<String>。我將str1中的每個單詞與同一個字符串中的其他單詞合併爲一個新的ArrayList。

這裏是一個粗略的代碼:

foreach(str1) 

    foreach(str2) 
     res1 = getLevensteinDist 
    endforeach 

    foreach(combinedstr2) 
     res1 = getLevensteinDist 
    endforeach  

    return getHigherPercent(res1, res2) 

endforeach 

這工作,如果在str2中的話被分割,但我無法弄清楚如何做一個反向的,在被str1中拆分STR2檢測的話。

我希望我至少有點清楚我想要做什麼。每一個幫助表示讚賞。

+0

不,我不清楚你在做什麼,你在這裏做什麼。你期望的是什麼? –

+0

兩個字符串(在本例中是字)之間的差異百分比。基本上,我希望返回'3 gs'和'3gs'(並且相反)爲100%準確。 – Ivan

回答

1

你應該預處理你的字符串,我的意思是你應該刪除「一個,該作爲的,」和所有普通的動詞,numnbers,...從輸入字符串,你也應該每複數形式轉換成第一單數形式,......統一所有單詞。然後,您可以應用一些字符串匹配算法,或者將這些單詞放入哈希映射中,或者如果它們很多,則將它們放入trie中,並運行相似性算法。

+0

你好Saeed,謝謝你的回覆。我認爲這對我想做的事情並不特別重要。是的,我承認它會給出更好的結果,但它們在產品名稱中並不常見,所以我不需要照顧它。我的例子中存在的問題是分隔一些單詞的空格,所以我無法單獨分析它們,因爲我的分數較小。如果'3 gs'與'3gs'相比,我想得到100%。 – Ivan

+0

通過我的方法,你可以獲得100%的3g vs 3 gs(因爲你會消除數字),但是通過使用我的方法,你也可以獲得100%的16gs vs 3gs,但是如果你想獲得更好的結果,可以將我的方法與您當前的方法結合使用,但在3gs vs 3gs以及其他組合中除了if(str1 ==「3gs」和str2 ==「3 gs」)之外無法獲得100%的完美結果。回報100%! –

+0

我無法消除這部分數據,因爲它對最終結果至關重要。 3 gs vs 4 gs在產品方面有很大的不同。這就是我想要達到的目標。但是當我比較3g和3g時,我得到的回報率甚至低20-30%(在這個特例中)。想法是根據他們的產品名稱在數據庫中找到類似的產品。這就是爲什麼我比較兩個字符串,因爲有人可以寫「Apple iPhone 3 GS 16GB黑色」,其他人可以寫「iPhone 3GS黑色」,並返回100%作爲第二個字符串。這就是爲什麼我逐字逐句比較,但空間混亂了我的結果。 – Ivan

0

嘗試分割字符串中的一個成單詞,然後eash字運行SmithWaterman並使用得分SmithWaterman作爲相似性度量。

0

13年前,我寫我自己的實現卦模糊搜索算法, 名爲「威爾伯 - Khovayko算法」的。

您可以在這裏下載:http://olegh.cc.st/wilbur-khovayko.tar.gz

它搜索中輸入搜索詞「N最接近的條款」。

術語的列表 - 在文件termlist.txt N - 在可變LIM,文件findtest。c

Alrorithm非常快:在舊的Sun 200mHz上,它搜索100000個最接近的術語,在100,000個 條目中約0.3秒。

+0

8/25/13-8/27/13我的服務器處於脫機狀態(hdd崩潰)。請再次下載。 – maxihatop