[Python] Name matching

Marco De Paoli depaolim a gmail.com
Ven 2 Mar 2018 11:56:26 CET


ciao Karim,

Il giorno 2 marzo 2018 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?
>

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
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20180302/7eef3e0a/attachment-0001.html>


Maggiori informazioni sulla lista Python