加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

有没有办法根据字符串相似性过滤django查询集(la python difflib

发布时间:2020-12-14 05:16:29 所属栏目:大数据 来源:网络整理
导读:我需要将冷线与我们客户的数据库相匹配. 这些销售线索来自第三方提供商(数千条记录),销售人员要求我们(用他们的话说)“过滤掉我们的客户”,这样他们就不会尝试将我们的服务卖给老牌客户. 显然,线索中存在拼写错误.查尔斯成为查理,约瑟夫成为乔等等.所以我真
我需要将冷线与我们客户的数据库相匹配.

这些销售线索来自第三方提供商(数千条记录),销售人员要求我们(用他们的话说)“过滤掉我们的客户”,这样他们就不会尝试将我们的服务卖给老牌客户.

显然,线索中存在拼写错误.查尔斯成为查理,约瑟夫成为乔等等.所以我真的不能只是做一个过滤器,比较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.也许在您的数据库中,如果没有,您应该能够编写一个存储过程,它将计算两个字符串之间的距离并在计算中使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读