我有5万多家公司的数据库,不断更新(每月200多个)。
重复内容是一个很大的问题,因为名称并不总是严格/正确:
“超级1商店”
“超级一商店”
“超级1商店”
编辑:另一个例子..可能需要不同的方法:
“Amy's Pizza”< ---> “Amy and Company的有机披萨”
我们需要工具来扫描数据以寻找相似的名称。 我对Levenshtein Distance和LCS有一些经验,但如果2个字符串相似,它们可以很好地进行比较... 在这里,我必须扫描50 000个名称,每个可能是每个,并在那里计算......总体相似度等级......
我需要建议如何解决这个问题,预期的结果是有一个列表,其中包含10-20组非常相似的名称,并且可能会进一步调整灵敏度以获得更多结果。
答案 0 :(得分:3)
我一年前左右有类似的问题,如果我记得很清楚,我会在评论中使用similar_text
和soundex
来解决(或多或少)其他人的问题。像这样:
<?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