【问题标题】:Super fuzzy name checking?超级模糊的名字检查?
【发布时间】:2025-11-23 13:15:02
【问题描述】:

我正在为内部 CRM 开发一些东西。该公司当前的前端允许大量重复。我试图阻止最终用户输入同一个人,因为他们搜索的是“Bill Johnson”而不是“William Johnson”。因此,用户将输入一些关于他们的新客户的信息,我们会找到相似的名称(包括模糊名称)并将它们与我们数据库中已有的内容进行匹配,并询问他们是否意味着这些东西......这样的数据库或技术存在吗?

【问题讨论】:

  • 哈哈谢谢BenV,我不知道有模糊搜索标签:)
  • 这听起来像是一个问题,你需要抛出你能找到的每一个技巧。考虑给自己买几本婴儿名册:P 国际版。
  • 哈哈,就像我说的那样 - 是时候开源一个新的 github 项目了 :) 我想知道是否有办法让 PHP 和 ASP.NET 都可以利用我所做的 -我不知道我是否想在 js 中这样做....
  • 这很容易成为我做过的最有帮助的帖子:) 谢谢大家!每个人都发布了非常有用的链接和建议

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


【解决方案1】:

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

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

【讨论】:

  • 是的,我正在考虑做一个 open/php/mysql 替代方案,因为那是我的事:) 但是对于这个特定的项目,我很想找到一个带有昵称等的 .net 匹配器
  • 那一点 perl 对于添加到新的打开项目肯定很有用
【解决方案2】:

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

或谷歌缓存: 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) 在查找时,对数据库进行模糊搜索:$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 或其他东西。

【讨论】:

  • 这太棒了……也许是公共 github? :)
  • 添加了更多信息的 URL。各种 double_metaphone() 实现。现在我记得更清楚了:我借用了 Stephen Woodbridge 的 PHP 实现,并根据我的需要稍微修改了它(取消了限制,以便 double_metaphone 整个术语,而不仅仅是前第四个字符等)
  • 很想知道这个想法是如何实现的——从 github 的链接来看,不是那么多。但是用例仍然存在,即使它很模糊,这种方法听起来也很有希望。还是只是 Lucene 好得多?
【解决方案3】:

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

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

【讨论】:

  • 是的。这就是为什么我想尽快在 github 上打开一些项目,以便我可以添加尽可能多的内容,并且其他地方的人可以添加他们的本地化昵称匹配
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    您可以使用 SOUNDEX 获得类似的发音名称。但是,它与 William 和 Bill 不匹配。

    以 SQL 为例试试这个。

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

    【讨论】:

    • 这是一个标准的 SQL 函数吗?我知道 Oracle 支持这一点,但还有其他支持吗?
    • MS Sql Server 支持 SOUNDEX 和 DIFFERENCE
    • 它在 SQL Server 中,OP 将问题标记为。我不知道其他人。
    【解决方案6】:

    实现 Levenshtein 距离:

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

    这可以写成一个 SQL 函数并以多种不同的方式进行查询。

    【讨论】:

    • A+ 代表酷炫的计算机科学理想。正如我在另一条关于希望打开 mysql 名称数据库的评论中所说的那样,我想包括一些东西来达到这种效果。我唯一担心的是,这在许多情况下会检查错误距离,而实际上有些昵称看起来不像它们的起源,但同样非常有用
    • 像 Jim 和 James 这样的 Mmh 组合完全不同,不确定这是一个合适的衡量标准。
    • 是的,我认为它可以捕捉到很多事故,它仍然需要检查我们当前的数据库,所以如果我要求差异低于 4 并且它在我们的数据库中可能是一些有用的结果