gpt4 book ai didi

django - 有没有一种方法可以根据字符串相似性(Django difflib)来过滤Django查询集?

转载 作者:行者123 更新时间:2023-12-04 08:38:34 25 4
gpt4 key购买 nike

我需要将潜在客户与我们的客户数据库进行匹配。

潜在客户来自大量的第三方提供商(成千上万笔记录),销售人员要求我们(以他们的话)“过滤掉客户”,这样他们才不会尝试将我们的服务卖给已建立的客户。

显然,潜在客户中的拼写错误。查尔斯(Charles)成为查理(Charlie),约瑟夫(Joseph)成为乔(Joe),依此类推。因此,我不能真正做一个过滤器来比较Lead_first_name和client_first_name等。

我需要使用某种string similarity机制。

现在,我正在使用可爱的difflib将销售线索的名字和姓氏与Client.objects.all()生成的列表进行比较。它可以工作,但是由于客户端数量众多,所以速度往往很慢。

我知道大多数sql数据库都有soundex和difference函数。请在下面的更新中查看我对它的测试-它与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的回复后进行编辑:

在写自己的书之前,我先找了和 found a T-SQL implementation of Levenshtein Distance in the repository of all knowledge.

在测试它时,它仍然没有比difflib更好的匹配工作。

这促使我研究了difflib背后的算法。它似乎是 modified version算法的 Ratcliff-Obershelp

不幸的是,我似乎找不到其他已经基于difflib的T-SQL实现创建过的灵魂……我会尽力而为。

如果在接下来的几天中没有其他人能提供更好的答案,我将把它授予gruszczy。谢谢你,先生。

最佳答案

soundex对您没有帮助,因为它是一种语音算法。乔和约瑟夫在语音上并不相似,因此soundex不会将它们标记为相似。

您可以尝试PostgreSQL中实现的Levenshtein distance。也许也在您的数据库中,如果没有,您应该能够编写一个存储过程,该过程将计算两个字符串之间的距离并在计算中使用它。

关于django - 有没有一种方法可以根据字符串相似性(Django difflib)来过滤Django查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com