Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最优对齐的字符串相似性 算法的预期行为_Algorithm_Levenshtein Distance_Edit Distance_Sequence Alignment - Fatal编程技术网

Algorithm 最优对齐的字符串相似性 算法的预期行为

Algorithm 最优对齐的字符串相似性 算法的预期行为,algorithm,levenshtein-distance,edit-distance,sequence-alignment,Algorithm,Levenshtein Distance,Edit Distance,Sequence Alignment,我有两个字符串a和b,其中a是较短的字符串。我想找到与a最相似的b子字符串。子字符串必须是len(a),或者必须放在b的末尾。 e、 g.对于以下两个字符串: a = "aa" b = "bbaba" b的可能子串是 "bb" "ba" "ab" "ba" "a" "" 编辑距离定义为插入和删除的数量。不可能进行替换(必须使用插入+删

我有两个字符串
a
b
,其中
a
是较短的字符串。我想找到与
a
最相似的
b
子字符串。子字符串必须是
len(a)
,或者必须放在
b
的末尾。 e、 g.对于以下两个字符串:

a = "aa"
b = "bbaba"
b的可能子串是

"bb"
"ba"
"ab"
"ba"
"a"
""
编辑距离定义为插入和删除的数量。不可能进行替换(必须使用插入+删除)。根据以下等式计算两个字符串之间的相似性:
norm=1-距离/(len(a)+len(子字符串))
。 因此,上面的子字符串将提供以下结果:

"bb" -> 2 DEL + 2 INS -> 1 - 4 / 4 = 0
"ba" -> 1 DEL + 1 INS -> 1 - 2 / 4 = 0.5
"ab" -> 1 DEL + 1 INS -> 1 - 2 / 4 = 0.5
"ba" -> 1 DEL + 1 INS -> 1 - 2 / 4 = 0.5
"a"  ->         1 INS -> 1 - 1 / 3 = 0.66
""   ->         2 INS -> 1 - 2 / 2 = 0
因此算法应该返回0.66

不同的实现 Python库fuzzyfuzzy以
fuzz.partial\u ratio
的形式实现了类似的比率。它分两步计算比率:

  • 使用difflib.SequenceMatcher.get_matching_块在较长序列中搜索匹配的子序列

  • 计算从匹配子序列开始的len(较短的_字符串)子字符串的比率,并返回最大比率

  • 这真的很慢,所以它在可用时使用python Levenshtein进行相似性计算。这将基于更快的Levenshtein距离执行相同的计算。但是,在边缘情况下,用于比率计算的计算匹配_块是完全错误的(请参阅),当正确性相关时,这并不意味着它是合适的替代品

    当前实施

    我目前使用C++的FixIB端口与LevsHeTin距离的快速位并行实现,权重插入=1,删除=1,替换=2。当前的实施可在以下位置找到:

    • 提取匹配的块:
    • 计算加权Levenshtein:
    • 将它们结合起来计算端部比率:
    问题: 有没有更快的算法来计算这种相似性。要求如下:

    • 仅使用替换/插入(或赋予替换权重2,具有类似效果)
    • 允许在较长字符串的开头有间隙
    • 只要剩余的子字符串不短于较短字符串的长度,则允许在较长字符串的末尾留有间隙
    • 最理想的情况是,它强制子字符串具有相似的长度(当它不在末尾时),因此它匹配FuzzyWuzzy的行为,但当它允许更长的子序列也匹配时,它就可以了:例如,对于
      aaba
      aaa
      ,这意味着,允许使用
      aaba
      作为最佳子序列,而不是
      aab

    我删除了C++标签,因为这是一个算法请求,而不是代码请求。啊,是的,我是说最大的标准化编辑距离最通用的是Needlemann Wunch,但那是O(n*m)。Smitth Waterman速度更快,但不计算最佳对齐方式,也不计算距离。存在适用于N-W的窗口/平铺变体(Hirchberg)。对于LCS,请使用史密斯·沃特曼