2014-03-28 17 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,所以也许他可以给我的答案增加一些有价值的东西。

相关问题