[Python] Name matching

Giovanni Porcari giovanni.porcari a softwell.it
Ven 2 Mar 2018 09:50:51 CET



> Il giorno 02 mar 2018, alle ore 07:05, Karim <lemieliste a gmail.com> ha scritto:
> 
> Ciao lista, ho bisogno di un suggerimento su un problema che devo risolvere.
> 
> Contesto: ho un'applicazione Django che si collega ad un servizio di terze parti per ottere dei dati di un "business" che l'utente sta integrando. Il servizio ci da varie informazioni tra cui un dato `industry_type`.
> 
> Questo valore `industry_type` e' digitato dall'utente e significa: descrizione dell'attivita' del business
> 
> Ora questo valore `industry_type` lo devo confrontare con una tabella nel database che puo' essere paragonata alla classificazione delle attivita' ATECO[1]. La mia tabella ha un codice e una descrizione. Io faccio il match da `industry_type` alla descrizione sul database e il match piu' probabile "vince".
> 
> Per applicare questo procedimento ho usato l'algoritmo jaro-winkler dal package "jellyfish"[2], faccio il matching di
> tutta la tabella nel database e il miglior match e' cio' che piu' si avvicina. Ovviamente non funziona un gran che' perche' il si avvicina significa quanti editing sono necessari per arriva
> 
> 
> Ecco un esempio:
> 
> *INDUSTRY TYPE*, *DESCRIZIONE TROVATA*
> Solar Panels, Solar Panel Installation
> Software Consultancy, Software Publishing
> Auto Trim, Arts Education
> Consulting, Counselling Service - Debt
> Advanced Mobile Technology Development, Masonic Lodge Operation
> Bridal Boutique, Primary Education
> Cafe/Restaurant, Restaurant
> 
> Ho circa 5000 industry_type disponibili realmente digitati dall'utente e purtroppo senza il corrispettivo matching, ma controllando i match generati dall'algoritmo, il risultato e' bassino, i match sono circa il 15%.
> 
> Ora, c'e' modo di migliorare la situazione?
> 
> Io stavo pensando di fare due cose:
> 
> 1) Migliorare il matching cambiando algoritmo o applicandolo scorporando le parole di industry_type
> 
> 2) Applicare del "machine learning" anche se mi tocca impararmelo. Pensavo di salvare gli abbinamenti fatti dall'utente per correggere il falso match in modo di avere un numero sempre maggiore di associazioni di `industry_type` al codice attivita'.
> 
> Quindi se ad esempio l'industry_type e' "Sport activities" purtroppo non mi esce "Sporting Club Room" che e' presente come attivita', ma mi esce tutt'altro. 
> Se pero' io abbinassi al codice di "Sporting Club Room" l'abbinamento "sport activities" corretto dall'utente, avrei qualcosa di piu' su cui fare il matching la volta successiva.
> 
> La cosa buffa e' che usando il matching, piu' parole scrivi piu' tendi ad allontanarti dal match giusto se le parole sono diverse.
> 
> Tornando all'esempio di prima:
> 
> l'utente ha digitato "Sport" e allora il match mi da correttamente "Sporting Club Room", ma se l'utente digita "sport activities", l'algoritmo mi trova: "Podiatrist / Chiropodist" a causa della distanza dell'algoritmo.
> 
> Qualcuno di voi ha affrontato questo tipo di situazioni?


Se sono 'solo' 5000, considerando che un essere umano con un buon tool di aiuto potrebbe abbinarne 
una decina al minuto, il tempo necessario totale potrebbe essere minore di 9 ore.
Considerando per l'Italia un costo di 20€/ora sono 180€. 

Tra fare un buon algoritmo, testarlo e controllare se funziona bene, penso che ci vogliano
più ore e di una risorsa ben più costosa :)

E hai anche il vantaggio di dar lavoro ad un essere umano :D


G


Maggiori informazioni sulla lista Python