SlideShare a Scribd company logo
1 of 36
Syntacticalerrors
detection
Utilizzo di tecniche di
clustering per individuare
errori sintattici negli
OpenData
and
correction
NOME O LOGO 2
Indice
Riepilogo
- Scopo del lavoro
- Clustering, Fuzzy, ecc…
- Cosa è stato fatto
Passi in avanti
- Test dataset Europei
- Correzione errori dataset
- Versione in NodeJS
- Progettazione in Fly
NOME O LOGO
Riepilogo
Spiegazione rapida di quanto discusso nello
scorso seminario
3
NOME O LOGO
Alla ricerca di errori sintattici in collezioni di
stringhe
4
Scopo del lavoro
I dati sono preziosissimi, di conseguenza la
propensione a renderli Open è di vitale importanza.
La loro qualità, però, non è sempre garantita a
causa di errori di battitura, o di errori nella
generazione automatica dei campi.
Come è possibile individuare tali errori usando
tecniche di clustering?
Al fine di giungere ad una soluzione bisogna
risolvere alcune problematiche:
 Se si può lavorare direttamente con stringhe;
 Come valutare la similarità tra stringhe;
 Se è necessario specificare il numero di cluster;
NOME O LOGO
Selezione e raggruppamento di
elementi omogenei in un insieme di
dati.
In generale, «lontananza» tra due
punti di un insieme, in base ad una
specifica metrica
• Lavora sul concetto di «Similarità»,
e lavora propriamente su stringhe
• Permette di operare anche sulla
similarità di sottostringhe
• Sfrutta la distanza di Levenshtein
Alla ricerca degli strumenti necessari
Clustering
5
Distanza Approximate String Matching
Parte di studio effettuata prima di iniziare il lavoro.
NOME O LOGO
WomboCombo: l’unione fa la forza
Usare insieme FuzzyMatching, Distanza di
Levenshtein e un Dizionario:
 Levenshtein per verificare se sono
esattamente uguali due stringhe;
 Dizionario per verificare se si tratta di falsi
positivi
 Eventualmente computare il FuzzyMatching
