用于获得两个字符串之间的百分比相似性的最佳算法是什么。到目前为止,我一直在使用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"
具有极高的相似性,尽管词序不同。
有什么想法吗?
答案 0 :(得分:1)
Damerau–Levenshtein distance
和Levenshtein distance
你可以检查这个StringMetric
算法有你需要的东西
答案 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
因此,在abcabc
和abc
的情况下,我们得到3,它是最大单词abcabc
的50%。正是你想要实现的目标。
cats
和dogs
的第二种情况:我的建议是将此字符串拆分为单词并比较它们的所有可能组合并选择最小的结果。
更新:
我将用伪代码描述第二种情况,因为我对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 = 0
和j = 1
是正确的。然后j = 1
将从array2
移除,之后array2
将只有dog
。for
。
第二次array1
语句的第二次迭代(对于值&#39; dog&#39; dog
)我们也会得到0,因为它与来自{{1}的array2
是同意的}}
至少从现在起你就知道如何处理你的问题了。现在取决于你将如何实现它,可能你将采用另一种数据结构。