我正在尝试使用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距离
考虑到地理距离,继承levenshtein
所以你可以看到,两种方式都没有返回BNA Brewing Co.附近。 当搜索词与我的数据库中的某个地名完全匹配时,我必须使用什么样的逻辑来返回它?
答案 0 :(得分: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])
应该给你一个不区分大小写的搜索。