Swift 最优字符串比较法

Swift 最优字符串比较法,swift,string,similarity,Swift,String,Similarity,获得两个字符串之间的百分比相似性的最佳算法是什么。到目前为止,我一直在使用Levenshtein,但这还不够。Levenshtein给了我差异的数量,然后我必须尝试通过以下方式将其计算为相似性: 100 - (no.differences/no.characters_in_scnd_string * 100) 例如,如果我测试“ab”与“abc”有多相似,我会得到大约66%的相似性,这是有意义的,因为“ab”与“abc”有2/3相似 我遇到的问题是,当我测试“abcabc”到“abc”时,我得

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

100 - (no.differences/no.characters_in_scnd_string * 100)
例如,如果我测试
“ab”
“abc”
有多相似,我会得到大约66%的相似性,这是有意义的,因为
“ab”
“abc”
有2/3相似

我遇到的问题是,当我测试
“abcabc”
“abc”
时,我得到了100%的相似性,因为
“abc”
完全存在于
“abcabc”
中。然而,我希望答案是50%,因为50%的abcabc与abc相同

我希望这有点道理。。。第二个字符串是常量,我想测试不同字符串与该字符串的相似性。我所说的相似,是指尽管词序不同,但“猫狗”和“狗猫”的相似性极高


有什么想法吗?

使用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
因此,在
abcabc
abc
的情况下,我们得到了3,它是最大单词
abcabc
的50%。这正是你想要的

第二种情况是猫和狗:我的建议是将这些字符串拆分为单词,比较所有可能的组合,并选择最小的结果

更新:

我将用伪代码描述第二种情况,因为我不太熟悉
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 
get(cat-dog)并拆分为单词数组('cat','dog')//array1
get(dog-cat)并拆分为单词数组('dog','cat')//array2
var minValue=0;
对于'array1'的每个第i个元素`
var temp=maxIntegerValue//此处将存储“距离(i,j)”的所有结果
index=0//记住最小温度的索引
对于'array2'的每个第j个元素
if(温度<距离(i,j))
温度=距离(i,j)
指数=j
//在这里,我们找到了‘array2’中i的最小距离(i,j)值
//现在我们应该从“array2”中删除当前的j
从array2中删除j
//将临时值添加到最小值
最小值=最小值+温度
工作流程如下所示:

在对语句(对于值'cat'
array1
)的第一个
进行第一次迭代后,我们将得到0,因为
i=0
j=1
是相同的。然后
j=1
将从
array2
中删除,之后
array2
将只有elem
dog

对于
语句(对于值'dog'
array1
),我们在第二次
上的第二次迭代也将得到0,因为它与
array2
中的
dog
相同


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

这是对
Damerau–Levenshtein distance
Levenshtein distance

您可以检查此
StringMetric
算法是否满足您的需要


问题被标记为Swift。答案应使用适当的语言。@rmaddy我已删除代码。在我的回答中,主要的一点不是Levenshtein算法的精确实现。你能告诉我你将如何处理第二种情况吗?谢谢你的邀请help@HarryStuart我添加了一个解释不幸的是,该算法不适用于重新排列的单词。“猫和狗”和“狗和猫”应该非常相似,但有6个区别