跨多个单词的最小 Levenshtein 距离
Minimum Levenshtein distance across multiple words
我正在尝试使用 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])
returns 没有根据地理距离排名,只有 levenshtein 距离
- 镇中心的咖啡和书籍
- 聊天'n'喝咖啡
- 衣衫褴褛的安和安迪
考虑到地理距离,仅次于 levenshtein
- Shapers 美发沙龙和水疗中心
- 阿莫拉日间水疗中心
- 纯粹的美学和微色素沉着
和
m = editdistance.eval(search, place.name)
第一个return没有根据地理距离排名,只有levenshtein距离
- 肯德基
- 哞
- A&W
考虑到地理距离,仅次于 levenshtein
- A&W
- A&W
- 肯德基
因此您可以看到,return任何一种方法都不接近 BNA Brewing Co。
当搜索字词与我的数据库中的某个地名完全匹配时,我必须使用什么样的逻辑才能将其变为 return?
回想一下,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])
这应该会为您提供不区分大小写的搜索。
我正在尝试使用 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])
returns 没有根据地理距离排名,只有 levenshtein 距离
- 镇中心的咖啡和书籍
- 聊天'n'喝咖啡
- 衣衫褴褛的安和安迪
考虑到地理距离,仅次于 levenshtein
- Shapers 美发沙龙和水疗中心
- 阿莫拉日间水疗中心
- 纯粹的美学和微色素沉着
和
m = editdistance.eval(search, place.name)
第一个return没有根据地理距离排名,只有levenshtein距离
- 肯德基
- 哞
- A&W
考虑到地理距离,仅次于 levenshtein
- A&W
- A&W
- 肯德基
因此您可以看到,return任何一种方法都不接近 BNA Brewing Co。 当搜索字词与我的数据库中的某个地名完全匹配时,我必须使用什么样的逻辑才能将其变为 return?
回想一下,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])
这应该会为您提供不区分大小写的搜索。