Algoritmi di similarità delle stringhe Confrontati

Ricerca e test

Abbiamo testato diversi algoritmi per confrontare le stringhe e selezionato quello che meglio si adattava alle nostre esigenze.

Tabella di test degli algoritmi

Abbiamo confrontato la stringa A e la stringa B per avere metriche sui diversi algoritmi.

Le regole per la somiglianza delle stringhe possono differire da caso a caso. Se vuoi considerare” niche “e” chien ” simili, useresti un algoritmo di somiglianza delle stringhe che rileva gli anagrammi. Non nel nostro caso. Un’app denominata ” niche “e un’altra denominata” chien ” sono molto probabilmente due app completamente diverse.

Dopo alcuni brainstorming e ricerche abbiamo trovato alcuni metodi di algoritmo che avrebbero aiutato il nostro caso. L’algoritmo del coseno si è dimostrato irrilevante per noi, come ad esempio non sembra prendere in considerazione l’ordine delle lettere, che porta ad un indice di 1 (stringa simile) su un anagramma (“nicchia” e “chien”).

Ecco cosa abbiamo notato:

Algoritmo di Levenshtein

La distanza di Levenshtein è il numero minimo di modifiche a carattere singolo necessarie per cambiare una parola nell’altra, quindi il risultato è un numero intero positivo, sensibile alla lunghezza della stringa . Che rendono più difficile disegnare il modello.

Per esempio,

  • la distanza di Levenshtein tra “foo” e “bar” è 3
  • la distanza di Levenshtein tra “beauties” e “beautiful” è anche 3
  • Per noi umani, la coppia “beauties”/”beautiful” è molto più simile alla coppia “foo”/”bar”. Ma la distanza di Levenshtein è la stessa.

La metrica che stiamo usando qui è l’inverso della distanza di Levenshtein ( 1 / levenshtein_distance ) quindi il risultato è una percentuale ed è più facilmente letto da noi. Ma il problema sopra menzionato è rimasto lo stesso.

Dove 1 è il risultato del confronto di stringhe identiche, “ShazamIphone” e “ShazamAndroid” hanno una somiglianza di 0,167. “chien” e “niche” hanno una somiglianza di 0,25.

Quindi dal punto di vista dell’algoritmo di Levenshtein Chien/Niche sono più simili di “ShazamIphone”/”ShazamAndroid” perché sono necessarie meno modifiche per passare da “chien” a “niche”, piuttosto che andare da “ShazamIphone” a “ShazamAndroid”.

Confronto trigramma

Un algoritmo trigramma è un caso di n-grammo, una sequenza contigua di n (tre, in questo caso) elementi da un dato campione. Nel nostro caso, il nome di un’applicazione è un esempio e un carattere è un elemento.
Quindi La sequenza “martha” ha 4 trigrammi { mar art rth tha}.

Possiamo usare il metodo Trigram per confrontare due stringhe.

Prendendo per esempio “marta” e la stessa parola con un errore di battitura, “marhta”, e siamo in grado di calcolare i trigrammi:

Trigrammi “martha”: { mar art rth tha }

Trigrammi “marhta”: { mar arh rht hta }

misurare la somiglianza dobbiamo dividere il numero di trigrammi in comune in entrambe le stringhe: 1 { mar } per il numero di trigrammi: 7 marzo }

The result is 1/7 = 14%

Per bilanciare lo svantaggio dei caratteri esterni (un po ‘ per rafforzare la somiglianza delle stringhe che iniziano e terminano con gli stessi trigrammi), riempiamo la stringa con spazi vuoti su entrambi i lati, risultando in questi casi in altri tre trigrammi “_ma”, “ha_” e “ta_”.

Trigrammi “martha”: {_ma mar art rth tha ha_ }

Trigrammi ” marhta “: { _ma mar arh rht hta ta_ }

Fatto questo, il numero di trigrammi corrispondenti è fino a: 2 { _ma mar }
Il numero di tutti i trigrammi unici: 9 { _ma mar art rth tha arh rht hta ha_ }

The result is now 2/9 = 22%

