Distance Damerau–Levenshtein
form et from sont à 1 modification, car échanger deux lettres voisines compte pour une seule étape, alors que kitten et sitting en demandent 3. Vous obtenez aussi une similarité de 0 à 1, utile pour repérer fautes de frappe et quasi-doublons. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Texte a
- kitten
- Texte b
- sitting
- Distance
- 3
- Len a
- 6
- Len b
- 7
- Longueur maximale
- 7
La distance de Damerau–Levenshtein est une métrique d’édition classique qui compte combien d’opérations sur un seul caractère transforment une chaîne en une autre lorsque les opérations autorisées sont l’insertion, la suppression, la substitution et la transposition de deux caractères adjacents. Cette dernière opération la distingue de la distance de Levenshtein simple et la rend particulièrement utile face aux coquilles réelles : les utilisateurs inversent souvent deux touches voisines (form contre from, teh contre the) et cela doit coûter une étape, pas deux substitutions. Cette capacité implémente la forme Optimal String Alignment de la distance avec une table pure de programmation dynamique, de sorte que chaque paire d’entrées produit le même entier sur tout runtime. Vous envoyez deux textes et un indicateur optionnel de sensibilité à la casse ; vous recevez la distance, les deux longueurs, une similarité normalisée entre zéro et un, et un booléen identical.
Ce que mesure Damerau–Levenshtein et la différence avec Levenshtein simple
La distance d’édition demande combien de changements unitaires sont nécessaires pour réécrire une chaîne source en chaîne cible. La Levenshtein classique autorise trois opérations unitaires : insérer un caractère, supprimer un caractère ou substituer un caractère par un autre. Chacune coûte un.
L’extension de Damerau ajoute une quatrième opération : échanger deux caractères adjacents pour un seul coût unitaire. Cette extension correspond à la façon dont les gens se trompent réellement au clavier. Par exemple, les chaînes ab et ba diffèrent d’une transposition adjacente sous Damerau–Levenshtein et de deux substitutions sous Levenshtein simple.
Kitten versus sitting coûte toujours trois (comme dans l’exemple manuel de Levenshtein) car le chemin le moins cher utilise des substitutions et une insertion plutôt qu’un seul échange. Ce point d’accès utilise la récurrence Optimal String Alignment (OSA) : une matrice de programmation dynamique où la cellule (i, j) est le minimum de supprimer, insérer, substituer ou faire correspondre, et—lorsque les deux derniers caractères de chaque préfixe forment une paire croisée—transposer depuis la cellule (i−2, j−2).
OSA est la forme que la plupart des bibliothèques appellent Damerau–Levenshtein pour la correction de coquilles ; elle interdit d’appliquer deux transpositions superposées sur la même sous-chaîne, ce qui garde la métrique simple et O(n·m) en temps et en espace. Les chaînes vides sont valides : la distance de la chaîne vide à toute chaîne est la longueur de cette chaîne, et la distance entre deux vides est zéro. Les chaînes identiques donnent toujours distance zéro et similarité un, y compris après le pliage optionnel de la casse.
Où cette distance se montre utile
Les outils de recherche produit et d’inventaire utilisent la distance d’édition avec transpositions pour classer SKU et marques presque coincidentes avant de basculer vers des modèles sémantiques plus lents. Les pipelines CRM et de déduplication signalent des lignes candidates en doublon lorsque la distance est au plus un ou deux et que la similarité dépasse un seuil fixe, capturant des lettres échangées que l’égalité pure ou même Levenshtein simple sous-évalueraient.
Les démos de correcteur et les exercices en classe ont besoin d’un oracle déterministe qui marque form contre from comme distance un et facture un tarif fixe transparent plutôt qu’un coût par jetons. Une entrée invalide ne consomme pas le solde.
Associez la distance entière à votre propre politique de seuil—acceptez distance zéro uniquement pour les clés exactes, distance un pour une correction agressive de coquilles, similarité au-dessus de 0.8 pour des indices de fusion douce—et vous obtenez un bloc auditable de correspondance floue sans déployer un moteur de recherche complet ni une pile TALN propre.
Cas d’usage
Appariement produits et SKU tolérant aux coquilles
Classez les candidats du catalogue lorsqu’une chaîne client ou fournisseur est à un échange ou une édition du vrai SKU, sans appeler un modèle d’embeddings.
Déduplication CRM et d’enregistrements
Signalez des noms et adresses quasi-doublons où les échanges de lettres adjacentes sont fréquents, avec un seuil fixe de distance ou de similarité.
Devoirs et démonstrations d’algorithmes
Montrez aux élèves le programme dynamique OSA sur kitten/sitting et ab/ba afin que le coût de transposition soit visible à côté de Levenshtein simple.
Questions fréquentes
Qu’est-ce que la distance de Damerau–Levenshtein ?
C’est le nombre minimal d’insertions, suppressions, substitutions et transpositions de caractères adjacents nécessaires pour transformer une chaîne en une autre.
En quoi diffère-t-elle de la distance de Levenshtein ordinaire ?
La Levenshtein simple n’a pas d’opération de transposition, donc des voisins échangés coûtent deux substitutions. Damerau–Levenshtein (OSA) compte un échange adjacent comme une édition, ce qui colle mieux aux coquilles clavier réelles.
Les chaînes vides sont-elles autorisées ?
Oui. La distance d’une chaîne vide à une non vide égale la longueur de cette chaîne ; deux vides ont distance zéro et similarité un.
Que signifie le score de similarité ?
C'est 1 moins la distance divisée par la longueur du texte le plus long. Kitten et sitting sont à 3 modifications et le mot le plus long compte 7 lettres, d'où une similarité d'environ 0,571428571429. Deux textes identiques donnent 1.
L'outil distingue-t-il les majuscules ?
Oui, par défaut Kitten et kitten sont à une modification. Si vous désactivez cette distinction, les deux textes passent en minuscules avant le calcul et les écarts de casse ne comptent plus.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/str/damerau-levenshtein \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text_a":"kitten","text_b":"sitting"}'const res = await fetch("https://api.kit.forhosting.com/str/damerau-levenshtein", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text_a": "kitten",
"text_b": "sitting"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/damerau-levenshtein",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text_a": "kitten",
"text_b": "sitting"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/damerau-levenshtein", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text_a":"kitten","text_b":"sitting"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text_a":"kitten","text_b":"sitting"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/damerau-levenshtein", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"text_a": "kitten",
"text_b": "sitting"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.damerau_levenshtein",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
Le chemin gratuit du navigateur et l’API prépayée partagent le même module, ainsi les contrôles de devoirs, les seuils de correspondance floue et les pipelines de production ne divergent jamais sur la proximité suffisante de deux libellés pour une fusion.
Contrat d’entrée, champs de réponse et règles de validation
Chaque chaîne est plafonnée à cinq mille caractères pour que la table quadratique reste bornée sur le chemin gratuit en bordure. Une courte chaîne formula documente la récurrence OSA pour l’affichage à côté de la réponse. La validation en échec n’est pas facturée. Gardez des entrées assez courtes pour un usage interactif, figez la distance entière et la similarité arrondie dans les tests, et vous obtenez des scores flous reproductibles sans modèle de langage ni dictionnaire externe. Envoyez un corps JSON avec deux champs de chaîne obligatoires : text_a (alias a, string1, s1, left, first, source) et text_b (alias b, string2, s2, right, second, target). Les deux peuvent être vides ; les valeurs manquantes ou non chaînes échouent avec invalid_input en nommant le champ. L’option case_sensitive vaut true par défaut afin que Kitten et kitten puissent différer ; mettez-la à false pour mettre les deux côtés en minuscules avant de remplir la table. En succès le corps répète text_a, text_b et case_sensitive ; signale distance comme entier non négatif ; signale len_a, len_b et max_len des chaînes normalisées ; signale similarity comme (max_len − distance) / max_len arrondi à douze décimales (ou un lorsque les deux longueurs sont zéro) ; et met identical à true exactement lorsque distance vaut zéro. Exemple : text_a kitten et text_b sitting donnent distance trois, longueurs six et sept, max_len sept, similarity près de 0.571 et identical false. Exemple : text_a ab et text_b ba donnent distance un grâce à l’échange adjacent.
Où une API Damerau–Levenshtein prouve sa valeur
Comme l’implémentation est parse pure de niveau A, chaque appel réussi coûte le prix de base publié $0.002 sans jetons de modèle ni réseau sortant.
Questions techniques
La comparaison est-elle sensible à la casse ?
Par défaut oui (case_sensitive true). Mettez case_sensitive à false pour mettre les deux chaînes en minuscules avant le calcul afin que Kitten et kitten correspondent.
Combien coûte le calculateur Damerau–Levenshtein ?
L’outil navigateur est gratuit. Les requêtes API utilisent le solde prépayé KIT à $0.002 par appel réussi ; une entrée invalide n’est pas facturée.