巨大的名单中的相似名称

时间:2013-11-26 08:05:06

标签: php mysql data-analysis

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

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

编辑:另一个例子..可能需要不同的方法:
“Amy's Pizza”< ---> “Amy and Company的有机披萨”

我们需要工具来扫描数据以寻找相似的名称。 我对Levenshtein DistanceLCS有一些经验,但如果2个字符串相似,它们可以很好地进行比较... 在这里,我必须扫描50 000个名称,每个可能是每个,并在那里计算......总体相似度等级......

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

3 个答案:

答案 0 :(得分:3)

我一年前左右有类似的问题,如果我记得很清楚,我会在评论中使用similar_textsoundex来解决(或多或少)其他人的问题。像这样:

<?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,因为西班牙的公司是独一无二的。)

答案 1 :(得分:1)

纯粹取决于我们应该容忍将2个字符串视为相似的多少... soundex也可以使用

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

S16236 IS COMMON在所有情况下,您都可以使用下面的过滤器

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'), '%')

答案 2 :(得分:-1)

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

表: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