6
Distanza di
Levenshtein
FuzzyMatching
FuzzyMatching +
Levenshtein
FuzzyMatching +
Levenshtein +
Dizionario
NOME O LOGO
Algoritmo di verifica
7
def check_clusters(clusters, dictionary):
if not split(clusters, dictionary):
return False, "Aumentare il n° di cluster"
if not collapse(clusters, dictionary):
return False, "Diminuire il n° di cluster"
return True, "Numero esatto di cluster"
1. Split: verifico la presenza di
due elementi presenti nel
dizionario in uno stesso
cluster
2. Collapse: verifico se due
parole simili, usando il
metodo WomboCombo,
sono in cluster diversi
Esempio di test su un dataset di 1492
stringhe, riguardanti le regioni italiane.
Erano presenti tutte le regioni, quindi il
numero atteso di cluster era 20.
Clusterizzando nel range individuato,
l’algoritmo riconosce la correttezza di
formato con 20 cluster
NOME O LOGO
Passi in avanti col
progetto
Come sono stati affrontati gli obiettivi
esaminati e discussi nello scorso seminario
8
NOME O LOGO
Test effettuati per verificare l’adattabilità della
libreria su collezioni di stringhe di un’altra lingua
9
Test su dataset
europei
NOME O LOGO
Test su dataset europei… senza problemi
10
• Dataset dei principali incidenti stradali tra il 2006 e il 2012;
• Test con e senza errori;
• Test basato sulle province;
https://ckan.dataplatform.nl/dataset
NOME O LOGO
Test effettuati per verificare l’adattabilità della
libreria su collezioni di stringhe di un’altra lingua
11
Test su dataset
europei
NOME O LOGO
Test su dataset europei… senza problemi
12
• Dataset sui produttori autorizzati di latte;
• Test con e senza errori;
• Test con presenza di campi vuoti
• Test basato sulle città e contee (merge di dizionari);
https://data.gov.uk/
NOME O LOGO
Test effettuati per verificare l’adattabilità della
libreria su collezioni di stringhe di un’altra lingua
13
Test su dataset
europei
NOME O LOGO
Test su dataset europei… senza problemi
14
• Dataset sui contratti nei vari comuni;
• Test con e senza errori di codifica;
• Test basato sulle province;
https://datos.gob.es/en
NOME O LOGO
Test effettuati per verificare l’adattabilità della
libreria su collezioni di stringhe di un’altra lingua
15
Test su dataset
europei
NOME O LOGO
Test su dataset europei… senza problemi
16
• Dataset dei distretti dell’Irlanda;
• Test con dataset fortemente manipolato;
• Test basato sulle contee;
https://data.smartdublin.ie | https://data.gov.ie/dataset
NOME O LOGO
Test effettuati per verificare l’adattabilità della
libreria su collezioni di stringhe di un’altra lingua
17
Test su dataset
europei
NOME O LOGO
Test su dataset europei… con piccoli problemi
18
• Difficoltà nel trovare Dataset dei
Comuni corretto/completo;
• 3 modi in cui scrivere il nome della
stessa città, a seconda dell’utilizzo o
meno di accenti e trattini nel dataset
analizzato
Comuni
• Necessità di due dizionari a seconda
dell’anno di pubblicazione del dataset
• Test su dataset dei monumenti
Regioni
https://www.data.gouv.fr/fr/
NOME O LOGO 19
Correzione degli
errori
Due possibili situazioni
I cluster da correggere
sono stati costruiti in
maniera corretta
utilizzando la libreria
sviluppata
Si deve cercare di
correggere cluster/array
in maniera indipendente
da come sono stati
costruiti
NOME O LOGO 20
Per applicare il primo metodo bisogna seguire tutto l’iter per poter ottenere il numero giusto di cluster, in modo
che in ogni cluster ci siano parole che rappresentano una stessa città
Correzione dei cluster: primo metodo
Caricare il dataset
Computare le distanze
Determinare
range del
n° dei cluster
Algoritmo di verifica
NOME O LOGO
Correzione dei cluster: primo metodo
21
Per ogni cluster si deve definire un esemplare. In prima battuta si cerca direttamente nel dizionario la
corrispondenza con uno degli elementi del cluster
def propose_correction(clusters, dictionary):
sample = ""
sample_flag = False
for i, group in enumerate(clusters):
g = np.unique(group)
#Ricerca di un presente nel dizionario
for w in g:
if dictionary.get(w.lower()) is not None:
if not sample_flag:
sample_flag = True
sample = w
break
NOME O LOGO
Correzione dei cluster: primo metodo
22
In alternativa, si cerca un elemento del cluster che ha corrispondenza nel dizionario usando la funzione
wombocombo. Solo infine si applica a tutto il cluster l’esemplare individuato
#Alternativa: Nessun elemento del cluster fa parte del dizionario
if not sample_flag:
for w, d in product(g, dictionary):
if string_similarity.single_wombocombo(w, d, dictionary) == 0:
sample = dictionary.get(d)
sample_flag = True
break
#applica la correzione a tutto il gruppo, se è stato individuato un esemplare nel
dizionario
if sample_flag:
for j, el in enumerate(group):
clusters[i][j] = str(sample)
sample_flag = False
sample = ""
return clusters
NOME O LOGO
Correzione dei cluster: secondo metodo
23
Soluzione generale, nel caso non si può o non si vuole passare per l’iter precedentemente descritto.
Basta fornire al metodo o un semplice array o dei cluster creati in un qualunque modo.
def propose_correction_general(clusters, dictionary):
samples = []
for i, group in enumerate(clusters):
g = np.unique(group)
for w, d in product(g, dictionary):
if string_similarity.single_wombocombo(w, d, dictionary) == 0:
samples.append(dictionary.get(d))
samples = np.unique(samples)
for j, el in enumerate(group):
for s in samples:
if string_similarity.single_wombocombo(s, el, dictionary) == 0:
clusters[i][j] = str(s)
samples = []
return clusters
NOME O LOGO
Perché utilizzare il primo metodo?
24
In fase di correzione le parole in uno stesso cluster rappresentano la stessa città, quindi individuata per una, le
altre si correggono transitivamente.
words = ["Salr", "Sale"]
dictionary = {"salerno": "Salerno"}
words = ["Salerno", "Salerno"]
words = ["Salr", "Salerno"]
NOME O LOGO 25
Implementazione in
Javascript/NodeJS
NOME O LOGO
Perché farlo?
L’implementazione in
Javascript/NodeJs garantisce una
diretta integrazione in sistemi di
gestione di open data (es. SPOD)
26
Permetterne l’utilizzo
su applicazioni web
NOME O LOGO
Sono state mantenute tutte le caratteristiche?
27
La difficoltà principale è stata la reperibilità delle librerie utilizzate in Python
Scikit-Learn per
AgglomerativeClustering
FuzzyWuzzy per
Approximate-String-Matching
pyxdameraulevenshtein
per Damerau-Levensthein
NOME O LOGO
Sono state mantenute tutte le caratteristiche?
28
Dopo molti test e ricerche sono state individuate quelle che forniscono risultati praticamente identici
hierarchical-clustering per
AgglomerativeClustering
FuzzyBall per
Approximate-String-Matching
damerau-levenshtein-js
per Damerau-Levensthein
NOME O LOGO
WomboCombo
29
Cosa è cambiato nell’algoritmo realizzato per computare le distanze
if(dict[w1]!=undefined && dict[w2]!=undefined && w1 != w2)
return HIGH_LEV_DIFFERENCE;
lev = levjs.distance(w1, w2);
if( lev <= LEV_TOLLERANCE)
return 0;
fuz1 = fw.ratio(w1, w2)
fuz2 = fw.partial_ratio(w1, w2)
fuz3 = fw.token_set_ratio(w1, w2)
fuzAverage = Math.round((fuz1 + fuz2*PESO_PARTIAL_RATIO + fuz3)/3)
fuzsum = Math.round((fuz2 + fuz3) / 2)
if ((fuzAverage >= HIGH_AVERAGE_FUZZY)
|| (fuzsum >= HIGH_SUBSTRING_FUZZY))
return 0;
if ((fuzAverage < LOW_AVERAGE_FUZZY) || (fuzsum < LOW_SUBSTRING_FUZZY))
return lev = lev + HIGH_LEV_DIFFERENCE
return lev + LOW_LEV_DIFFERENCE
NOME O LOGO
Gestione del clustering
30
var levels = hierarchical({
input: words,
distance: single_wombo_combo,
linkage: linkage,
minClusters: numCluster,
});
var clusters = levels[levels.length - 1].clusters;
clusters = clusters.map(function (cluster) {
return cluster.map(function (index) {
return words[index];
});
});
• Piccole variazioni del codice
• Stessa logica, con semplificazione
della computazione delle distanze
NOME O LOGO
Progettazione in FLY
31
NOME O LOGO
Librerie e codice Python
32
from fuzzywuzzy import fuzz as fw
import pyxdameraulevenshtein as lev
import numpy as np
from sklearn.cluster import
AgglomerativeClustering as AC
Nessuna difficoltà nell’importare qualunque libreria Python
Nessuna peculiarità di Python nella mia libreria
Syntactical errors
detection and correction
NOME O LOGO
Computazione della matrice
33
• L’operazione con la maggiore complessità della libreria
O(𝑛3);
• C’è un limite di tempo per l’esecuzione delle funzioni
(15 minuti);
• Nell’esecuzione in locale è un tempo ancora non
registrato;
NOME O LOGO
Computazione della matrice
34
Tale operazione lavora molto sugli indici dell’array delle parole e della matrice delle distanze
array delle parole
matrice delle distanze
La distanza tra la parola
i-esima e la j-esima va
inserita nella cella [i,j]
della matrice delle
distanze
Le funzioni devono prendere in input
gli indici della matrice e le parole per
cui computare la similarità, devono
restituire indici e il valore di similarità
NOME O LOGO
Cosa bisogna aggiungere/migliorare a quanto già
fatto
35
Come proseguire
• Completare l’implementazione in
JavaScript/NodeJS delle altre funzionalità
• Riuscire a trovare una soluzione che sleghi
la necessità di un buon dizionario, ma
crearne uno ad hoc basandosi sulla
frequenza delle parole in un dataset
NOME O LOGO 36

