ciao Karim, Il giorno 2 marzo 2018 07:05, Karim <lemieli...@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
_______________________________________________ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python