Distanza Damerau–Levenshtein
form e from distano 1 modifica, perché scambiare due lettere vicine conta come un solo passo, mentre kitten e sitting ne richiedono 3. Ottiene anche una somiglianza da 0 a 1, utile per scovare refusi e nomi quasi duplicati. Gratis nel suo browser.
- Gratis
- Funziona nel suo browser
- Senza registrazione
- I suoi dati restano sul dispositivo
Esegui gratis nel browser
Esempio risolto
- Testo a
- kitten
- Testo b
- sitting
- Distanza
- 3
- Len a
- 6
- Len b
- 7
- Lunghezza massima
- 7
La distanza di Damerau–Levenshtein è una metrica classica di edit distance che conta quante operazioni su un singolo carattere trasformano una stringa in un’altra quando le operazioni consentite sono inserimento, cancellazione, sostituzione e trasposizione di due caratteri adiacenti. Quest’ultima operazione la distingue dalla distanza di Levenshtein semplice e la rende particolarmente utile per i refusi reali: le persone scambiano spesso due tasti vicini (form contro from, teh contro the) e ciò deve costare un passo, non due sostituzioni. Questa capacità implementa la forma Optimal String Alignment della distanza con una tabella pura di programmazione dinamica, così ogni coppia di input produce lo stesso intero su ogni runtime. Lei invia due testi e un flag opzionale di sensibilità al maiuscolo; riceve la distanza, entrambe le lunghezze, una similarità normalizzata tra zero e uno, e un booleano identical.
Cosa misura Damerau–Levenshtein e come differisce da Levenshtein semplice
La distanza di edit chiede quanti cambiamenti unitari servono per riscrivere una stringa sorgente come stringa destinazione. La Levenshtein classica consente tre operazioni unitarie: inserire un carattere, cancellare un carattere o sostituire un carattere con un altro. Ognuna costa uno.
L’estensione di Damerau aggiunge una quarta operazione: scambiare due caratteri adiacenti per un solo costo unitario. Questa estensione rispecchia come si sbaglia davvero a digitare sulla tastiera. Ad esempio, le stringhe ab e ba differiscono di una trasposizione adiacente sotto Damerau–Levenshtein e di due sostituzioni sotto Levenshtein semplice.
Kitten contro sitting costa ancora tre (come nell’esempio da manuale di Levenshtein) perché il percorso più economico usa sostituzioni e un inserimento piuttosto che un solo scambio. OSA è la forma che la maggior parte delle librerie chiama Damerau–Levenshtein per la correzione dei refusi; vieta di applicare due trasposizioni sovrapposte sulla stessa sottostringa, mantenendo la metrica semplice e O(n·m) in tempo e spazio. Le stringhe vuote sono valide: la distanza dalla stringa vuota a qualsiasi stringa è la lunghezza di quella stringa, e la distanza tra due vuote è zero.
Stringhe identiche danno sempre distanza zero e similarità uno, anche dopo il folding opzionale del maiuscolo.
Dove questa distanza si rivela utile
Gli strumenti di ricerca prodotto e inventario usano la distanza di edit con trasposizioni per ordinare SKU e marchi quasi coincidenti prima di ricorrere a modelli semantici più lenti. Le pipeline CRM e di deduplicazione segnalano righe candidate a duplicato quando la distanza è al massimo uno o due e la similarità supera una soglia fissa, catturando lettere scambiate che l’uguaglianza pura o anche la Levenshtein semplice sottovaluterebbero.
Le demo di correttore ortografico e gli esercizi in aula necessitano di un oracolo deterministico che segni form contro from come distanza uno e addebiti una tariffa fissa trasparente anziché un costo a token. L’input non valido non consuma saldo. Abbini la distanza intera alla propria politica di soglia—accetti distanza zero solo per chiavi esatte, distanza uno per correzione aggressiva dei refusi, similarità sopra 0.8 per indizi di unione soft—e ottenga un blocco verificabile di abbinamento fuzzy senza erigere un motore di ricerca completo né uno stack NLP proprio.
Casi d'uso
Abbinamento prodotti e SKU tollerante ai refusi
Ordini i candidati del catalogo quando la stringa del cliente o del fornitore è a uno scambio o una modifica dallo SKU vero, senza chiamare un modello di embeddings.
Deduplicazione CRM e record
Segnali nomi e indirizzi quasi duplicati dove sono comuni scambi di lettere adiacenti, usando una soglia fissa di distanza o similarità.
Compiti e demo di algoritmi
Mostri agli studenti il programma dinamico OSA su kitten/sitting e ab/ba così il costo di trasposizione resta visibile accanto a Levenshtein semplice.
Domande frequenti
Cos’è la distanza di Damerau–Levenshtein?
È il numero minimo di inserimenti, cancellazioni, sostituzioni e trasposizioni di caratteri adiacenti necessari per trasformare una stringa in un’altra.
In che modo differisce dalla distanza di Levenshtein ordinaria?
La Levenshtein semplice non ha operazione di trasposizione, quindi vicini scambiati costano due sostituzioni. Damerau–Levenshtein (OSA) conta uno scambio adiacente come una modifica, più adatto ai refusi reali da tastiera.
Le stringhe vuote sono consentite?
Sì. La distanza da vuota a non vuota è la lunghezza di quella stringa; due vuote hanno distanza zero e similarità uno.
Che cosa indica il punteggio di somiglianza?
È 1 meno la distanza divisa per la lunghezza del testo più lungo. Kitten e sitting distano 3 modifiche e la parola più lunga ha 7 lettere, quindi la somiglianza è circa 0,571428571429. Due testi identici danno 1.
Distingue le maiuscole dalle minuscole?
Sì, per impostazione predefinita Kitten e kitten distano una modifica. Se disattiva questa distinzione, entrambi i testi passano in minuscolo prima del calcolo e le differenze di maiuscole non contano più.
Strumenti correlati
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"text_a": "kitten",
"text_b": "sitting"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.damerau_levenshtein",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |
Note tecniche
Il percorso gratuito del browser e l’API prepagata condividono lo stesso modulo, così controlli dei compiti, soglie di abbinamento fuzzy e pipeline di produzione non divergono mai su quanto due etichette siano vicine abbastanza da unire.
Cosa misura Damerau–Levenshtein e come differisce da Levenshtein semplice
Questo endpoint usa la ricorrenza Optimal String Alignment (OSA): una matrice di programmazione dinamica dove la cella (i, j) è il minimo tra cancellare, inserire, sostituire o far coincidere e—quando gli ultimi due caratteri di ciascun prefisso formano una coppia incrociata—trasporre dalla cella (i−2, j−2).
Contratto di input, campi di risposta e regole di validazione
Ogni stringa è limitata a cinquemila caratteri affinché la tabella quadratica resti limitata sul percorso gratuito al bordo. Una breve stringa formula documenta la ricorrenza OSA per la visualizzazione accanto alla risposta. La validazione fallita non viene addebitata. Mantenga input abbastanza corti per l’uso interattivo, fissi la distanza intera e la similarità arrotondata nei test, e ottenga punteggi fuzzy riproducibili senza modello linguistico né dizionario esterno. Invii un corpo JSON con due campi stringa obbligatori: text_a (alias a, string1, s1, left, first, source) e text_b (alias b, string2, s2, right, second, target). Entrambi possono essere vuoti; valori mancanti o non stringa falliscono con invalid_input indicando il campo. L’opzionale case_sensitive vale true per impostazione predefinita così Kitten e kitten possono differire; lo imposti a false per portare entrambi i lati in minuscolo prima di riempire la tabella. In caso di successo il corpo ripete text_a, text_b e case_sensitive; riporta distance come intero non negativo; riporta len_a, len_b e max_len delle stringhe normalizzate; riporta similarity come (max_len − distance) / max_len arrotondato a dodici decimali (oppure uno quando entrambe le lunghezze sono zero); e imposta identical a true esattamente quando distance è zero. Esempio: text_a kitten e text_b sitting danno distance tre, lunghezze sei e sette, max_len sette, similarity circa 0.571 e identical false. Esempio: text_a ab e text_b ba danno distance uno per lo scambio adiacente.
Dove un’API Damerau–Levenshtein dimostra il proprio valore
Poiché l’implementazione è parse pura di livello A, ogni chiamata riuscita costa il prezzo base pubblicato $0.002 senza token di modello né rete in uscita.
Domande tecniche
Il confronto distingue maiuscole e minuscole?
Per impostazione predefinita sì (case_sensitive true). Imposti case_sensitive a false per portare entrambe le stringhe in minuscolo prima del calcolo, così Kitten e kitten coincidono.
Quanto costa il calcolatore Damerau–Levenshtein?
Lo strumento nel browser è gratuito. Le richieste API usano il saldo prepagato KIT a $0.002 per chiamata riuscita; l’input non valido non viene addebitato.