Utilizzando questo metodo per confrontare Twitter “v1” e “Twitter v2” abbiamo:

Il numero di matching trigrammi: 7 { _tw twi wit itt tte ter er_ }
Il numero di tutti unici trigrammi: 11 { tw twi wit itt tte ter er_ _v1 _v2 v1_ v2_ }

The result is 7/11 = 63%

Il limite del Trigramma metodo per confrontare le stringhe è che le corde con uno (o due..) diversi trigrammi tendono a produrre una somiglianza inferiore rispetto a quelli lunghi.

Ecco come otteniamo uno 0.2 somiglianza tra “ShazamAndroid” e “ShazamIphone”, in quanto hanno trigrammi più diversi.

Il numero di trigrammi corrispondenti è: 5 { _sh sha haz aza zam }
Il numero di tutti i trigrammi unici: 20

Poiché c’è una forte dipendenza con la lunghezza della stringa, non produce un buon confronto per noi.

Algoritmo di Jaro-Winkler

“In informatica e statistica, la distanza Jaro-Winkler è una metrica stringa per misurare la distanza di modifica tra due sequenze.

Informalmente, la distanza Jaro tra due parole è il numero minimo di trasposizioni a carattere singolo necessarie per cambiare una parola nell’altra.

La distanza Jaro-Winkler utilizza una scala di prefisso che fornisce valutazioni più favorevoli alle stringhe che corrispondono dall’inizio per una lunghezza di prefisso impostata”

Fonte: Wikipedia.

Dare “più importanza” alle parole con prefissi identici ha reso la distanza Jaro-Winkler molto interessante per il nostro caso d’uso.

Partendo dall’inizio con la formula della distanza di Jaro, ecco come funziona. Non fatevi prendere dal panico, andiamo passo per passo:

Il Jaro Distanza tra le due sequenze s1 e s2 è definito da:

Jaro distanza formula

dj è la Jaro distanza
m è il numero di caratteri corrispondenti (personaggi che compaiono in s1 e s2)
t è la metà del numero di trasposizioni (confrontare l’i-esimo carattere di s1 e l’i-esimo carattere di s2 diviso 2)
|s1| è la lunghezza della prima stringa
|s2| è la lunghezza della seconda stringa

Con un esempio. Prendiamo “martha” e “marhta”.

m = 6
t = 2/2 =1 (2 couples of non matching characters, the 4-th and 5-th) { t/h ; h/t }
|s1| = 6
|s2| = 6

Solo sostituendo i numeri è la formula, otteniamo:

dj = (⅓) ( 6/6 + 6/6 + (6–1)/6) = ⅓ 17/6 = 0,944Jaro distance = 94,4%

Ora sappiamo qual è la distanza Jaro, saltiamo alla distanza Jaro-Winkler.

La somiglianza Jaro-Winkler utilizza una scala di prefisso p che fornisce valutazioni più favorevoli alle stringhe che corrispondono fin dall’inizio per una lunghezza di prefisso impostata l.

p è un fattore di scala costante per quanto il punteggio viene regolato verso l’alto per avere prefissi comuni. Il valore standard per questa costante nel lavoro di Winkler è p = 0.1.

l è la lunghezza del prefisso comune all’inizio della stringa (fino a un massimo di 4 caratteri).

Formula di distanza Jaro-Winkler

Quindi torniamo all’esempio “martha”/ “marhta”, prendiamo una lunghezza prefisso di l = 3 (che si riferisce a “mar”). Arriviamo a:

dw = 0,944 + ( (0,1*3)(1–0,944)) = 0,944 + 0,3*0,056 = 0,961Jaro-Winkler distance = 96,1%

Usando la formula di JaroWinkler andiamo dalla distanza di Jaro al 94% di somiglianza al 96%.

Nel nostro caso, la maggior parte delle app simili inizia con lo stesso prefisso (“twitter v1” vs “twitter v2” o “ShazamIphone” vs “ShazamAndroid” ecc. Vedere la tabella di test degli algoritmi sopra). Quindi è un criterio importante da prendere in considerazione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.