【问题标题】:Similar names in a huge list大量列表中的相似名称
【发布时间】:2013-12-11 06:26:15
【问题描述】:

我有 50 000 多家公司的数据库,不断更新(每月 200 多家)。

重复内容是个大问题,因为名称并不总是严格/正确:
“超级1店”
“超级一店”
“超级一店”

编辑:另一个示例 .. 可能需要不同的方法:
“艾米的披萨”“艾米公司的有机披萨”

我们需要工具来扫描类似名称的数据。 我对Levenshtein DistanceLCS 有一些经验,但是它们很适合比较两个字符串是否相似...
在这里,我必须扫描 50 000 个可能是一个个的名字并在那里计算...总体相似度...

我需要建议如何解决这个问题,预期的结果是有一个包含 10-20 组非常相似的名称的列表,并且可能会进一步调整灵敏度以获得更多结果。

【问题讨论】:

  • 有趣!你试过similar_text()function吗?
  • 简单的答案是首先在 map/reduce 之后进行标准化,但我想您正在寻找更复杂的东西。
  • 我没用过,SOUNDEX怎么样?
  • levenshtein、soundex 和similar_text 差不多,只是算法不同
  • 我的方法是“手工”,你必须创建自己的规则来规范化名称,为什么常见的变体,这将是更准确的方法,但使用 soundex/levenshtein 将是简单的方法.

标签: php mysql data-analysis


【解决方案1】:

大约一年前我遇到过类似的问题,如果我没记错的话,我使用 similar_textsoundex 解决了(或多或少),正如其他人在 cmets 中所说的那样。像这样的:

<?php

$str1 = "Store 1 for you";
$str2 = "Store One 4 You";

similar_text(soundex($str1), soundex($str2), $percent);

if ($percent >= 66){
    echo "Equal";
    //Send an email for review
}else{
    echo "Different";
    //Proceed to insert in database
}
?>

在我的情况下,使用 66% 的百分比来确定公司是否相同(在这种情况下,不要插入数据库,而是发送电子邮件给我进行审查,并检查是否正确)。

在使用此解决方案几个月后,我决定为公司使用某种唯一代码(在我的情况下为 CIF,因为在西班牙这里的公司是唯一的)。

【讨论】:

  • 这看起来很酷,是 soundex 中忽略了标点符号 "" '' `?那么“Amy's Pizza”“Amy and Company 的有机披萨”怎么样......我认为这是另一种类型的问题
  • 是的,这适用于很多公司,但并非适用于所有公司,这就是为什么我给自己发送电子邮件以检查比较是否正确。有时我必须手动插入公司,这就是为什么几个月后我更改注册并强制插入公司的 CIF,以便我可以比较 bd 中的 CIF 并确保公司是否相同。
【解决方案2】:

这完全取决于我们应该容忍多少认为 2 个字符串是相似的。soundex 也很有用

select soundex('Super One Store') returns S165236
    select soundex('Super 1 Store'); returns S16236
    select soundex('Super One Stores') returns S1652362

S16236 在所有情况下都很常见,您可以使用如下过滤器

select * from (
select 'Super One Store' as c 
union
select 'Super 1 Store' as c
union
select 'Super One Stores' as c
union
select  'different one' as c
union 
select  'supers stores' as c
) tmp
where soundex(c) like CONCAT('%', soundex('Super store'), '%')
or soundex(c) like CONCAT('%', soundex('Super one store'), '%')

【讨论】:

    【解决方案3】:

    我认为您应该手动浏览该公司列表,并为每个公司创建一个包含唯一条目的表。然后有一个多对一的表,您可以在其中将不同的名称引用到正确的公司。我想这就是规范化的意思。

    表:companies

    |id|base_name
    |1 |Super 1 Store
    

    表:company_mapping

    |id|company_id|name
    |1 |1         |Super 1 Store
    |2 |1         |Super One Store
    |3 |1         |Super 1 Stores
    

    【讨论】:

    • 抱歉,我认为我们没有足够的关于 OP 业务的信息来规定应该手动完成计算机任务。除非企业使用预先打印的表格,否则允许客户手写数据将始终按照 OP 的情况结束。
    • @user2310289 我只是说,levenstein 和 soundex 可能会给出很多错误的结果(两个完全不同的公司,只有 2 个字母不同),仍然需要以一种或另一种方式进行手动清理。
    • 想想杂志订阅业务,其中杂志包含一张空白明信片供用户填写。除非数据输入程序具有智能,否则 levenstein 和 soundex 以及您的方法仍然会失败。如果您可以更改答案以反映这一点,我会支持您。
    • @user2310289 请随意编辑我的答案,因为我不太明白你的意思。
    • 您好 Silkfire,我的意思是我不同意您建议手动过程。人的愚蠢是没有界限的,是无法正常化的。尝试(手动)列出可能的名称损坏列表是无止境的。
    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2017-11-21
    相关资源
    最近更新 更多