python – 找到与目标字符串N字符长度最小距离的“N Gram”子字符串
作者:互联网
我正在寻找一种算法,最好用Python来帮助我找到最接近目标字符串N字符长的现有字符串,N字符长.
考虑目标字符串,即4个字符长,为:
targetString -> '1111'
假设这是我可以使用的字符串(我将为“最佳对齐”匹配生成此字符串):
nonEmptySubStrings -> ['110101']
上面的子字符串长度为4个字符:
nGramsSubStrings -> ['0101', '1010', '1101']
我想编写/使用一个“Magic Function”来选择最接近targetString的字符串:
someMagicFunction -> ['1101']
更多例子:
nonEmptySubStrings -> ['101011']
nGramsSubStrings -> ['0101', '1010', '1011']
someMagicFunction -> ['1011']
nonEmptySubStrings -> ['10101']
nGramsSubStrings -> ['0101', '1010']
someMagicFunction -> ['0101', '1010']
这个“魔术功能”是一个众所周知的子串问题吗?
我真的很想找到分钟. nonEmptySubStrings中的更改次数,以便将targetString作为子字符串.
解决方法:
根据OP的评论提出质疑,这是我们所期望的
import functools
def edit_distance(str1, str2):
#implement it here
f = functools.operator(edit_distance, target_string)
return min(f(s) for s in slices(string_)) # use slices from below
这将返回任何子字符串到目标字符串的最小编辑距离.它不会指示哪个字符串或其索引是什么.它可以很容易地修改
但是.
天真的方式,这可能是最好的方式,是
import functools
def diff(str1, str2):
# However you test the distance gets defined here. e.g. Hamming distance,
# Levenshtein distance, etc.
def slices(string_, L):
for i in xrange(len(string_) - L + 1)):
yield string_[i:i+L]
best_match = min(slices(string_), key=functools.partial(diff, target_string))
这不会返回发生子字符串的索引.当然你没有在你的问题中指明你需要它;)
如果你想要比这更好,它将取决于你如何测量距离,并且基本上归结为避免检查一些子串通过推断你必须改变至少x个字符以获得比你已经更好的匹配有.那时,您可以通过跳过x字符来改变x字符.
标签:python,substring,string-matching,string 来源: https://codeday.me/bug/20190606/1189357.html