MySQL/PHP-部分比较作为重复匹配

MySQL/PHP-部分比较作为重复匹配,php,mysql,Php,Mysql,将部分数据与完整记录作为可能的重复匹配进行比较的最佳方法是什么 例如,假设您有一个客户数据库,该数据库存储联系人信息,如姓名、姓氏、地址、城市、邮政编码,并允许每个记录有多个电话号码 目标是找到所有可能的“匹配”,即某些数据非常接近匹配,或与输入的信息相同 例如: Real Data Contains First Name: Robert Last Name: Smithson Phone Numbers: 1111231234, 1111241235 Zip/Postal: 90210 我

将部分数据与完整记录作为可能的重复匹配进行比较的最佳方法是什么

例如,假设您有一个客户数据库,该数据库存储联系人信息,如姓名、姓氏、地址、城市、邮政编码,并允许每个记录有多个电话号码

目标是找到所有可能的“匹配”,即某些数据非常接近匹配,或与输入的信息相同

例如:

Real Data Contains
First Name: Robert
Last Name: Smithson
Phone Numbers:  1111231234, 1111241235
Zip/Postal: 90210
我希望这一记录能在结果中显示出来,不仅仅是在一场精确的比赛中,而是如下所示:

  • 罗布·史密斯
  • 90211
  • 90120
  • 鲍勃伊森 =鲍比·森
现在我了解了上面的名称变化,我需要一个单独的表,我可以使用它智能地区分名称变化/部分,但是目标是有某种模糊逻辑,可以合理地确定记录的重复性和/或返回给定部分数据的最有可能的结果

我考虑过以下方法:

  • 散列记录并将其用于相对比较:不会起作用,因为与存储的数据相关的变量太多
  • 存储在字符数组中用于比较的记录中的字符(即,有多少个
    A
    、多少个
    B
    )等):这会带来一个问题,因为所查找的字符之间的差异可能无法分析出足够的字符,无法按字符进行全谱分析
我正在寻找使用PHP编程实现这一点的其他可能性


数据库后端将在MySQL中,并且还没有结构。

Levenshtein distance应该可以解决您的问题


这看起来确实很有希望。它看起来也在做字符串比较,所以在“Rob”和“Robert”的情况下,如果“Robert”是“Rob”长度的两倍,那么结果会是什么呢?Robert和Rob之间的距离是3,因为您需要更改(添加)3个字符。这是一个不错的解决方案,但仍需要大量工作。例如,两个完全不同的名称,如
Tim
Tom
返回的距离为1,这将导致标记。将此标记为已接受,因为它比我以前尝试过的方法好一点,但是如果您能深入了解我可能会做的其他事情以提高准确性,我们将不胜感激。在Levenshtein中,您可以决定操作成本。例如,减法的代价可能是10点,而添加/删除是每个字符1点。
Smithson
Smithsan
应该被视为匹配吗?我理解,但是比较
Bob
vs
Bab
。。显然,这是一个输入错误,Leven将返回1,然而
Tim
Tom
将以编程方式返回相同的距离1。在鲍勃对巴布的案件中。。。我希望有这个,但是在Tim vs Tom中,这可能不是一个打字错误。