More Related Content

Similar to Syntactical errors detection 2

Aspettando Go.2 - Meetup golang milano - 27 settembre 2018
Aspettando Go.2 - Meetup golang milano - 27 settembre 2018Aspettando Go.2 - Meetup golang milano - 27 settembre 2018
Aspettando Go.2 - Meetup golang milano - 27 settembre 2018r3vit
 
Java 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio SperdutoJava 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio SperdutoVitalij Zadneprovskij
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateManuel Scapolan
 
Koha RDA FRBR: alcune riflessioni (text)
Koha RDA FRBR: alcune riflessioni (text)Koha RDA FRBR: alcune riflessioni (text)
Koha RDA FRBR: alcune riflessioni (text)Stefano Bargioni
 
Clean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech SummitClean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech SummitDavide Muzzarelli
 
Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...
Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...
Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...MichaelFuser
 
Groovy e Domain Specific Languages
Groovy e Domain Specific LanguagesGroovy e Domain Specific Languages
Groovy e Domain Specific LanguagesTiziano Lattisi
 
Java Symbolic Regression - Machine Learining
Java Symbolic Regression - Machine LeariningJava Symbolic Regression - Machine Learining
Java Symbolic Regression - Machine LeariningAndrea Ciccotta
 
Software bill of materials: strumenti e analisi di progetti open source dell’...
Software bill of materials: strumenti e analisi di progetti open source dell’...Software bill of materials: strumenti e analisi di progetti open source dell’...
Software bill of materials: strumenti e analisi di progetti open source dell’...FedericoBoni3
 
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)Stefano Bragaglia
 
Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Roberto Barbiera
 
