我正在为内部 CRM 做一些事情。该公司当前的前端允许大量重复。我试图阻止最终用户输入同一个人,因为他们搜索的是“Bill Johnson”而不是“William Johnson”。因此,用户将输入一些关于他们的新客户的信息,我们会找到相似的名称(包括模糊名称)并将它们与我们数据库中已有的内容进行匹配,并询问他们是否意味着这些东西......这样的数据库或技术存在吗?
6 回答
我在一个网站上实现了这样的功能。我在 PHP 中使用 double_metaphone() + levenstein()。我为 dabatase 中的每个条目预先计算了一个 double_metaphone(),我使用“metaphoned”搜索词的前 x 个字符的 SELECT 进行查找。
然后我根据他们的列文斯坦距离对返回的结果进行排序。double_metaphone() 不是任何 PHP 库的一部分(上次我检查过),所以我借用了很久以前在网上某个地方找到的 PHP 实现(网站不再在线)。我应该把它贴在我想的地方。
编辑:该网站仍在 archive.org:http://web.archive.org/web/20080728063208/http://swoodbridge.com/DoubleMetaPhone/
这导致了许多其他有用的与 double_metaphone() 源代码的链接,包括 github 上的 Javascript 中的一个链接:http: //github.com/maritz/js-double-metaphone
编辑:浏览我的旧代码,这里大致是我所做的步骤,伪编码以保持清晰:
1) 为数据库中的每个单词预先计算一个double_metaphone(),即$word='blahblah';$soundslike=double_metaphone($word);
2) 在查找时,对数据库进行模糊搜索:$soundslike = double_metaphone($word)
4) SELECT * FROM table
WHERE soundlike
LIKE $soundlike (如果您将 levenstein 存储为过程,那就更好了: SELECT * FROM table WHERE levenstein( soundlike
,$soundlike) <mythreshold ORDER BY levenstein( word
,$word) ASC LIMIT ... 等等。
虽然我不能使用存储过程,但它对我来说效果很好,因为我无法控制服务器并且它使用的是 MySQL 4.20 或其他东西。
我曾经问过类似的问题。Name Hypocorism List 我从来没有用它做任何事情,但问题在工作中再次出现,所以我可能会在 .net 中编写并开源一个库来进行一些匹配。
更新: 我将我在那里提到的 perl 模块移植到 C# 并将它放在 github 上。 http://github.com/stimms/昵称
好吧,SSIS 有一些模糊逻辑任务,我们用来在事后查找重复项。
我认为虽然你需要让你的逻辑不仅仅是名称以获得最佳结果。如果他们输入地址、电子邮件或电话信息,也许您可以寻找具有相同姓氏的人与一个或多个其他匹配项,并询问他们中的一个是否会这样做。您还可以为各种名称制作一个昵称表并与之匹配。你不会得到所有这些,但你至少可以得到一些在你的国家最常见的。
您可以使用 SOUNDEX 获得类似的发音名称。但是,它不会与例如威廉和比尔相匹配。
以 SQL 为例试试这个。
SELECT SOUNDEX('John'), SOUNDEX('Jon')
SQL Server 中有一些内置的 SOUNDS LIKE 功能,请参阅 SOUNDEX http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx
至于完整/昵称搜索,我知道没有任何构建它。昵称因地区而异,需要跟踪的信息很多。可能有一个将全名链接到昵称的数据库,您可以在自己的应用程序中使用这些昵称。