Swift 最优字符串比较法
获得两个字符串之间的百分比相似性的最佳算法是什么。到目前为止,我一直在使用Levenshtein,但这还不够。Levenshtein给了我差异的数量,然后我必须尝试通过以下方式将其计算为相似性: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”时,我得
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
将只有elemdog
对于
语句(对于值'dog'array1
),我们在第二次上的第二次迭代也将得到0,因为它与array2
中的dog
相同
至少从现在起,你知道如何处理你的问题了。现在取决于您将如何准确地实现它,可能您将采用另一种数据结构。这是对Damerau–Levenshtein distance
和Levenshtein distance
您可以检查此StringMetric
算法是否满足您的需要
问题被标记为Swift。答案应使用适当的语言。@rmaddy我已删除代码。在我的回答中,主要的一点不是Levenshtein算法的精确实现。你能告诉我你将如何处理第二种情况吗?谢谢你的邀请help@HarryStuart我添加了一个解释不幸的是,该算法不适用于重新排列的单词。“猫和狗”和“狗和猫”应该非常相似,但有6个区别