15 concetti importanti su javascript
15 concetti importanti su javascript15 concetti importanti su javascript
15 concetti importanti su javascriptGiovanni Buffa
 
Laboratorio Programmazione: Funzioni
Laboratorio Programmazione: FunzioniLaboratorio Programmazione: Funzioni
Laboratorio Programmazione: FunzioniMajong DevJfu
 
Continous Delivery & HQ Code
Continous Delivery & HQ CodeContinous Delivery & HQ Code
Continous Delivery & HQ CodeDaniele Mondello
 
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010Stefano Bragaglia
 
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...Codemotion
 
AlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corsoAlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corsoAlessandro Bogliolo
 

Similar to Syntactical errors detection 2 (20)

Aspettando Go.2 - Meetup golang milano - 27 settembre 2018
Aspettando Go.2 - Meetup golang milano - 27 settembre 2018Aspettando Go.2 - Meetup golang milano - 27 settembre 2018
Aspettando Go.2 - Meetup golang milano - 27 settembre 2018
 
Java 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio SperdutoJava 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio Sperduto
 
Hadoop in action!
Hadoop in action!Hadoop in action!
Hadoop in action!
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
Koha RDA FRBR: alcune riflessioni (text)
Koha RDA FRBR: alcune riflessioni (text)Koha RDA FRBR: alcune riflessioni (text)
Koha RDA FRBR: alcune riflessioni (text)
 
Clean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech SummitClean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech Summit
 
Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...
Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...
Progetto e sviluppo di un sistema di rilevamento di anomalie su sistemi infor...
 
Groovy e Domain Specific Languages
Groovy e Domain Specific LanguagesGroovy e Domain Specific Languages
Groovy e Domain Specific Languages
 
Java Symbolic Regression - Machine Learining
Java Symbolic Regression - Machine LeariningJava Symbolic Regression - Machine Learining
Java Symbolic Regression - Machine Learining
 
Software bill of materials: strumenti e analisi di progetti open source dell’...
Software bill of materials: strumenti e analisi di progetti open source dell’...Software bill of materials: strumenti e analisi di progetti open source dell’...
Software bill of materials: strumenti e analisi di progetti open source dell’...
 
Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)Introducing PRSs and Drools (in Italian)
Introducing PRSs and Drools (in Italian)
 
Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97
 
Thesis M. Redaelli Slides EN
Thesis M. Redaelli Slides ENThesis M. Redaelli Slides EN
Thesis M. Redaelli Slides EN
 
Tesi1
Tesi1Tesi1
Tesi1
 
15 concetti importanti su javascript
15 concetti importanti su javascript15 concetti importanti su javascript
15 concetti importanti su javascript
 
