Subido por Henri Leveque

Distance de Levenshtein — Wikipédia

Anuncio
https://fr.wikipedia.org/wiki/Distance_de_Levenshtein
Distance de Levenshtein — Wikipédia
Distance de Levenshtein — Wikipédia
Un article de Wikipédia, l'encyclopédie libre.
La distance de Levenshtein est une distance, au sens mathématique du terme, donnant une mesure de la différence entre deux chaînes de caractères. Elle est égale au nombre minimal de caractères qu'il faut supprimer, insérer ou remplacer pour passer d’une chaîne à
l’autre.
Elle a été proposée par Vladimir Levenshtein en 1965. Elle est également connue sous les noms de distance d'édition ou de déformation dynamique temporelle, notamment en reconnaissance de formes et particulièrement en reconnaissance vocale[1],[2].
Cette distance est d'autant plus grande que le nombre de différences entre les deux chaînes est grand. La distance de Levenshtein peut être considérée comme une généralisation de la distance de Hamming. On peut montrer en particulier que la distance de Hamming est un
majorant de la distance de Levenshtein.
Définition[modifier | modifier le code]
On appelle distance de Levenshtein entre deux chaînes M et P le coût minimal pour transformer M en P en effectuant les seules opérations élémentaires (au niveau d'un caractère) suivantes (on agit exclusivement sur M et successivement sur ses transformés) :
substitution ;
insertion (ou ajout) ;
suppression (ou effacement).
Formellement, on définit cette distance, avec deux chaînes ܽ et ܾ , |ܽ|
⎧max ( | ܽ | , | ܾ | )
⎪lev(ܽ − 1, ܾ − 1)
⎪
lev(ܽ − 1, ܾ)
lev(ܽ, ܾ) =
⎨
lev(ܽ, ܾ − 1)
⎪1 + min ൞
lev(ܽ − 1, ܾ − 1)
⎪
⎩
le cardinal de ܽ (ou son nombre de lettre), et ܽ − 1
la chaînes ܽ tronquée de sa 1ère lettre ܽ[0]
:
si min ( | ܽ | , | ܾ | ) = 0,
si ܽ[0] = ܾ[0],
sinon.
On associe à chacune de ces opérations un coût. Généralement, le coût est égal à 1 pour les trois opérations. La distance est la somme des coûts des opérations effectuées. On peut montrer que définir une distance au sens mathématique du terme entre les caractères d'un
alphabet, entraine que la distance de Levenshtein soit aussi une distance au sens mathématique du terme, sur l'ensemble des chaines construites sur l'alphabet.
Exemples[modifier | modifier le code]
Si M = « examen » et P = « examen », alors lev(‫ܯ‬, ܲ) = 0
Si M = « examen » et P = « examan », alors lev(‫ܯ‬, ܲ) = 1
, parce qu'aucune opération n'a été réalisée.
, parce qu’il y a eu une substitution (changement du e en a), et que l'on ne peut pas en faire moins.
Algorithme[modifier | modifier le code]
L’algorithme ci-dessous, dû à Wagner et Fischer (1974), permet de calculer la distance de Levenshtein entre deux chaînes de caractères courtes. Cet algorithme est un exemple de programmation dynamique (solution de type du bas en haut), qui utilise une matrice de
dimension (݊ + 1) × (݉ + 1)
où n et m sont les dimensions des deux chaînes de caractères. Dans le pseudo-code suivant, la chaîne chaine1 est de longueur longueurChaine1 et chaine2, de longueur longueurChaine2. Cet algorithme renvoie un entier positif
ou nul. Par définition d'une distance au sens mathématique du terme, l'algorithme renvoie 0, si et seulement si les deux chaînes sont égales. Pour deux chaînes de longueurs données, la valeur maximale de la distance est la longueur de la chaîne la plus longue.
entier DistanceDeLevenshtein(caractere chaine1[1..longueurChaine1],
caractere chaine2[1..longueurChaine2])
// D est un tableau de longueurChaine1+1 rangées et longueurChaine2+1 colonnes
// D est indexé à partir de 0, les chaînes à partir de 1
déclarer entier d[0..longueurChaine1, 0..longueurChaine2]
// i et j itèrent sur chaine1 et chaine2
déclarer entier i, j, coûtSubstitution
pour i de 0 à longueurChaine1
D[i, 0]]:= i
pour j de 0 à longueurChaine2
D[0, j]]:= j
pour i de 1 à longueurChaine1
pour j de 1 à longueurChaine2
si chaine1[i] = chaine2[j] alors coûtSubstitution := 0
sinon coûtSubstitution := 1
D[i, j]]:= minimum(
D[i-1, j ] + 1,
// effacement du nouveau caractère de chaine1
D[i,
j-1] + 1,
// insertion dans chaine2 du nouveau caractère de chaine1
D[i-1, j-1] + coûtSubstitution
// substitution
)
renvoyer D[longueurChaine1, longueurChaine2]
L’invariant est qu’on peut transformer le segment initial chaine1[1..i] en chaine2[1..j] en utilisant un nombre minimal de D[i, j] opérations. L’algorithme achevé, la solution est contenue dans la dernière position à droite de la rangée du bas de la matrice.
1 sur 3
22/03/2021 à 15:12
https://fr.wikipedia.org/wiki/Distance_de_Levenshtein
Distance de Levenshtein — Wikipédia
Améliorations possibles[modifier | modifier le code]
L’algorithme présenté a une complexité temporelle et spatiale de (݉ + 1) × (݊ + 1)
mémoire, ce qui réduit grandement la quantité de mémoire utilisée à ܱ(݉)
. En effet, il faut stocker et remplir la matrice en mémoire. Cependant, il est possible d'effectuer le calcul en ne gardant que la ligne précédente et la ligne actuelle en
.
D’autre part, il est aussi possible d’expliciter les suites d'opérations permettant de réellement passer d’une chaîne à l'autre. Une fois le calcul effectué, on peut obtenir ces suites en partant de la cellule en bas à droite et en remontant de cellule en cellule en prenant à chaque
fois la ou les cellules à l’origine de la valeur minimum. Plusieurs cellules pouvant être à l’origine de cette valeur minimum, aussi plusieurs chemins peuvent être déduits, ils sont tous de longueur minimum. Ce processus permet par exemple d’apparier les caractères de ܽ avec
ceux de ܾ .
Des implémentations plus complexes mais plus performantes existent[3]. Par exemple celle de Myers[4] dont le coût est en ܱ(݊‫)ܦ‬
.
avec ‫ܦ‬
la distance trouvée ; et surtout celle de Wu, Manber et Myers[5] en ܱ(݊ܲ)
avec ܲ = ‫ܦ‬/2 − (݊ − ݉)/2
Exemple de déroulement de l'algorithme[modifier | modifier le code]
Pour comprendre le fonctionnement de cet algorithme, prenons un exemple :
Soit chaine1 = « NICHE ».
Soit chaine2 = « CHIENS ».
On veut transformer « NICHE » en « CHIENS » avec un coût minimal.
Intuition[modifier | modifier le code]
Intuitivement, on voit bien que l'on peut transformer chaine1 en chaine2 en 5 étapes :
Suppression de N et I → CHE ;
Insertion de I, N et S → CHIENS.
La distance de Levenshtein d entre « NICHE » et « CHIENS » est donc d'au plus 5. On peut se convaincre par l'expérience que 5 est effectivement la distance entre les deux chaînes (l'algorithme de la distance de Levenshtein ne s'occupe pas de déplacement, il ne sait détecter
que la suppression ou l'insertion d'une lettre, ainsi que le remplacement d'une lettre par une autre). Pour le vérifier formellement, on peut appliquer l'algorithme (ou tout essayer manuellement).
Fonctionnement[modifier | modifier le code]
Soit n la longueur de la chaîne1 (ici 'NICHE', n=5).
Soit m la longueur de la chaîne2 (ici 'CHIENS', m=6).
Si n=0 alors retourner d=m et quitter.
Si m=0 alors retourner d=n et quitter.
Construire une matrice D de n+1 lignes et m+1 colonnes.
Initialiser la première ligne par la matrice ligne [ 0,1,….., m-1, m] et la première colonne par la matrice colonne [ 0,1,….., n-1, n].
CH I ENS
01 2 34 5 6
N1 0 0 00 0 0
I 20 0 00 0 0
C 30 0 00 0 0
H40 0 00 0 0
E 5 0 0 00 0 0
Soit Cout[i, j]=0 si a[i]=b[j] et Cout[i, j]=1 si a[i]!=b[j]. C'est le coût de substitution.
On a donc ici la matrice Cout:
CH I ENS
N1 1 1 1 0 1
I 1 1 01 1 1
C01 1 1 1 1
H1 0 1 1 1 1
E1 1 1 01 1
On remplit ensuite la matrice D en utilisant la règle suivante D[i, j] est égale au minimum entre les éléments suivants :
L’élément directement au-dessus et on ajoute 1 (effacement) : D[i-1, j] + 1.
L’élément directement avant et on ajoute 1 (insertion) : D[i, j-1] + 1.
L’élément diagonal précédent et on ajoute le coût (substitution) : D[i-1, j-1] + Cout[i-1, j-1].
Attention ! Il s'agit de Cout[i-1, j-1] et non de Cout[i, j] car la matrice Cout est moins grande que la matrice D, ce qui entraîne un décalage.
Dans notre cas, le remplissage de la première ligne donne alors :
2 sur 3
22/03/2021 à 15:12
Distance de Levenshtein — Wikipédia
https://fr.wikipedia.org/wiki/Distance_de_Levenshtein
CH I ENS
01 2 34 5 6
N1 1 2 34 4 5
I 20 0 00 0 0
C 30 0 00 0 0
H40 0 00 0 0
E 5 0 0 00 0 0
Nous réitérons cette opération jusqu'à remplir la matrice :
CH I ENS
01 2 34 5 6
N1 1 2 34 4 5
I 22 2 23 4 5
C323 33 4 5
H43 2 34 4 5
E543 334 5
La distance de Levenshtein entre les 2 chaînes est en D[n, m], c'est-à-dire en bas à droite.
Ici, on retrouve bien les 5 opérations trouvées de manière intuitive.
La matrice D fournit aussi explicitement les suites d'opérations possibles permettant de passer d'une chaîne de caractères à l'autre (Il existe ici 6 suites possibles). On part du 5 en bas à droite et on examine les trois cases du quartier supérieur gauche ; (4,4,5) dans le sens
d'une montre. On suit la ou les valeurs minimums. Ici on a deux 4 qui donnent donc deux chemins (une bifurcation), et ainsi de suite on crée un arbre par récurrence. Aller au dessus s’interprète comme détruire la lettre de la colonne; aller en diagonale est substituer la lettre
de la ligne par la lettre de la colonne (ou pas si elles sont égales) ; aller à gauche est ajouter la lettre de la colonne. Bien sur à la fin, il faut lire les étapes à l'envers.
Généralisation et autres distances[modifier | modifier le code]
En remplaçant chaîne de caractères par séquence de symboles, les symboles étant comparables par un opérateur d'égalité, on peut définir une distance d'édition fonctionnant sur d'autres types que des chaînes de caractères.
On peut citer d'autres distances similaires : la distance de Damerau-Levenshtein, la distance de Hamming, la distance d'édition sur les arbres, la distance de Jaro-Winkler et la distance de Jaccard.
Notes et références[modifier | modifier le code]
1. ↑ Frédéric Sur, La distance d’édition (ou distance de Levenshtein) [archive], École des Mines de Nancy, consulté le 20 novembre 2013.
2. ↑ Deller, John R., John G. Proakis, and John HL Hansen. Discrete-time processing of speech signals. New York, NY, États-Unis : IEEE, 2000, p. 651-671.
3. ↑ Implémentation en O(NP) sous Delphi [archive] Angus Johnson.
4. ↑ An O(ND) Difference Algorithm and its Variations [archive] E Myers - Algorithmica Vol. 1 No. 2, 1986, p. 251-266.
5. ↑ An O(NP) Sequence Comparison Algorithm [archive] Sun Wu, Udi Manber & Gene Myers.
Voir aussi[modifier | modifier le code]
Articles connexes[modifier | modifier le code]
diff
TF-IDF
Algorithme de Wagner-Fischer
Distance de Damerau-Levenshtein
Liens externes[modifier | modifier le code]
Levenshtein project on sourceforge [archive] : une implémentation des distances de Levenshtein et Damerau
(en) Algorithm Implementation/Strings/Levenshtein distance, sur Wikibooks en anglais : implémentation en plusieurs langages de programmation
3 sur 3
22/03/2021 à 15:12
Descargar