超模糊名称检查?

时间:2010-07-20 13:22:05

标签: c# javascript asp.net sql-server fuzzy-search

我正在为内部CRM工作。该公司目前的前端允许大量重复。我试图阻止最终用户加入同一个人,因为他们搜索的是“比尔约翰逊”,而不是“威廉约翰逊”。因此,用户将提供有关其新客户的一些信息,我们将找到相似的名称(包括模糊名称),并将它们与我们数据库中已有的内容相匹配,并询问它们是否意味着那些东西......是这样的数据库还是技术存在吗?

6 个答案:

答案 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/

或Google缓存: http://webcache.googleusercontent.com/search?q=cache:Tr9taWl9hMIJ:swoodbridge.com/DoubleMetaPhone/+Stephen+Woodbridge+double_metaphon

导致许多其他有用的链接与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)

我曾经问了一个类似的问题。 Name Hypocorism List我从未尝试过使用它,但问题在工作中再次出现,所以我可以在.net中编写和开源库以进行一些匹配。

<强> 更新 我将我在那里提到的perl模块移植到C#并将其放在github上。 http://github.com/stimms/Nicknames

答案 2 :(得分:2)

实施Levenshtein距离:

http://en.wikipedia.org/wiki/Levenshtein_distance

这可以写成SQL函数,并以多种不同的方式查询。

答案 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

至于完整/昵称搜索,我所知道的并没有构建它。昵称因地区而异,需要跟踪的信息很多。可能有一个数据库将全名与昵称相关联,您可以在自己的应用程序中使用这些昵称。