Laboratorio Programmazione: Funzioni
Laboratorio Programmazione: FunzioniLaboratorio Programmazione: Funzioni
Laboratorio Programmazione: Funzioni
 
Continous Delivery & HQ Code
Continous Delivery & HQ CodeContinous Delivery & HQ Code
Continous Delivery & HQ Code
 
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
Stefano Bragaglia MSc Thesis, awarded as Best Italian thesis in AI 2009/2010
 
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
 
AlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corsoAlgoMOOC 01.02 (2018) - Organizzazione del corso
AlgoMOOC 01.02 (2018) - Organizzazione del corso
 

Syntactical errors detection 2

  • 1. Syntacticalerrors detection Utilizzo di tecniche di clustering per individuare errori sintattici negli OpenData and correction
  • 2. NOME O LOGO 2 Indice Riepilogo - Scopo del lavoro - Clustering, Fuzzy, ecc… - Cosa è stato fatto Passi in avanti - Test dataset Europei - Correzione errori dataset - Versione in NodeJS - Progettazione in Fly
  • 3. NOME O LOGO Riepilogo Spiegazione rapida di quanto discusso nello scorso seminario 3
  • 4. NOME O LOGO Alla ricerca di errori sintattici in collezioni di stringhe 4 Scopo del lavoro I dati sono preziosissimi, di conseguenza la propensione a renderli Open è di vitale importanza. La loro qualità, però, non è sempre garantita a causa di errori di battitura, o di errori nella generazione automatica dei campi. Come è possibile individuare tali errori usando tecniche di clustering? Al fine di giungere ad una soluzione bisogna risolvere alcune problematiche:  Se si può lavorare direttamente con stringhe;  Come valutare la similarità tra stringhe;  Se è necessario specificare il numero di cluster;
  • 5. NOME O LOGO Selezione e raggruppamento di elementi omogenei in un insieme di dati. In generale, «lontananza» tra due punti di un insieme, in base ad una specifica metrica • Lavora sul concetto di «Similarità», e lavora propriamente su stringhe • Permette di operare anche sulla similarità di sottostringhe • Sfrutta la distanza di Levenshtein Alla ricerca degli strumenti necessari Clustering 5 Distanza Approximate String Matching Parte di studio effettuata prima di iniziare il lavoro.
  • 6. NOME O LOGO WomboCombo: l’unione fa la forza Usare insieme FuzzyMatching, Distanza di Levenshtein e un Dizionario:  Levenshtein per verificare se sono esattamente uguali due stringhe;  Dizionario per verificare se si tratta di falsi positivi  Eventualmente computare il FuzzyMatching 6 Distanza di Levenshtein FuzzyMatching FuzzyMatching + Levenshtein FuzzyMatching + Levenshtein + Dizionario
  • 7. NOME O LOGO Algoritmo di verifica 7 def check_clusters(clusters, dictionary): if not split(clusters, dictionary): return False, "Aumentare il n° di cluster" if not collapse(clusters, dictionary): return False, "Diminuire il n° di cluster" return True, "Numero esatto di cluster" 1. Split: verifico la presenza di due elementi presenti nel dizionario in uno stesso cluster 2. Collapse: verifico se due parole simili, usando il metodo WomboCombo, sono in cluster diversi Esempio di test su un dataset di 1492 stringhe, riguardanti le regioni italiane. Erano presenti tutte le regioni, quindi il numero atteso di cluster era 20. Clusterizzando nel range individuato, l’algoritmo riconosce la correttezza di formato con 20 cluster
  • 8. NOME O LOGO Passi in avanti col progetto Come sono stati affrontati gli obiettivi esaminati e discussi nello scorso seminario 8
  • 9. NOME O LOGO Test effettuati per verificare l’adattabilità della libreria su collezioni di stringhe di un’altra lingua 9 Test su dataset europei
  • 10. NOME O LOGO Test su dataset europei… senza problemi 10 • Dataset dei principali incidenti stradali tra il 2006 e il 2012; • Test con e senza errori; • Test basato sulle province; https://ckan.dataplatform.nl/dataset
  • 11. NOME O LOGO Test effettuati per verificare l’adattabilità della libreria su collezioni di stringhe di un’altra lingua 11 Test su dataset europei
  • 12. NOME O LOGO Test su dataset europei… senza problemi 12 • Dataset sui produttori autorizzati di latte; • Test con e senza errori; • Test con presenza di campi vuoti • Test basato sulle città e contee (merge di dizionari); https://data.gov.uk/
  • 13. NOME O LOGO Test effettuati per verificare l’adattabilità della libreria su collezioni di stringhe di un’altra lingua 13 Test su dataset europei
  • 14. NOME O LOGO Test su dataset europei… senza problemi 14 • Dataset sui contratti nei vari comuni; • Test con e senza errori di codifica; • Test basato sulle province; https://datos.gob.es/en
  • 15. NOME O LOGO Test effettuati per verificare l’adattabilità della libreria su collezioni di stringhe di un’altra lingua 15 Test su dataset europei
  • 16. NOME O LOGO Test su dataset europei… senza problemi 16 • Dataset dei distretti dell’Irlanda; • Test con dataset fortemente manipolato; • Test basato sulle contee; https://data.smartdublin.ie | https://data.gov.ie/dataset
  • 17. NOME O LOGO Test effettuati per verificare l’adattabilità della libreria su collezioni di stringhe di un’altra lingua 17 Test su dataset europei
  • 18. NOME O LOGO Test su dataset europei… con piccoli problemi 18 • Difficoltà nel trovare Dataset dei Comuni corretto/completo; • 3 modi in cui scrivere il nome della stessa città, a seconda dell’utilizzo o meno di accenti e trattini nel dataset analizzato Comuni • Necessità di due dizionari a seconda dell’anno di pubblicazione del dataset • Test su dataset dei monumenti Regioni https://www.data.gouv.fr/fr/
  • 19. NOME O LOGO 19 Correzione degli errori Due possibili situazioni I cluster da correggere sono stati costruiti in maniera corretta utilizzando la libreria sviluppata Si deve cercare di correggere cluster/array in maniera indipendente da come sono stati costruiti
  • 20. NOME O LOGO 20 Per applicare il primo metodo bisogna seguire tutto l’iter per poter ottenere il numero giusto di cluster, in modo che in ogni cluster ci siano parole che rappresentano una stessa città Correzione dei cluster: primo metodo Caricare il dataset Computare le distanze Determinare range del n° dei cluster Algoritmo di verifica
  • 21. NOME O LOGO Correzione dei cluster: primo metodo 21 Per ogni cluster si deve definire un esemplare. In prima battuta si cerca direttamente nel dizionario la corrispondenza con uno degli elementi del cluster def propose_correction(clusters, dictionary): sample = "" sample_flag = False for i, group in enumerate(clusters): g = np.unique(group) #Ricerca di un presente nel dizionario for w in g: if dictionary.get(w.lower()) is not None: if not sample_flag: sample_flag = True sample = w break
  • 22. NOME O LOGO Correzione dei cluster: primo metodo 22 In alternativa, si cerca un elemento del cluster che ha corrispondenza nel dizionario usando la funzione wombocombo. Solo infine si applica a tutto il cluster l’esemplare individuato #Alternativa: Nessun elemento del cluster fa parte del dizionario if not sample_flag: for w, d in product(g, dictionary): if string_similarity.single_wombocombo(w, d, dictionary) == 0: sample = dictionary.get(d) sample_flag = True break #applica la correzione a tutto il gruppo, se è stato individuato un esemplare nel dizionario if sample_flag: for j, el in enumerate(group): clusters[i][j] = str(sample) sample_flag = False sample = "" return clusters
  • 23. NOME O LOGO Correzione dei cluster: secondo metodo 23 Soluzione generale, nel caso non si può o non si vuole passare per l’iter precedentemente descritto. Basta fornire al metodo o un semplice array o dei cluster creati in un qualunque modo. def propose_correction_general(clusters, dictionary): samples = [] for i, group in enumerate(clusters): g = np.unique(group) for w, d in product(g, dictionary): if string_similarity.single_wombocombo(w, d, dictionary) == 0: samples.append(dictionary.get(d)) samples = np.unique(samples) for j, el in enumerate(group): for s in samples: if string_similarity.single_wombocombo(s, el, dictionary) == 0: clusters[i][j] = str(s) samples = [] return clusters
  • 24. NOME O LOGO Perché utilizzare il primo metodo? 24 In fase di correzione le parole in uno stesso cluster rappresentano la stessa città, quindi individuata per una, le altre si correggono transitivamente. words = ["Salr", "Sale"] dictionary = {"salerno": "Salerno"} words = ["Salerno", "Salerno"] words = ["Salr", "Salerno"]
  • 25. NOME O LOGO 25 Implementazione in Javascript/NodeJS
  • 26. NOME O LOGO Perché farlo? L’implementazione in Javascript/NodeJs garantisce una diretta integrazione in sistemi di gestione di open data (es. SPOD) 26 Permetterne l’utilizzo su applicazioni web
  • 27. NOME O LOGO Sono state mantenute tutte le caratteristiche? 27 La difficoltà principale è stata la reperibilità delle librerie utilizzate in Python Scikit-Learn per AgglomerativeClustering FuzzyWuzzy per Approximate-String-Matching pyxdameraulevenshtein per Damerau-Levensthein
  • 28. NOME O LOGO Sono state mantenute tutte le caratteristiche? 28 Dopo molti test e ricerche sono state individuate quelle che forniscono risultati praticamente identici hierarchical-clustering per AgglomerativeClustering FuzzyBall per Approximate-String-Matching damerau-levenshtein-js per Damerau-Levensthein
  • 29. NOME O LOGO WomboCombo 29 Cosa è cambiato nell’algoritmo realizzato per computare le distanze if(dict[w1]!=undefined && dict[w2]!=undefined && w1 != w2) return HIGH_LEV_DIFFERENCE; lev = levjs.distance(w1, w2); if( lev <= LEV_TOLLERANCE) return 0; fuz1 = fw.ratio(w1, w2) fuz2 = fw.partial_ratio(w1, w2) fuz3 = fw.token_set_ratio(w1, w2) fuzAverage = Math.round((fuz1 + fuz2*PESO_PARTIAL_RATIO + fuz3)/3) fuzsum = Math.round((fuz2 + fuz3) / 2) if ((fuzAverage >= HIGH_AVERAGE_FUZZY) || (fuzsum >= HIGH_SUBSTRING_FUZZY)) return 0; if ((fuzAverage < LOW_AVERAGE_FUZZY) || (fuzsum < LOW_SUBSTRING_FUZZY)) return lev = lev + HIGH_LEV_DIFFERENCE return lev + LOW_LEV_DIFFERENCE
  • 30. NOME O LOGO Gestione del clustering 30 var levels = hierarchical({ input: words, distance: single_wombo_combo, linkage: linkage, minClusters: numCluster, }); var clusters = levels[levels.length - 1].clusters; clusters = clusters.map(function (cluster) { return cluster.map(function (index) { return words[index]; }); }); • Piccole variazioni del codice • Stessa logica, con semplificazione della computazione delle distanze
  • 32. NOME O LOGO Librerie e codice Python 32 from fuzzywuzzy import fuzz as fw import pyxdameraulevenshtein as lev import numpy as np from sklearn.cluster import AgglomerativeClustering as AC Nessuna difficoltà nell’importare qualunque libreria Python Nessuna peculiarità di Python nella mia libreria Syntactical errors detection and correction
  • 33. NOME O LOGO Computazione della matrice 33 • L’operazione con la maggiore complessità della libreria O(𝑛3); • C’è un limite di tempo per l’esecuzione delle funzioni (15 minuti); • Nell’esecuzione in locale è un tempo ancora non registrato;
  • 34. NOME O LOGO Computazione della matrice 34 Tale operazione lavora molto sugli indici dell’array delle parole e della matrice delle distanze array delle parole matrice delle distanze La distanza tra la parola i-esima e la j-esima va inserita nella cella [i,j] della matrice delle distanze Le funzioni devono prendere in input gli indici della matrice e le parole per cui computare la similarità, devono restituire indici e il valore di similarità
  • 35. NOME O LOGO Cosa bisogna aggiungere/migliorare a quanto già fatto 35 Come proseguire • Completare l’implementazione in JavaScript/NodeJS delle altre funzionalità • Riuscire a trovare una soluzione che sleghi la necessità di un buon dizionario, ma crearne uno ad hoc basandosi sulla frequenza delle parole in un dataset