我需要将冷线索与我们客户的数据库进行匹配。
潜在客户大量来自第三方提供商(数千条记录),销售要求我们(用他们的话说)“过滤掉我们的客户”,这样他们就不会试图将我们的服务出售给老客户。
显然,线索中有拼写错误。Charles 变成了 Charlie,Joseph 变成了 Joe,等等。所以我不能只做一个过滤器,比较lead_first_name 和 client_first_name 等等。
我需要使用某种字符串相似性机制。
现在我正在使用可爱的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', 'CZ Lopes', 'Carlos Lopes']
在 gruszczy 的回复后编辑:
在自己编写之前,我在所有知识的存储库中寻找并找到了 Levenshtein Distance 的 T-SQL 实现。
在测试它时,它仍然不会比 difflib 做更好的匹配工作。
这使我研究了 difflib 背后的算法。它似乎是Ratcliff -Obershelp算法的修改版本。
不幸的是,我似乎找不到其他善良的灵魂已经创建了基于 difflib 的 T-SQL 实现......我会尽可能地尝试一下。
如果在接下来的几天内没有其他人提出更好的答案,我会将其授予 gruszczy。谢谢,好心的先生。