Re: [Python] Name matching
2018-03-02 21:56 GMT+11:00 Marco De Paoli: > [...] > Grazie per le risposte. Di sicuro ne ricavero' qualcosa :-) -- Karim N. Gorjux ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Name matching
ciao Karim, Il giorno 2 marzo 2018 07:05, Karimha 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? > non so so può essere utile nel tuo caso... comunque potresti dare un'occhiata agli algoritmi di fuzzy-match basati su q-grams Se sei su postgres fa tutto lui usando pg_trgm https://www.postgresql.org/docs/current/static/pgtrgm.html C'è poi Levenshtein (che dovrebbe essere una generalizzazione del Jaro–Winkler che hai usato tu) https://en.wikipedia.org/wiki/Levenshtein_distance Di cui trovo anche alcune implementazioni python (che però non ho mai usato): https://pypi.python.org/pypi/editdistance https://pypi.python.org/pypi/python-Levenshtein bye, Marco ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Name matching
Ciao Karim, tempo fa (sono passati 2 anni o forse 3... anche 4) mi sono trovato in una situazione similare, non ricordo granché onestamente (librerie, script etc...), ma ricordo la logica usata. Per prima cosa ho convertito le ricerche in liste ['sport', 'activities', 'etc'] per poi applicare un algoritmo di "soundex" sulle ricerche. Le ricerche le effettuavo su più combinazioni, singole parole e parole multiple (sport, activities, sport activities, etc). Successivamente ho inserito i risultati in una tabella del DB, dove assegnavo per ogni ricerca un valore di affinità, così da poter ordinare i risultati. Non ho idea se sia la strada giusta... ma così all'epoca ho ottenuto buoni risultati. Leo ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Name matching
> Il giorno 02 mar 2018, alle ore 07:05, Karimha > 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 ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python