<div dir="ltr">ciao Karim,<br><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 2 marzo 2018 07:05, Karim <span dir="ltr"><<a href="mailto:lemieliste@gmail.com" target="_blank">lemieliste@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div><font face="verdana, sans-serif">Ciao lista, ho bisogno di un suggerimento su un problema che devo risolvere.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Contesto: ho un'applicazione Django che si collega ad un servizio di terze parti per ottere dei dati di un "business" </font><span style="font-family:verdana,sans-serif">che l'utente sta integrando. Il servizio ci da varie informazioni tra cui un dato `industry_type`.</span></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Questo valore `industry_type` e' digitato dall'utente e significa: descrizione dell'attivita' del business</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">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".</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Per applicare questo procedimento ho usato l'algoritmo jaro-winkler dal package "jellyfish"[2], faccio il matching di</font></div><div><font face="verdana, sans-serif">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</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Ecco un esempio:</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">*INDUSTRY TYPE*, *DESCRIZIONE TROVATA*</font></div><div><font face="verdana, sans-serif">Solar Panels, Solar Panel Installation</font></div><div><font face="verdana, sans-serif">Software Consultancy, Software Publishing</font></div><div><font face="verdana, sans-serif">Auto Trim, Arts Education</font></div><div><font face="verdana, sans-serif">Consulting, Counselling Service - Debt</font></div><div><font face="verdana, sans-serif">Advanced Mobile Technology Development, Masonic Lodge Operation</font></div><div><font face="verdana, sans-serif">Bridal Boutique, Primary Education</font></div><div><font face="verdana, sans-serif">Cafe/Restaurant, Restaurant</font></div><div><br></div><div><font face="verdana, sans-serif">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%.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Ora, c'e' modo di migliorare la situazione?</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Io stavo pensando di fare due cose:</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">1) Migliorare il matching cambiando algoritmo o applicandolo scorporando le parole di industry_type</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">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'.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">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. </font></div><div><font face="verdana, sans-serif">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.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">La cosa buffa e' che usando il matching, piu' parole scrivi piu' tendi ad allontanarti dal match giusto se le parole sono diverse.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Tornando all'esempio di prima:</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">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.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">Qualcuno di voi ha affrontato questo tipo di situazioni?</font></div></div></div></blockquote><div><br></div><div>non so so può essere utile nel tuo caso...</div><div><br></div><div>comunque potresti dare un'occhiata agli algoritmi di fuzzy-match basati su q-grams</div><div><br></div><div>Se sei su postgres fa tutto lui usando pg_trgm</div><div><a href="https://www.postgresql.org/docs/current/static/pgtrgm.html">https://www.postgresql.org/docs/current/static/pgtrgm.html</a><br></div><div><br></div><div>C'è poi <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Levenshtein (che dovrebbe essere una generalizzazione del Jaro–Winkler che hai usato tu)</span></div><div><a href="https://en.wikipedia.org/wiki/Levenshtein_distance">https://en.wikipedia.org/wiki/Levenshtein_distance</a><br></div><div><br></div><div>Di cui trovo anche alcune implementazioni python (che però non ho mai usato):</div><div><a href="https://pypi.python.org/pypi/editdistance">https://pypi.python.org/pypi/editdistance</a><br></div><div><a href="https://pypi.python.org/pypi/python-Levenshtein">https://pypi.python.org/pypi/python-Levenshtein</a><br></div><div><br></div><div>bye,</div><div>Marco</div><div><br></div></div></div></div>