2013-11-26 14 views
6

Ho un database di 50 000 + aziende che viene costantemente aggiornato (200+ al mese).Nomi simili in una lista enorme

Il è un problema enorme con il contenuto ripetuto perché i nomi non sono sempre rigorosi/corretta:
"Super 1 Store"
"Super One Store"
"Super 1 Negozi"

Modifica: un altro esempio .. che probabilmente ha bisogno di approccio diverso:
"di Amy Pizza" < ---> "Pizza bio da Amy e Società"

Abbiamo bisogno di uno strumento per scansionare i dati per nomi simili. Ho un po 'di esperienza con Levenshtein Distance e LCS ma funzionano bene per confrontare se 2 stringhe sono simili ...
Qui devo scansionare 50.000 nomi possono essere ciascuno con ognuno e calcolare lì ... valutazione di somiglianza generale. ..

Ho bisogno di consigli su come attaccare questo problema i risultati attesi è di avere una lista con 10-20 gruppi di nomi molto simili, e potrebbe essere ulteriormente aggiustare la sensibilità per ottenere maggiori risultati.

+1

interessante! hai provato la 'similar_text()' [funzione] (http://php.net/manual/en/function.similar-text.php)? – Lan

+0

La risposta facile viene prima normalizzata dopo la mappa/riduci, ma suppongo che tu stia cercando qualcosa di più complesso. – mcuadros

+1

Non l'ho mai usato ma, che ne dici di SOUNDEX? –

risposta

3

ho avuto problema simile un anno fa o giù di lì, e se mi ricordo bene, ho risolto (più o meno) utilizzando similar_text e soundex come altre persone hanno detto nei commenti. Qualcosa di simile a questo:

<?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 
} 
?> 

Nel mio caso utilizzare una percentuale del 66% per determinare le imprese sono gli stessi (in questo caso non inserire nel database, ma inviare una mail a me per rivedere, e verificare se è corretto).

Dopo alcuni mesi con queste soluzioni, decido di utilizzare una sorta di codice univoco per le società (CIF nel mio caso perché è unico per azienda qui in Spagna).

+0

Questo sembra interessante se la "" "'' 'punteggiatura è stata ignorata in soundex? Che dire di "Amy's Pizza" <-> "Pizza biologica di Amy and Company" ... Penso che questo sia un altro tipo di problema –

+0

Sì, questo funziona per molte aziende ma non per tutte, questo è il motivo per cui mando una mail a me stesso per verificare se il confronto è corretto. A volte devo inserire manualmente le aziende questo è il motivo per cui dopo alcuni mesi cambio la registrazione e costringo a inserire il CIF della società in modo da poter confrontare il CIF in bd e garantire che la società sia la stessa o no. – Sal00m

-1

Penso che dovresti passare manualmente da quell'elenco di aziende e creare una tabella con una voce univoca per ciascuna azienda. Quindi disporre di una tabella molti-a-uno in cui si fa riferimento ai diversi nomi alla società corretta. Penso che questo sia il significato della normalizzazione .

Tabella: companies:

|id|base_name 
|1 |Super 1 Store 

Tabella: company_mapping:

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

Siamo spiacenti, non penso che abbiamo abbastanza informazioni sull'attività del PO per poter stabilire che un'attività del computer debba essere eseguita manualmente. A meno che l'azienda non utilizzi moduli prestampati, il fatto che il cliente possa consegnare i dati di scrittura finirà sempre come nella situazione dell'OP. –

+0

@ user2310289 Sto solo dicendo che levenstein e soundex daranno probabilmente molti risultati errati (due aziende completamente diverse che differiscono solo per 2 lettere) che richiederebbero comunque una pulizia manuale in un modo o nell'altro. – silkfire

+0

Pensando a qualcosa di simile a un business di abbonamenti a una rivista in cui la rivista contiene una cartolina vuota da compilare dall'utente. A meno che il programma di inserimento dati non abbia l'intelligenza, allora levenstein e soundex e il tuo approccio continueranno a fallire. Se puoi cambiare la tua risposta per rispecchiare questo, ti inviterò. –

1

puramente esso dipenderà da quanto dovremmo tollerare considerare 2 stringhe come simile .. soundex può essere utile pure

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

S16236 È COMUNE IN TUTTI casi, è possibile utilizzare filtro come sotto

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