有没有办法根据字符串相似性过滤django查询集(la python difflib
我需要将冷线与我们客户的数据库相匹配.
这些销售线索来自第三方提供商(数千条记录),销售人员要求我们(用他们的话说)“过滤掉我们的客户”,这样他们就不会尝试将我们的服务卖给老牌客户. 显然,线索中存在拼写错误.查尔斯成为查理,约瑟夫成为乔等等.所以我真的不能只是做一个过滤器,比较lead_first_name和client_first_name等. 我需要使用某种string similarity机制. 现在我正在使用可爱的difflib将引导的名字和姓氏与使用Client.objects.all()生成的列表进行比较.它的工作原理,但由于客户端的数量往往很慢. 我知道大多数sql数据库都有soundex和差异函数.在下面的更新中查看我对它的测试 – 它不像difflib那样有用. 还有其他解决方案吗?有更好的解决方案吗? 编辑: 至少在我的数据库中,Soundex的表现不如difflib. 这是一个简单的测试 – 在包含“Joseph Lopes”的表格中查找“Joe Lopes”: with temp (first_name,last_name) as ( select 'Joseph','Lopes' union select 'Joe','Satriani' union select 'CZ','Lopes' union select 'Blah','Lopes' union select 'Antonio','Lopes' union select 'Carlos','Lopes' ) select first_name,last_name from temp where difference(first_name+' '+last_name,'Joe Lopes') >= 3 order by difference(first_name+' '+last_name,'Joe Lopes') 以上返回“Joe Satriani”作为唯一的比赛.即使将相似性阈值降低到2,也不会将“Joseph Lopes”作为潜在匹配. 但是difflib做得更好: difflib.get_close_matches('Joe Lopes',['Joseph Lopes','Joe Satriani','CZ Lopes','Blah Lopes','Antonio Lopes','Carlos Lopes']) ['Joseph Lopes','Carlos Lopes'] 在gruszczy的回复后编辑: 在写我自己之前,我找了found a T-SQL implementation of Levenshtein Distance in the repository of all knowledge. 在测试中,它仍然不会比difflib做更好的匹配工作. 这让我研究了difflib背后的算法.它似乎是Ratcliff-Obershelp算法的modified version. 不幸的是,我似乎找不到其他一些已经基于difflib创建了T-SQL实现的灵魂……我会尽力尝试. 如果没有其他人在接下来的几天内得到更好的答案,我会将其授予gruszczy.谢谢,亲切的先生. 解决方法
soundex不会帮助你,因为它是一种语音算法.乔和约瑟夫在语音上并不相似,所以soundex不会将它们标记为相似.
您可以尝试在PostgreSQL中实现的Levenshtein distance.也许在您的数据库中,如果没有,您应该能够编写一个存储过程,它将计算两个字符串之间的距离并在计算中使用它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |