Re: [Python] Name matching

2018-03-02 Per discussione Karim
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

2018-03-02 Per discussione Marco De Paoli
ciao Karim,

Il giorno 2 marzo 2018 07:05, Karim  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?
>

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

2018-03-02 Per discussione Leo Lo Tito
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

2018-03-02 Per discussione Giovanni Porcari


> Il giorno 02 mar 2018, alle ore 07:05, Karim  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
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python