Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 导入数据库时比较数据的最佳方法是什么?_Php_Mysql_Algorithm_Levenshtein Distance - Fatal编程技术网

Php 导入数据库时比较数据的最佳方法是什么?

Php 导入数据库时比较数据的最佳方法是什么?,php,mysql,algorithm,levenshtein-distance,Php,Mysql,Algorithm,Levenshtein Distance,我有一个MySQL数据库表,其中包含大约1000家商店的信息。现在,我将通过上传Excel电子表格导入更多的商店,我正在努力避免重复 商店可能有相同的名称,但地址不同 商店可能有相同的地址,但永远不会有相同的名称 但这是我的问题 商店可能拼写错误 地址可能拼写错误 目前,我正在将数据导入一个临时表。现在我想知道什么是比较进口商店和现有商店的最佳方法 我的计划是浏览每一排,比较一下商店 首先比较a.name=b.name和a.street=b.street。匹配时,商店被删除 然后我将对

我有一个MySQL数据库表,其中包含大约1000家商店的信息。现在,我将通过上传Excel电子表格导入更多的商店,我正在努力避免重复

  • 商店可能有相同的名称,但地址不同
  • 商店可能有相同的地址,但永远不会有相同的名称
但这是我的问题

  • 商店可能拼写错误
  • 地址可能拼写错误
目前,我正在将数据导入一个临时表。现在我想知道什么是比较进口商店和现有商店的最佳方法

我的计划是浏览每一排,比较一下商店

  • 首先比较a.name=b.name和a.street=b.street。匹配时,商店被删除
  • 然后我将对名字和街道做一个Levenshtein比较。在这里,我可能需要手动查看结果,以确定它是否重复
有人对这种数据比较有经验吗

更新
谢谢你的回答

将用于比较的字段包括:

  • 名字
  • 街道地址
  • 邮政编码
  • 城市
  • 国家
我的想法是这样的:

选择name=lavenstein和country=country的行。
那样的话,我只需要处理一小份清单


然后我就可以开始更彻底地比较姓名和地址了。

Levenshtein距离就是这样做的,你可以避免手动输入。但实际实现将取决于对数据的某种先验知识。比如你认为拼写会有多大的错误

例如,假设这是一个高质量的数据,并且您只希望输入错误,您可以根据以下内容生成匹配条件:1)单词数是否相同?2) 这些单词的顺序3)名称中每个单词的Levenshtein距离允许错误的小阈值


当名称不明确或visa国际组织名称不明确时,可通过检查具有类似条件的地址来强化这些条件

为了进一步阐述我对肖纳克回答的评论,我在做这件事时采取的方法是:

按优先级顺序对每个名称进行一系列“哈希”。例如,对于英国的一些金融公司,我使用了以下方法:

  • “哈希”1:确切的公司名称,例如“圣约翰金融投资有限公司”
  • 散列2:公司名称,去掉所有非字母数字字符并规范化空格:“圣约翰詹姆斯金融投资有限公司”
  • 散列3:常见缩写扩展,例如“1st”到“First”,“Ltd”到“Limited”:“Saint John James Financial Investments Limited”。我在这里也犯了一些常见的拼写错误,例如“Independent”到“Independent”。您常见的拼写错误显然取决于您的源数据
  • 散列4:“停止”字,例如“The”,“Limited”,删除:“Saint John James Financial Investments”
我将所有的公司名称放入一个表中,然后构建一个查询,将表中的每个公司名称与所有其他公司名称进行比较,根据它们匹配哈希1、哈希2、哈希3、哈希4。这给了我一个信心系数——匹配的哈希数越高,两家公司实际上就越有可能是相同的。(注意,使用我采用的方法,如果哈希1匹配,则哈希2、3和4保证匹配,依此类推。)

(也检查空哈希,并忽略--“有限公司”可以简化为空哈希,但您不希望它与其他空哈希匹配。)

我用这个方法和Levenshtein一起将我可能的重复项按可能性顺序过滤——你如何将这个可能的方法与Levenshtein结合起来取决于你的数据;例如,您可能希望将Levenshein应用于第三个散列,而不是实际名称,并向我的业务人员提供一个可能重复的列表以做出最终决定,自动匹配最高置信度匹配,我确信这些名称确实代表同一家公司


看看我的代码,我还使用了一个散列,它是在去掉停止词等之后对每个词的转换,尽管我的评论指出这样会更好(我使用的是SQL Server,所以内置了Soundex…

Levenshtein是一个很好的方法,正如Shaunak所说。还考虑去掉“噪音”单词并把缩略语转换成同一个单词。我以前做过公司名称的比较,如果(例如,对于英国公司)在列文施泰因之前去掉“the”,“Limited”,“Ltd”,将所有“Co”转换为“company”,“UK”转换为“ukin”,“1ST”转换为“FIRST”,那么比较效果会更好。当你开始的时候,你会对你的数据有更多的感觉——只要把所有的商店名称放在一个有序的列表中,就会给你一些提示。谢谢你的回答。我不必担心“噪音”这个词,因为商店通常没有噪音——只有拥有商店的公司才有。如果一家商店被称为“二手货”,那么我不能将其改为“二手货”:)我以前从未使用过哈希,所以我不确定它是如何工作的。我确实找到了这个链接,我希望我可以使用它:我使用的是“散列”这个词非常松散——这只是我用来描述“精简”名称的一个词。你的名字需要多少修改甚至可能取决于你的来源;我所有的数据都是我公司的人打电话后输入的,所以如果发现一家名为“二手货”和“二手货”的商店是同一家商店,我也不会感到惊讶。或者“车身店”和“车身店”,比如。。。真的,在这种情况下,你的方法将由你的数据来控制,只有开始,你才能确定你的确切方向,我会说。是的,我将使用我最常用的方法。尝试失败:)@MattGibons,你知道这些类型的控制器的性能吗?比方说