多个单词的最小Levenshtein距离

时间:2017-02-09 18:46:46

标签: python algorithm python-3.x levenshtein-distance edit-distance

我正在尝试使用Levenshtein算法对企业中最接近的单词进行一些字符串匹配。 (在python中,语言不会产生巨大的差异)

示例查询将是

搜索=' bna' 拉特&离我正在寻找的结果很近。

在BNA Brewing Co.的纬度和经度上有一家酒吧,通过搜索BNA,我的希望将首先出现(如bna == bna)

我尝试了两种不同的方式

m = min([editdistance.eval(search, place_split) for place_split in place.name.split(' ')
                     if place_split not in string.punctuation])

返回没有基于地理距离的排名,只有levenshtein距离

  • 咖啡&市中心的书籍
  • 谈论' n'咖啡
  • Raggedy Ann&安迪' S

考虑到地理距离,继承levenshtein

  • Shapers Hair Salon&水疗
  • Amora Day Spa
  • 纯美学和微量色素沉着

m = editdistance.eval(search, place.name)

第一个返回没有基于地理距离的排名,只有levenshtein距离

  • KFC
  • MOO
  • A&安培; W

考虑到地理距离,继承levenshtein

  • A&安培; W
  • A&安培; W
  • KFC

所以你可以看到,两种方式都没有返回BNA Brewing Co.附近。 当搜索词与我的数据库中的某个地名完全匹配时,我必须使用什么样的逻辑来返回它?

1 个答案:

答案 0 :(得分:1)

回想一下,Levenshtein距离计算将一个字符串转换为另一个字符串所需的替换,添加和删除的数量。因此,在比较相似长度的字符串时,它们通常会被最小化(因为即使需要进行大量替换,您也不必添加或删除一堆字符)。您可以在第二个示例中看到这一点,其中您的最佳输出与搜索字符串(len("bna") == len("A&W"))的长度相同。

如果您的搜索字符串始终是一个单词,那么您计算字符串中每个单词的距离的想法很好,因为每个单词更可能与搜索字符串的长度相似。但是,目前您正在进行区分大小写的比较,这意味着我猜测您不想要的editdistance.eval('bna', 'BNA') == 3

尝试:

m = min([editdistance.eval(search.lower(), place_split.lower()) for place_split in place.name.split(' ') if place_split not in string.punctuation])

应该给你一个不区分大小写的搜索。