问题描述
我正在尝试使用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.附近的任何东西。当搜索字词与数据库中的地名之一完全匹配时,我必须使用哪种逻辑来使其返回某些内容?
1楼
回想一下,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])
这应该为您提供不区分大小写的搜索。