为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

互换的青春 2019-09-21 15:23:11

我的用户将通过剪切导入并粘贴包含公司名称的大字符串。


我有一个公司名称的现有且不断发展的MYSQL数据库,每个数据库都有一个唯一的company_id。


我希望能够解析字符串并为每个用户输入的公司名称分配模糊匹配。


现在,仅进行直线字符串匹配也很慢。** Soundex索引编制会更快吗?我如何在用户输入时给他们一些选择?**


例如,某人写道:


微软->微软

裸机必备->裸机必备

Polycom,Inc.-> Polycom


查看完整描述

3 回答

?
忽然笑

您可以从开始使用SOUNDEX(),这可能会满足您的需要(我为用户键入的内容提供了一个自动建议框,其中包含已有的替代方案)。


的缺点SOUNDEX()是:


它无法区分较长的字符串。仅考虑前几个字符,结尾处较长的较长字符串会产生相同的SOUNDEX值

第一个字母必须相同,否则您将很难找到匹配的事实。SQL Server具有DIFFERENCE()函数来告诉您两个SOUNDEX值相隔多少,但是我认为MySQL并没有内置任何此类值。

对于MySQL,至少根据docs,SOUNDEX对于unicode输入已损坏

例:


SELECT SOUNDEX('Microsoft')

SELECT SOUNDEX('Microsift')

SELECT SOUNDEX('Microsift Corporation')

SELECT SOUNDEX('Microsift Subsidary')


/* all of these return 'M262' */

对于更高级的需求,我认为您需要查看两个字符串的Levenshtein距离(也称为“编辑距离”)并使用阈值。这是较复杂(较慢)的解决方案,但它具有更大的灵活性。


主要缺点是,您需要两个字符串来计算它们之间的距离。使用SOUNDEX,您可以将预先计算的SOUNDEX存储在表中,然后在该表上进行比较/排序/分组/过滤。使用Levenshtein距离,您可能会发现“ Microsoft”和“ Nzcrosoft”之间的差异仅为2,但是要花费更多的时间才能得出该结果。


无论如何,可以在codejanitor.com上找到MySQL的Levenshtein距离函数示例:Levenshtein作为MySQL存储函数的距离(2007年2月10日)。


查看完整回答
反对 回复 2019-09-21
?
烧仙草VB

SOUNDEX是一个不错的算法,但是在该主题上已有最新进展。创建了另一个算法,称为Metaphone,后来将其修订为Double Metaphone算法。我已经亲自使用了双元音的java apache commons实现,它是可定制的和准确的。


他们在Wikipedia页面上也有许多其他语言的实现。已经回答了这个问题,但是如果您发现应用程序中出现了SOUNDEX的任何已确定的问题,很高兴知道有选项。有时,它可以为两个完全不同的单词生成相同的代码。创建了双重对讲机来帮助解决该问题。


维基百科被盗:http://en.wikipedia.org/wiki/Soundex


为了应对Soundex算法的不足,劳伦斯·飞利浦(Lawrence Philips)为此目的开发了Metaphone算法。飞利浦后来开发了对Metaphone的改进,他将其称为Double-Metaphone。Double-Metaphone包含比其前任更大的编码规则集,可处理非拉丁字符的子集,并返回主要和次要编码,以说明单个单词在英语中的不同发音。


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


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


查看完整回答
反对 回复 2019-09-21
?
qq_笑_17

首先,我想补充一点,在使用任何形式的音标/模糊匹配算法时,您应该非常小心,因为这种逻辑就是模糊逻辑,或者说得更简单些。可能不准确。当用于匹配公司名称时尤其如此。


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


与B2B数据匹配有关的问题很多,在这里无法解决,我在博客中写了更多有关公司名称匹配的信息,但总的来说,关键问题是:


查看整个字符串无济于事,因为公司名称的最重要部分不一定位于公司名称的开头。即“宝洁公司”或“美联储”

缩写在公司名称中很常见,例如HP,GM,GE,P&G,D&B等。

一些公司故意在品牌中拼写错误的名字,以与其他公司区分开。

匹配精确的数据很容易,但是匹配不精确的数据会花费更多时间,我建议您考虑如何验证不精确的匹配,以确保它们的质量可以接受。


在建立Match2Lists.com之前,我们过去花费了大量的时间来验证模糊匹配。在Match2Lists中,我们集成了强大的可视化工具,使我们能够查看非精确的比赛,就比赛验证而言,这被证明是真正的游戏规则改变者,从而降低了成本,并使我们能够更快地交付结果。


祝你好运!


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信