匹配数百万条记录的部分名称


10

我们已经开发了一个基于Web的名称匹配应用程序。它通过将名称分成多个部分进行操作,每个部分的Soundex值存储在数据库中。在莱文斯坦距离度量用于应用声音的百分比匹配以及拼写对一个给定的名称。

在运行时,我们将所有记录加载到内存中,并将Levenshtein距离应用于所有Soundex值以及所有名称的所有部分的拼写。

最初这样做很好,因为最多有2万个名称,但是现在我们的一位客户拥有3000万个名称。对于每个请求将巨大的列表加载到内存中并应用这种类型的匹配是一种可悲的方法,它占用了大量内存和执行时间。

我们正在寻找有关在不久的将来搜索声音和拼写百分比匹配的3000万条或更多记录的数据库的建议。

核心功能

最终用户输入要匹配的名称和最小百分比。我们应该在数据库中显示所有名称,其中名称的任何部分与给定名称的任何部分匹配到给定百分比。全名不需要匹配,只要匹配百分比最高就可以成功。例如。

Given Name: Helen Hunt
Name in DB: Holly Hunter 

两个名称的两个部分都不完全匹配,但在某种程度上不匹配,让我们假设80%,因此,如果用户输入80%,则DB中的名称必须显示为匹配名称。


1
您正在使用SQL Server吗?我看到您将其标记为asp.net。考虑使用CLR程序集的可能性,这将阻止网络流量并让SQL Server管理内存。
RubberChickenLeader

@WindRaven我们同时使用SQL Server和Oracle
bjan

1
这不是Google解决的同一个网络抓取问题吗?
candied_orange

@bjan名称存储在哪里?它们存储在SQL Server中吗?
RubberChickenLeader

你在找什么 与给定查询最匹配的前100个名称?
布朗

Answers:


6

在不知道所需详细信息的情况下,您可能想要执行以下一项操作:

我不完全了解安装和配置狮身人面像所涉及的内容;但是,我的印象是您可以将其指向数据库,告诉它要索引哪些字段,如何加权结果,这将为您提供匹配记录的有序列表。

对于面向用户或关键任务的资料,请使用现有的搜索工具。

如果您只是想学习,请使用ngrams:

一个ngrams查找表可以用作您的潜在匹配的初始集合,并且您可以使用Levenshtein距离对结果进行修剪和排序。

假设您要搜索people,则可以执行以下操作:

_ people _________
personId: int
name: varchar
soundex_name: varchar

_ people_ngrams __
personId: int
ngramId: int

_ ngrams _________
ngramId: int
ngram: char(3)
count: int

您可以定期重建ngram,也可以即时构建它们。无论哪种方式,一个简单的天真的搜索算法都可以像这样:

search_ngrams = ngrammify(soundex(search_string));

notable_ngrams = select top 10 *
  from ngrams
  where ngram in (search_ngrams)
  order by count asc;

possible_matches = select top 1000 distinct people.*
  from people_ngrams, people
  where ngramId in (notable_ngrams);

best_matches = top 100 possible_matches
  ordered by Levenshtein_distance(match, soundex(search_string));

使用此类似的内容(但进行了更多的ngram“流行度”调整,黑名单,白名单等),我已经看到这种算法模糊地将数据集之间的记录合并成批,以及促进自定义模糊搜索实用程序和正在进行的记录重复数据删除工作。

现在,以我为例,我没有匹配数百万条记录,而是希望在两个数据集之间选择最佳的合并方式,每个合并的数量大约为数十万条。而且,我们希望它能够在几分钟之内快速运行。(很快,什么是100,000 * 100,000?)而且,我们成功了。

因此,通过正确的调整,这种事情可能会变得敏捷而有效。我们最终能够在几分钟内在一台陈旧的双核计算机上生成合并集,并自动将“可疑”合并标记为手动审核。但是,找到ngram受欢迎程度/相关性最佳点,正确的字符串距离阈值,黑名单和白名单等花费了很多时间。

如此说来,您真的可以陷入研究这些东西的漏洞。对于任何实际生产层次的东西,你应该普遍使用已经行之有效的工具制作优化这类搜索的。

狮身人面像露西娜


我只是在Sphinx 2.2.11-release参考手册上搜索了Fuzzy ,它看起来与确切的单词匹配,而我需要部分匹配单词。如果我对此有误,请纠正我。
bjan

@bjan是的 进一步查看文档,我不确定Sphinx的模糊搜索是否正是您要的内容。它可以使用soundex形态。但是,根据您最近的编辑,您可能希望进行自己的ngram +字符串距离搜索。就像我在上面说的,调整算法和阈值可能需要一段时间才能正确。但是,这并非不可行。而且,如果您需要这种灵活性……
svidgen

@bjan哦,我也完全忘记了Lucene。我不确定它是否满足您的需求;但是,它非常受欢迎,值得一试。Lucene的文档提到使用Levenshtein字符串距离的模糊搜索和排名。
svidgen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.