我正在为内部CRM工作。该公司目前的前端允许大量重复。我试图阻止最终用户加入同一个人,因为他们搜索的是“比尔约翰逊”,而不是“威廉约翰逊”。因此,用户将提供有关其新客户的一些信息,我们将找到相似的名称(包括模糊名称),并将它们与我们数据库中已有的内容相匹配,并询问它们是否意味着那些东西......是这样的数据库还是技术存在吗?
答案 0 :(得分:6)
我在一个网站上实现了这样的功能。我在PHP中使用double_metaphone()+ levenstein()。我为dabatase中的每个条目预先计算了一个double_metaphone(),我使用“metaphoned”搜索词的前x个字符的SELECT进行查找。
然后我根据他们的levenstein距离对返回的结果进行排序。 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($字);
2)在查询时,$ word对数据库进行模糊搜索:$ soundslike = double_metaphone($ word)
4)SELECT * FROM table
WHERE soundlike
LIKE $ soundlike(如果你将levenstein存储为一个过程,更好:SELECT * FROM table WHERE levenstein({ {1}},$ soundlike)< mythreshold ORDER BY levenstein(soundlike
,$ word)ASC LIMIT ...等
它对我来说效果很好,虽然我不能使用存储过程,因为我无法控制服务器,而且它使用MySQL 4.20或其他东西。
答案 1 :(得分:4)
<强> 更新 强> 我将我在那里提到的perl模块移植到C#并将其放在github上。 http://github.com/stimms/Nicknames
答案 2 :(得分:2)
答案 3 :(得分:1)
SSIS有一些模糊逻辑任务,我们用它来查找事后的重复项。
我认为你需要让你的逻辑看起来不只是名称,以获得最佳结果。如果他们输入地址,电子邮件或电话信息,也许您可以查找具有相同姓氏的人与其他一个或多个匹配,并询问其中一个人是否会这样做。您还可以为各种名称制作一个昵称表,并对其进行匹配。你不会得到所有这些,但你至少可以在你的国家得到一些最常见的。
答案 4 :(得分:0)
您可以使用SOUNDEX获取类似的声音名称。但是,它与威廉和比尔不相称。
以SQL为例。
SELECT SOUNDEX('John'), SOUNDEX('Jon')
答案 5 :(得分:0)
SQL Server中有一些内置的SOUNDS LIKE功能,请参阅SOUNDEX http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx
至于完整/昵称搜索,我所知道的并没有构建它。昵称因地区而异,需要跟踪的信息很多。可能有一个数据库将全名与昵称相关联,您可以在自己的应用程序中使用这些昵称。