Python 跨多个单词的最小Levenshtein距离

Python 跨多个单词的最小Levenshtein距离,python,algorithm,python-3.x,levenshtein-distance,edit-distance,Python,Algorithm,Python 3.x,Levenshtein Distance,Edit Distance,我正在尝试使用Levenshtein算法对商业上最接近的单词进行字符串匹配。在python中,但语言不会有很大的区别 一个示例查询是 搜索='bna' lat和lon与我期待的结果非常接近 在经纬度附近有一家酒吧叫BNA Brewing Co。通过搜索BNA,我希望它首先显示为BNA==BNA 我试过两种不同的方法 m = min([editdistance.eval(search, place_split) for place_split in place.name.split(' ')

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

一个示例查询是

搜索='bna' lat和lon与我期待的结果非常接近

在经纬度附近有一家酒吧叫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距离

市中心的咖啡和书籍 谈咖啡 拉格迪·安和安迪的 并考虑到地理距离,仅次于列文施泰因

Shapers美发沙龙和水疗中心 阿莫拉日温泉酒店 纯美学与微色素沉着 及

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

肯德基 哞 A&W 并考虑到地理距离,仅次于列文施泰因

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

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

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

尝试:


这将为您提供不区分大小写的搜索

这就是我错过的!现在的结果是:BNA Brew CO.,Bia Boro Kelowna,Boa Thong泰国美食餐厅。非常感谢!我猜我错误地认为它是不区分大小写的editdistance会更低,因为我在写一篇快速而肮脏的levenshtein时就是这么做的。
m = editdistance.eval(search, place.name)
m = min([editdistance.eval(search.lower(), place_split.lower()) for place_split in place.name.split(' ') if place_split not in string.punctuation])