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
的形式实现了类似的比率。它分两步计算比率:
我目前使用C++的FixIB端口与LevsHeTin距离的快速位并行实现,权重插入=1,删除=1,替换=2。当前的实施可在以下位置找到:
- 提取匹配的块:
- 计算加权Levenshtein:
- 将它们结合起来计算端部比率:
- 仅使用替换/插入(或赋予替换权重2,具有类似效果)
- 允许在较长字符串的开头有间隙
- 只要剩余的子字符串不短于较短字符串的长度,则允许在较长字符串的末尾留有间隙
- 最理想的情况是,它强制子字符串具有相似的长度(当它不在末尾时),因此它匹配FuzzyWuzzy的行为,但当它允许更长的子序列也匹配时,它就可以了:例如,对于
:aaba
,这意味着,允许使用aaa
作为最佳子序列,而不是aaba
aab