最佳字符串比较方法swift

时间:2018-05-21 07:12:34

标签: swift string similarity

用于获得两个字符串之间的百分比相似性的最佳算法是什么。到目前为止,我一直在使用Levenshtein,但这还不够。 Levenshtein给出了差异的数量,然后我必须尝试通过这样做来计算相似性:

100 - (no.differences/no.characters_in_scnd_string * 100)

例如,如果我测试"ab""abc"的相似程度,我会得到约66%的相似度,这是有道理的,因为"ab"与{{1}相似2/3 }}。

我遇到的问题是,当我测试"abc""abcabc"时,我得到100%的相似度,因为"abc"完全出现在"abc"中。但是,我希望答案为50%,因为"abcabc"的50%与"abcabc"相同...

我希望这有点意义......第二个字符串是常量,我想测试不同字符串的类似字符串。类似地,我的意思是"abc""cat dog"具有极高的相似性,尽管词序不同。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Damerau–Levenshtein distanceLevenshtein distance

算法的实现

你可以检查这个StringMetric算法有你需要的东西

https://github.com/autozimu/StringMetric.swift

答案 1 :(得分:0)

使用带有输入的Levenstein算法:

case1 - distance(abcabc, abc)
case2 - distance(cat dog, dog cat)

输出是:

distance(abcabc, abc) = 3 // what is ok, if you count percent from `abcabc`
distance(cat dog, dog cat) = 6 // should be 0

因此,在abcabcabc的情况下,我们得到3,它是最大单词abcabc的50%。正是你想要实现的目标。

catsdogs的第二种情况:我的建议是将此字符串拆分为单词并比较它们的所有可能组合并选择最小的结果。

更新:

我将用伪代码描述第二种情况,因为我对Swift不是很熟悉。

get(cat dog) and split to array of words ('cat' , 'dog') //array1
get(dog cat) and split to array of words ('dog' , 'cat') //array2

var minValue = 0;

for every i-th element of `array1`
   var temp = maxIntegerValue // here will be storred all results of 'distance(i, j)'
   index = 0 // remember index of smallest temp
   for every j-th element of `array2` 
      if (temp < distance(i, j))
         temp = distance(i, j)
         index = j
   // here we have found the smallest distance(i, j) value of i in 'array2'
   // now we should delete current j from 'array2'  
   delete j from array2

   //add temp to minValue
   minValue = minValue + temp 

工作流程将是这样的:

首次迭代首次for语句后(对于值&#39; cat&#39; array1),我们将得到0,因为i = 0j = 1是正确的。然后j = 1将从array2移除,之后array2将只有dogfor

第二次array1语句的第二次迭代(对于值&#39; dog&#39; dog)我们也会得到0,因为它与来自{{1}的array2是同意的}}

至少从现在起你就知道如何处理你的问题了。现在取决于你将如何实现它,可能你将采用另一种数据结构。