超模糊名称检查?

15

我正在为一家内部客户关系管理系统工作。公司当前的前端允许存在大量重复。我想要阻止终端用户因为搜索'Billy Johnson'而不是'William Johnson'而输入相同的人员信息。所以当用户输入有关他们的新客户的一些信息时,我们将寻找相似的名称(包括模糊名称),并将它们与我们数据库中已有的内容进行匹配,并询问他们是否指的是这些内容... 是否存在这样的数据库或技术?


哈哈,谢谢BenV,我不知道有一个模糊搜索标签 :) - Jon Phenow
这听起来像是你需要使用所有可以找到的技巧来解决的问题。考虑购买一些婴儿命名书:P还有国际版的。 - detly
哈哈,就像我说的那样 - 是时候开源一个新的Github项目了 :) 我想知道是否有一种方法可以让PHP和ASP.NET都能利用我所做的事情 - 虽然我不知道我是否想在js中做这件事.... - Jon Phenow
这很容易成为我所做的最有帮助的帖子 :) 谢谢大家! 每个人都发布了非常有用的链接和建议。 - Jon Phenow
6个回答

6
我在一个网站上实现了这样的功能。我使用PHP中的double_metaphone()+levenstein()。我为数据库中的每个条目预先计算了double_metaphone(),然后使用SELECT查找“metaphoned”搜索词的前x个字符来查找它。
然后,我根据它们的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($word);

2)在查找时,使用模糊搜索将$word与数据库进行匹配:$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或类似版本。


太棒了...公共的GitHub可能吗? :) - Jon Phenow
添加了更多关于double_metaphone()实现的信息链接。现在我记得了:我借用了Stephen Woodbridge的PHP实现,并稍微修改了一下以满足我的需求(去掉了限制,以便对整个术语进行double_metaphone,而不仅仅是前四个字符等)。 - R. Hill
很想知道这个想法的实际效果如何——根据对Github的链接判断,似乎并不理想。但是使用案例仍然存在,即使它有些模糊,听起来这种方法也很有前途。或者只是Lucene更好一些? - justSteve

4
我曾经问过类似的问题。 Name Hypocorism List 我从未尝试过做些什么,但在工作中又出现了这个问题,所以我可能会编写并开源一个在.NET上进行匹配的库。
更新:我将我提到的perl模块移植到C#,并将其放在github上。 http://github.com/stimms/Nicknames

是的,我正在考虑实现一个开放式的/PHP/Mysql替代方案,因为那是我的专长:)但对于这个具体项目,我希望找到一个能够配对昵称等信息的.NET匹配器。 - Jon Phenow
那段 Perl 代码肯定对于添加到一个新的开源项目中会很有用。 - Jon Phenow

2

对于酷炫的计算机科学理念,我给出A+评价。正如我在另一条评论中所说,希望能够打开一个MySQL名称数据库,我想要包含这样的内容。我的唯一担心是,在许多情况下,这将检查错误的距离,而实际上有些昵称看起来几乎不像它们的起源,但仍然非常有帮助。 - Jon Phenow
像Jim和James这样的配对是非常不同的,不确定它是否是一个合适的度量标准。 - Mau
是的,我认为它可以捕捉到相当多的差错,但仍需要针对我们当前的数据库进行检查,所以如果我需要将差异控制在4分以下并且在我们的数据库中,可能会得到一些有用的结果。 - Jon Phenow

1

嗯,SSIS有一些模糊逻辑任务,我们用来在事后查找重复项。

我认为,为了获得最佳结果,您需要让您的逻辑考虑更多的因素,而不仅仅是名称。如果他们输入地址、电子邮件或电话信息,也许您可以寻找具有相同姓氏和其中一个或多个其他匹配项的人,并询问其中之一是否可行。您还可以制作各种名称的昵称表,并进行匹配。您可能无法获取所有内容,但至少可以获得您国家中最常见的一些内容。


是的,确切地说。这就是为什么我想很快在Github上开一些项目,这样我就可以添加尽可能多的内容,其他地方的人也可以添加他们本地化的昵称匹配。 - Jon Phenow

0

您可以使用SOUNDEX来获取类似发音的名称。但是,例如William和Bill不会匹配。

作为示例,请在SQL中尝试此操作。

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

这是一个标准的SQL函数吗?我知道Oracle支持它,但其他数据库也支持吗? - TMN
MS Sql Server支持SOUNDEX和DIFFERENCE。 - Tor-Erik
它在SQL Server中,这是OP标记的问题。我不知道其他的。 - Robin Day

0

SQL Server 中有一些内置的 SOUNDS LIKE 功能,可以查看 SOUNDEX http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

至于全名/昵称搜索,我不知道是否有任何内置的功能。昵称因地区而异,需要跟踪大量信息。您可能会发现一个将全名链接到昵称的数据库,可以在自己的应用程序中利用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接