javascript和python中的字符串序列相似性/差异率

javascript和python中的字符串序列相似性/差异率,javascript,python,Javascript,Python,假设我有一个引用字符串 “abcdabcd” 和一个目标字符串 “abcdabEd” 在javascript和python中是否有一种简单的方法可以获得字符串序列相似性比率 例如: “abcdabcd”与“abcdabEd”的区别在于字符“E”,因此相似性比率很高,但小于1.0 “bcdabcdda”与“abcdababed”有很大的区别,因为特定字符串索引中的每个字符都不同,因此相似性比为0.0 请注意,相似性比率不是每个字符串中有多少相似字符,而是序列之间的相似程度 因此代码类似于 # py

假设我有一个引用字符串

“abcdabcd”

和一个目标字符串

“abcdabEd”

在javascript和python中是否有一种简单的方法可以获得字符串序列相似性比率

例如:

“abcdabcd”与“abcdabEd”的区别在于字符“E”,因此相似性比率很高,但小于1.0

“bcdabcdda”与“abcdababed”有很大的区别,因为特定字符串索引中的每个字符都不同,因此相似性比为0.0

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

因此代码类似于

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

怎么样

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

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

相似性=#公共/(sqrt(nx*ny))

其中#common是常见的事件(在本例中是匹配字符的数量)
nx是对象数组x(或称为x的字符串)的长度
ny是对象数组y(或称为y的字符串)的长度

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

相似性=#普通/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中也是类似的。

你试过这个吗?听起来一点也不难。您需要定义它在不同长度的字符串中的行为,但对于相同长度的字符串,它应该很简单。@bfavaretto:这与Levenshtein距离不同。当然,这有点模糊,但请注意,第二个示例的编辑距离相当小,只有一次删除和一次插入。但是请求会让它们尽可能的分开。@ScottSauyet我明白了,我必须承认我没有太注意这些例子。我喜欢这个答案的简单性,有javascript等价物吗?