2014-03-28 16 views
0
String a = 'string' 
String b = 'This is a strin' 
println b.containsSimilarity(a) 

有沒有在Groovy像想象containsSimilarity一個函數,它說串的差異,所以 我想在 搜索「字符串」「這是一個〜應變」和比較後,說83%字符串「字符串」被發現在「這是一個字符串」。 喜歡的東西的斷言在使用斯波克一個字符串是其他字符串的一部分的多少個百分比?

斷言 「串」 == 「字符串」

結果是:

「串」 == 「〜應變」 | 假 1差(83%的相似性) 〜應變(G) 〜應變( - )

我怎麼能在Groovy做到這一點?所以不比較兩個字符串,而是找字符串一個的多大一部分被包含在字符串b。如果a是b - > true的一部分,否則爲false並打印相似度百分比,並顯示差異在哪裏。

+0

這是不是與Levenshtein距離有關?也許[這個stackoverflow問題](http://stackoverflow.com/questions/6087281/similarity-score-levenshtein)有答案 – Will

+0

沒有。我的字符串b很長,我想搜索它的一小部分。所以,如果我的字符串b爲英文字母,和一個字符串是比較 - 我想造成100%後,「W」,但萊文斯坦或哈羅 - 沃克這將是0.03%或更少。 – Xelian

+0

這裏有一種方法https://blog.nishtahir.com/2015/09/19/fuzzy-string-matching-using-cosine-similarity/ 更多相關會在看https://stackoverflow.com/questions/955110 /相似性字符串比較,在Java的 –

回答

0
​def s1 = "string", s2 = "This is a strin" 
def i = 0, j = 0, l1 = s1.size(), l2 = s2.size() 

if (l1 >= l2) { 
    large = s1 
    small = s2 
} else { 
    large = s2 
    small = s1 
} 

def percent = 100/small.size() 

def match(large, str) { 
    if (large.indexOf(str) == -1) { 
     return match(large, str.substring(0, str.size() - 1)) 
    } 
    return str.size() 
} 

println(Math.round(match(large, small) * percent)) //83 
​ 
+0

感謝,對答案,但如果我們已經S1 =「很不錯的字符串」,S2 =「這是非常〜應變」的結果將是31%,但實際上有16個相同的信件 - 約63%。因爲你的算法從後面切入。只有得到'非常'5個如果我們有不平等的問題發生之間的平等部分。 – Xelian

0

我挖一些斯波克代碼,採用「相似性」爲關鍵詞,很快發現EditDistance類。該類在Spock中用於字符串距離計算。它僅取決於 EditPathOperation,因此可以輕鬆提取。
如果你想要漂亮的印刷版,請看EditPathRenderer。它取決於TextUtil.escape方法,但也可以提取。

但是請注意,正如Peter Niederwieser所記錄的那樣,這些類會計算Levenshtein距離,並且您注意到,它並不完全是您所需要的。作者是在SO,所以也許他可以給我的答案增加一些有價值的東西。

相關問題