当前位置: 代码迷 >> python >> 多个单词之间的最小Levenshtein距离
  详细解决方案

多个单词之间的最小Levenshtein距离

热度:51   发布时间:2023-06-13 14:25:34.0

我正在尝试使用Levenshtein算法对商业上最接近的单词进行一些字符串匹配。 (在python中,但语言不会有很大的不同)

一个示例查询将是

search ='bna'lat&lon在我寻找的结果附近。

通过搜索BNA,经纬度旁边有一家名为BNA Brewing Co.的酒吧,我希望那是第一个出现的酒吧(如bna == bna)

我尝试了两种不同的方式

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

不根据地理距离返回排名,仅返回levenshtein距离

  • 市中心的咖啡和书籍
  • 谈咖啡
  • 破烂安和安迪的

并且考虑到地理距离,仅次于莱文施泰因

  • Shapers美发沙龙和水疗中心
  • 阿莫拉日间水疗中心
  • 纯美学和微色素沉着

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

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

  • 肯德基
  • O
  • A&W

并且考虑到地理距离,仅次于莱文施泰因

  • A&W
  • A&W
  • 肯德基

因此,您可以看到两种方式都无法返回BNA Brewing Co.附近的任何东西。当搜索字词与数据库中的地名之一完全匹配时,我必须使用哪种逻辑来使其返回某些内容?

回想一下,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])

这应该为您提供不区分大小写的搜索。