如何在MYSQL中使用PHP进行公司名称的模糊匹配以实现自动完成?

我的用户将通过剪切并粘贴包含公司名称的大string进行导入。

我有一个现有的,正在增长的公司名称的MYSQL数据库,每个数据库都有一个唯一的company_id。

我希望能够通过string进行parsing并将每个用户input的公司名称分配给模糊匹配。

现在,只是做一个直接的string匹配,也是缓慢的。 ** Soundex索引会更快吗? 如何在input时给用户一些select? **

例如,有人写道:

微软 - >微软
裸必需品 - >裸Escentuals
 Polycom,Inc.  - > Polycom

我发现了以下类似于这个问题的线程,但是海报还没有被批准,我不确定它们的用例是否适用:

如何在大型string数据库中find最佳模糊匹配

在Java中匹配不精确的公司名称

你可以从使用SOUNDEX() ,这可能是为了你需要的(我为一个已经存在的用户input内容提供了一个自动build议框)。

SOUNDEX()的缺点是:

  • 它无法区分更长的string。 只考虑前几个字符,最后分叉的较长string会生成相同的SOUNDEX值
  • 事实上,第一个字母必须是相同的,否则你不会轻易find一个匹配。 SQL Server有DIFFERENCE()函数来告诉你两个SOUNDEX值有多less分开,但是我认为MySQL没有这种内置的东西。
  • 对于MySQL,至less根据文档 ,SOUNDEX被打破为unicodeinput

例:

 SELECT SOUNDEX('Microsoft') SELECT SOUNDEX('Microsift') SELECT SOUNDEX('Microsift Corporation') SELECT SOUNDEX('Microsift Subsidary') /* all of these return 'M262' */ 

对于更高级的需求,我认为你需要看两个string的Levenshtein距离 (也称为“编辑距离”),并使用阈值。 这是更复杂(=更慢)的解决scheme,但它允许更大的灵活性。

主要缺点是,你需要两个string来计算它们之间的距离。 使用SOUNDEX,您可以在表格中存储预先计算的SOUNDEX,并对其进行比较/sorting/组合/过滤。 使用Levenshtein距离,您可能会发现“Microsoft”和“Nzcrosoft”之间的差异仅为2,但要花费更多的时间才能得出结果。

在任何情况下,MySQL的Levenshtein距离函数示例可以在codejanitor.com上find:Levenshtein距离作为MySQL存储函数(2007年2月10日) 。

SOUNDEX是一个很好的algorithm,但是这个话题已经有了最新的进展。 另一种algorithm被称为Metaphone,后来被修改为Double Metaphonealgorithm。 我亲自使用了双重metaphone的java apache commons实现,它是可定制和准确的。

他们在维基百科页面上也有很多其他语言的实现。 这个问题已经得到解答,但是如果你发现在你的应用程序中出现SOUNDEX的任何问题,很高兴知道有select。 有时它可以为两个真正不同的单词生成相同的代码。 Double metaphone是为了帮助解决这个问题而创build的。

从维基百科窃取: http : //en.wikipedia.org/wiki/Soundex

为了应对Soundexalgorithm的缺陷,Lawrence Philips为了同样的目的开发了Metaphonealgorithm。 飞利浦后来对Metaphone进行了改进,他称之为Double-Metaphone。 Double-Metaphone包含比前一个更大的编码规则集,处理非拉丁字符的一个子集,并返回一个主要和次要编码,以说明英语中单个单词的不同发音。

在双metaphone页面的底部,他们有各种编程语言的实现: http : //en.wikipedia.org/wiki/Double-Metaphone

Python和MySQL的实现: https : //github.com/AtomBoy/double-metaphone

首先,我想补充一点,在使用任何forms的语音/模糊匹配algorithm的时候应该非常小心,因为这种逻辑正好和模糊或者更简单一些; 可能不准确。 当用于匹配公司名称时尤其如此。

一个好方法是从地址信息,邮政编码,电话号码,地理坐标等其他数据寻求证实。这将有助于确认数据准确匹配的可能性。

关于B2B数据匹配的一系列问题太多了,这里我没有写更多关于公司名称匹配的内容 ,但总的来说,关键问题是:

  • 查看整个string是无益的,因为公司名称的最重要部分不一定在公司名称的开头。 即“宝洁公司”或“美国联邦储备”
  • 缩略语在HP,GM,GE,P&G,D&B等公司都有。
  • 一些公司故意将自己的名字拼错成品牌的一部分,并与其他公司区分开来。

匹配确切的数据很容易,但匹配非确切的数据可能会花费更多的时间,我build议您应该考虑如何validation非精确匹配以确保这些数据具有可接受的质量。

在我们build立Match2Lists.com之前,我们曾经花费了不健康的时间来validation模糊匹配。 在Match2Lists中,我们整合了一个强大的可视化工具,使我们能够查看非精确的匹配,这certificate是一个真正的比赛validation方面的改变,降低了我们的成本,使我们能够更快地交付结果。

运气最好!

这里是一个链接到PHP的 mysql和php 的soundex函数的讨论 。 我会从那里开始,然后扩展到其他不太明确的要求。

您的参考引用Levenshtein方法进行匹配。 两个问题。 1.测量两个已知单词之间的差异比较合适,而不是search。 2.它讨论了一个解决scheme,devise更多检测诸如校对错误(使用“Levenshtein”的Levenshtien),而不是拼写错误(用户不知道如何拼写,说“Levenshtein”和types在“Levinstein”我通常把它与在书中找一个短语联系起来,而不是在数据库中的关键价值。

编辑:在回应评论 –

  1. 你至less可以让用户把公司名称放在多个文本框中, 2.或者使用不明确的名字分隔符(比如反斜线); 3.省略文章(“The”)和一般缩写(或者你可以过滤这些); 4. Squoosh space out and match for that also(so Micro Soft => microsoft,Bare Essentials => bareessentials); 5.过滤掉标点符号; 6.用“OR”search单词(“裸”或“必需品”) – 有时候人们不可避免地会离开某个人。

像疯了一样testing,并使用用户的反馈循环。

最好的模糊匹配函数是levenshtein。 它传统上被拼写检查使用,所以这可能是要走的路。 这里有一个UDF可用: http : //joshdrew.com/

使用levenshtein的缺点是不能很好地扩展。 一个更好的主意可能是将整个表转储到拼写检查器自定义词典文件中,并从应用程序层而不是数据库层执行build议。

可能是为时已晚,但可能会帮助别人。 检查这个链接out.It使用levenshtein距离度量标准,但要快得多。 http://narenonit.blogspot.com/2012/07/fuzzy-matching-autocomplete-library.html