超模糊名称检查?

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

我在一个网站上实现了这样的function。 我在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/

或谷歌缓存: 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( soundlike ,$ soundlike)word ,$ word)ASC LIMIT。 ……等

它对我来说效果很好,虽然我不能使用存储过程,因为我无法控制服务器而且它使用的是MySQL 4.20等。

我问过一次类似的问题。 名称Hypocorism列表我从来没有用它来做任何事情,但问题在工作中再次出现,所以我可能会在.net中编写和开源一个库来进行一些匹配。

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

实施Levenshtein距离:

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

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

那么SSIS有一些模糊的逻辑任务,我们用它来查找事后的重复。

我认为你需要让你的逻辑看起来不只是名称,以获得最佳结果。 如果他们输入地址,电子邮件或电话信息,也许您可​​以查找具有相同姓氏的人与其他一个或多个匹配,并询问其中一个人是否会这样做。 您还可以为各种名称制作一个昵称表,并对其进行匹配。 你不会得到所有这些,但你至少可以在你的国家得到一些最常见的。

您可以使用SOUNDEX获得类似的声音名称。 但是,它与威廉和比尔不相称。

以SQL为例进行尝试。

 SELECT SOUNDEX('John'), SOUNDEX('Jon') 

SQL Server中有一些内置的SOUNDS LIKEfunction,请参阅SOUNDEX http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

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