使用 Difflib 的模糊字符串匹配get_matching_blocks无法检测到所有子字符串



我正在尝试查找段落中单词的所有出现,我希望它也能解释拼写错误。法典:

to_search="caterpillar"
search_here= "caterpillar are awesome animal catterpillar who like other humans but not other caterpilar"
#search_here has the word caterpillar repeated but with spelling mistakes
s= SequenceMatcher(None, to_search, search_here).get_matching_blocks()
print(s)
#Output  : [Match(a=0, b=0, size=11), Match(a=3, b=69, size=0)] 
#Expected: [Match(a=0, b=0, size=11), Match(a=0, b=32, size=11), Match(a=0, b=81, size=11)]

Difflib get_matching_blocks仅检测search_here字符串中"毛毛虫"的第一个实例。我希望它给我所有紧密匹配块的输出,即它应该识别

"毛毛虫"、"毛毛虫"和"毛毛虫"如何解决这个问题?

您可以计算每个单词与to_search的编辑距离。然后,您可以选择所有编辑距离"足够低"的单词(0 分表示完全匹配(。

多亏了你的问题,我发现有一个 pip-install-able edit_distance Python 模块。以下是我第一次尝试的几个例子:

>>> edit_distance.SequenceMatcher('fabulous', 'fibulous').ratio()
0.875
>>> edit_distance.SequenceMatcher('fabulous', 'wonderful').ratio()
0.11764705882352941
>>> edit_distance.SequenceMatcher('fabulous', 'fabulous').ratio()
1.0
>>> edit_distance.SequenceMatcher('fabulous', '').ratio()
0.0
>>> edit_distance.SequenceMatcher('caterpillar', 'caterpilar').ratio()
0.9523809523809523

因此,看起来比率方法会给您一个介于 0 和 1(含(之间的数字,其中 1 是完全匹配,0 是......甚至不在同一个联盟 XD 中。所以是的,您可以选择比率大于 1 的单词 - epsilon,其中 epsilon 可能是 0.1 左右。

最新更新