1

假设我有一个参考字符串

“abcdabcd”

和一个目标字符串

“abcdabed”

javascript和python中有没有简单的方法来获取字符串序列相似度?

例子:

“abcdabcd”与“abcdabEd”的区别在于字符“E”,因此相似度较高但小于 1.0

“bcdabcda”与“abcdabEd”有很大不同,因为特定字符串索引处的每个字符都不同,因此相似度为0.0

请注意,相似度不是每个字符串中有多少相似字符,而是序列彼此之间的相似程度

因此像这样的代码

# python - incorrect for this problem 
difflib.SequenceMatcher(None, "bcdabcda", "abcdabEd").ratio()

会错的

4

2 回答 2

2

您可以使用这个通用公式,它适用于具有相同或不同长度的字符串或对象数组:

相似度=#common/(sqrt(nx*ny));

其中#common 是常见的事件(在这种情况下是匹配字符的数量);
nx 是对象数组 x(或称为 x 的字符串)的长度;
ny 是对象 y 数组(或称为 y 的字符串)的长度。

如果字符串的长度相同,则公式简化为简单的情况:

相似度=#common/n;
其中:n=nx=ny。

在 python 中,这个字符串相似度的公式(考虑到字符的顺序,如你所愿)可以写成:

from math import sqrt

def similarity(x, y):
    n=min(len(x), len(y))
    common=0
    for i in range(n):
        if (x[i]==y[i]):
            common+=1
    return common/sqrt(len(x)*len(y))

在javascript中它是类似的。

于 2013-02-25T22:10:08.943 回答
1

怎么样

float(sum([a==b for a,b in zip(my_string1,my_string2)]))/len(my_string1)



>>> s1,s2 = "abcdabcd","abcdabEd"
>>> print float(sum([a==b for a,b in zip(s1,s2)]))/len(s1)
0.875
于 2013-02-25T21:38:15.107 回答