Python 跨多个单词的最小Levenshtein距离
我正在尝试使用Levenshtein算法对商业上最接近的单词进行字符串匹配。在python中,但语言不会有很大的区别 一个示例查询是 搜索='bna' lat和lon与我期待的结果非常接近 在经纬度附近有一家酒吧叫BNA Brewing Co。通过搜索BNA,我希望它首先显示为BNA==BNA 我试过两种不同的方法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(' ')
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])