Distance de Damerau-Levenshtein

En informatique théorique, la distance de Damerau–Levenshtein est une distance entre deux chaînes de caractères. Elle porte les noms des chercheurs Frederick J. Damerau (en) et Vladimir Levenshtein, étant issue de leurs travaux sur les fautes d'orthographe courantes[1].

De manière informelle, l'évaluation de cette distance consiste à calculer le nombre minimum d'opérations nécessaires pour transformer une chaîne de caractères en une autre, où une opération est définie comme l'insertion, la suppression ou la substitution d'un simple caractère, ou comme une transposition, ou permutation, de deux caractères adjacents.

Frederick J. Damerau a non seulement distingué ces quatre opérations d'édition, mais a aussi écrit qu'elles correspondent à plus de 80 % des fautes d'orthographe humaines[2]. La distance d'édition a été introduite par Vladimir Levenshtein, qui a ensuite généralisé ce concept avec des opérations multiples d'édition, mais sans y inclure les transpositions. C'est donc la possibilité de transposition qui distingue la distance de Damerau–Levenshtein de la distance de Levenshtein classique[1].

Applications

La motivation originale était de mesurer la distance entre un mot correct et un mot comportant une faute d'orthographe humaine afin d'améliorer des applications telles que les vérificateurs d'orthographe. Elle a également été utilisée pour effectuer de l'exploration de données/partitionnement de données, comparer des paquets de réseaux informatiques, quantifier la similarité entre des séquences d'ADN, l'identification de gènes[3].

Algorithme

Ci-dessous, le pseudo-code pour la fonction DistanceDeDamerauLevenshtein qui prend deux chaînes de caractères, chaine1 de longueur longueurChaine1, et chaine2 de longueur longueurChaine2, et on calcule la distance Damerau-Levenshtein entre les deux :

entier DistanceDeDamerauLevenshtein(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 chaine1 du nouveau caractère de chaine2
                                d[i-1, j-1] + coûtSubstitution   // substitution
                             )
           si(i > 1 et j > 1 et chaine1[i] = chaine2[j-1] et chaine1[i-1] = chaine2[j]) alors
               d[i, j] := minimum(
                                d[i, j],
                                d[i-2, j-2] + coûtSubstitution   // transposition
                             )
 
   renvoyer d[longueurChaine1, longueurChaine2]

On ajoute simplement cette partie au code de la distance de Levenshtein :

           si(i > 1 et j > 1 et chaine1[i] = chaine2[j-1] et chaine1[i-1] = chaine2[j]) alors
               d[i, j] := minimum(
                                d[i, j],
                                d[i-2, j-2] + coûtSubstitution   // transposition
                             )

Le coût de la transposition est de 0 si le coût de substitution est de 0 (chaine1[i] = chaine2[j] = chaine1[i-1] = chaine2[j-1] ⇒ permutation de deux caractères identiques).

Notes et références

  1. a et b (en) Gregory V. Bard, « Spelling-Error Tolerant, Order-Independent Pass-Phrases via the Damerau-Levenshtein String-Edit Distance Metric », Proceedings of the fifth Australasian symposium on ACSW frontiers,‎ , p. 117-124 (présentation en ligne).
  2. (en) Fred J. Damerau, « A technique for computer detection and correction of spelling errors », Communications of the ACM, vol. 7, no 3,‎ , p. 171–176 (DOI 10.1145/363958.363994, lire en ligne, consulté le )
  3. (en) Chunchun Zhao et Sartaj Sahni, « String correction using the Damerau-Levenshtein distance », BMC Bioinformatics, vol. 20, no 11,‎ , p. 277 (ISSN 1471-2105, PMID 31167641, PMCID PMC6551241, DOI 10.1186/s12859-019-2819-0, lire en ligne, consulté le ).

Voir aussi