2013-11-26 3 views
6

У меня есть база данных из 50 000 + компаний, которые постоянно обновляются (200+ в месяц).Похожие имена в огромном списке

огромная проблема с повторным содержанием, потому что имена не всегда строги/правильно:
«Супер 1 Магазин»
«Супер Один магазин»
«Супер 1 Магазины»

Редактировать: еще один пример .. который, вероятно, нуждается в другом подходе:
«Ая Пицца» < ---> «Органическая пиццу Ого и компании»

Нам нужен инструмент для сканирования данных для похожих имен. У меня есть опыт работы с Levenshtein Distance и LCS, но они отлично подходят для сравнения, если 2 строки похожи ...
Здесь я должен сканировать 50 000 имен, которые могут быть каждый с каждым, и вычислить там ... общий рейтинг подобия. ..

Мне нужен совет, как атаковать эту проблему, ожидаемые результаты состоят в том, чтобы иметь список с 10-20 группами очень похожих имен и, возможно, дополнительно настроить чувствительность для получения большего количества результатов.

+1

интересно! вы попробовали 'similar_text()' [function] (http://php.net/manual/en/function.similar-text.php)? – Lan

+0

Легкий ответ сначала нормализуется после карты/сокращения, но я полагаю, что вы ищете что-то более сложное. – mcuadros

+1

Я никогда не использовал его, но как насчет SOUNDEX? –

ответ

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 в моем случае, потому что он уникален компанией здесь, в Испании).

+0

Это выглядит круто, это знаки препинания «" «игнорируются в soundex? Как насчет «Пиццы Эми» <-> «Органическая пицца от Amy and Company» ... Я думаю, что это еще одна проблема –

+0

Да, это работает для многих компаний, но не для всех, поэтому я отправляю электронное письмо самому себе чтобы проверить правильность сравнения. Иногда мне приходится вручную вставлять компании, поэтому через несколько месяцев я меняю регистрацию и принудительно вставляю CIF в компанию, поэтому я могу сравнить CIF в bd и обеспечить, чтобы компания была такой же или нет. – Sal00m

-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 
+0

Извините, я не думаю, что у нас достаточно информации о бизнесе OP, чтобы диктовать, что компьютерная задача должна быть выполнена вручную. Если бизнес не использует предварительно напечатанные формы, позволяя клиенту передавать данные о записи, они всегда окажутся в соответствии с ситуацией ОП. –

+0

@ user2310289 Я просто говорю, что levenstein и soundex, вероятно, дадут много ошибочных результатов (две совершенно разные компании, которые отличаются только двумя буквами), которые по-прежнему потребуют ручной очистки так или иначе. – silkfire

+0

Думая о чем-то вроде подписки на журнал, где журнал содержит пустую открытку для заполнения пользователем. Если программа ввода данных не имеет умений, то levenstein и soundex и ваш подход все равно потерпят неудачу. Если вы можете изменить свой ответ, чтобы отразить это, я буду вам доверять. –

1

чисто это зависит от того, сколько мы должны терпеть, чтобы рассмотреть 2 строки как похожи .. Саундэкс может быть полезен также

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

S16236 IS COMMON IN ALL case, вы можете использовать фильтр как ниже

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'), '%') 
Смежные вопросы