Algorithm 测试75%和#x2B;两个字符串的相似性?

Algorithm 测试75%和#x2B;两个字符串的相似性?,algorithm,sorting,Algorithm,Sorting,我需要一个函数,它接受两个字符串,如果它们的相似性超过75%,则返回一个布尔值。 Levenshtein可以工作,但我发现它对于我正在处理的数据量来说太慢了 如果我能先确定75%以上的相似性,我就可以运行Levenshtein进行精确的相似性匹配 编辑 以下是我所说的相似性的一些例子: isSimilar75("texts", "txts") //TRUE, 85% similar isSimilar75("hello world",

我需要一个函数,它接受两个字符串,如果它们的相似性超过75%,则返回一个布尔值。 Levenshtein可以工作,但我发现它对于我正在处理的数据量来说太慢了

如果我能先确定75%以上的相似性,我就可以运行Levenshtein进行精确的相似性匹配

编辑

以下是我所说的相似性的一些例子:

isSimilar75("texts", "txts") //TRUE, 85% similar
isSimilar75("hello world", "hello word") //TRUE, 91% similar
isSimilar75("this is an example of longer text", "this is an example of a longer txt") //TRUE, 92% similar
isSimilar75("this is a test", "test what") //FALSE, 29% similar

该函数计算类似于levenshtein的相似性。我只需要一个更简单的levenshtein版本,根据字符操作(添加、减去和替换字符)的数量,只返回字符串是否“大约”75%相似。该函数不需要返回百分比或进行任何精确计算,我只会对从该函数返回true的结果运行昂贵的levenshtein。

两个单词之间的levenshtein距离由其频率向量之间的L1距离降低。所以我们可以做一些类似的事情

import collections
def possiblySimilar75(s1, s2):
    c1 = collections.Counter(s1)
    c2 = collections.Counter(s2)
    return sum(abs(c1[x] - c2[x]) for x in set(c1.keys()) | set(c2.keys())) <= max(len(s1), len(s2)) / 4
导入集合
def可能相似75(s1、s2):
c1=集合计数器(s1)
c2=集合计数器(s2)

集合(c1.keys())|集合(c2.keys())中x的返回和(abs(c1[x]-c2[x])可以使用一个线性循环,使用计数器对两个排序的字符串进行比较

  • 第一个字符串索引,
    ai
  • 第二个字符串索引,
    bi
  • 字符相同
    字符
  • 中的字符不相同
  • 函数strDiff(a=”“,b=”“)
    {const_a=
    […a.toLowerCase()]排序()
    常数b=
    […b.toLowerCase()]排序()
    常量循环=(相同,不相同,ai,bi)=>
    ai>a.length&&bi>b.length
    ?相同/(相同+不相同)
    :ai>a.长度| | bi>b.长度
    ?回路(相同、非+1、ai+1、bi+1)
    :_a[ai]<\u b[bi]
    ?回路(相同,非+1,ai+1,bi)
    :_a[ai]>_b[bi]
    ?回路(相同,非+1,ai,bi+1)
    :循环(相同+1,不相同,ai+1,bi+1)
    返回循环(0,0,0,0)
    }
    
    console.log(strDiff(“fooBar”、“floBro”)//0.75
    Define 75%相似。@superbrain我添加了更多细节ref可能会有所帮助。