我正在尝试使用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距离,不根据地理距离排名返回
市中心的咖啡和书籍
喝咖啡聊天
拉格迪·安和安迪的
考虑到地理距离,仅次于Levenshtein
美发沙龙和水疗中心
阿莫拉日温泉
纯美学与微色素沉着
以及
m = editdistance.eval(search, place.name)

第一个不按地理距离排名,只按levenshtein距离排名
肯德基

A和W
考虑到地理距离,仅次于Levenshtein
A和W
A和W
肯德基
所以你可以看到,这两种方式都没有返回任何接近bna酿酒公司。
当搜索词与数据库中的一个地名完全匹配时,我必须使用什么样的逻辑才能让它返回某些内容?

最佳答案

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

这会给你一个不区分大小写的搜索。

10-08 19:59