Distância Damerau–Levenshtein
form e from estão a 1 edição, porque trocar duas letras vizinhas conta como um só passo, enquanto kitten e sitting precisam de 3. Você também recebe uma similaridade de 0 a 1, útil para achar erros de digitação e nomes quase duplicados. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Texto a
- kitten
- Texto b
- sitting
- Distância
- 3
- Len a
- 6
- Len b
- 7
- Comprimento máximo
- 7
A distância de Damerau–Levenshtein é uma métrica clássica de edição que conta quantas operações de um único caractere transformam uma cadeia em outra quando as operações permitidas são inserção, exclusão, substituição e transposição de dois caracteres adjacentes. Essa última operação é o que a separa da distância de Levenshtein simples e a torna especialmente útil para typos reais: as pessoas costumam trocar duas teclas vizinhas (form versus from, teh versus the) e isso deve custar um passo, não duas substituições. Esta capacidade implementa a forma Optimal String Alignment da distância com uma tabela pura de programação dinâmica, de modo que cada par de entradas produz o mesmo inteiro em qualquer runtime. Você envia dois textos e um indicador opcional de sensibilidade a maiúsculas; recebe a distância, ambos os comprimentos, uma similaridade normalizada entre zero e um, e um booleano identical.
O que Damerau–Levenshtein mede e como difere da Levenshtein simples
A distância de edição pergunta quantas mudanças unitárias são necessárias para reescrever uma cadeia de origem como uma cadeia de destino. A Levenshtein clássica permite três operações unitárias: inserir um caractere, excluir um caractere ou substituir um caractere por outro. Cada uma custa um.
A extensão de Damerau adiciona uma quarta operação: trocar dois caracteres adjacentes por um único custo unitário. Essa extensão corresponde a como as pessoas realmente digitam errado no teclado. Por exemplo, as cadeias ab e ba diferem por uma transposição adjacente sob Damerau–Levenshtein e por duas substituições sob Levenshtein simples.
Kitten versus sitting ainda custa três (como no exemplo de livro-texto de Levenshtein) porque o caminho mais barato usa substituições e uma inserção, não uma única troca. OSA é a forma que a maioria das bibliotecas rotula como Damerau–Levenshtein para correção de typos; proíbe aplicar duas transposições sobrepostas na mesma subcadeia, o que mantém a métrica simples e O(n·m) em tempo e espaço. Cadeias vazias são válidas: a distância da vazia a qualquer cadeia é o comprimento dessa cadeia, e a distância entre duas vazias é zero.
Cadeias idênticas sempre produzem distância zero e similaridade um, inclusive após o folding opcional de maiúsculas.
Onde essa distância faz diferença
Ferramentas de busca de produtos e inventário usam distância de edição com transposições para ranquear SKUs e marcas quase coincidentes antes de recorrer a modelos semânticos mais lentos. Pipelines de CRM e deduplicação marcam linhas candidatas a duplicata quando a distância é no máximo um ou dois e a similaridade fica acima de um limiar fixo, capturando letras trocadas que a igualdade simples ou mesmo a Levenshtein pura subestimariam.
Demos de corretor ortográfico e exercícios de sala precisam de um oráculo determinístico que marque form versus from como distância um e cobre uma taxa fixa transparente em vez de custo por tokens. Entrada inválida não consome saldo.
Combine a distância inteira com a sua própria política de limiar—aceite distância zero só para chaves exatas, distância um para correção agressiva de typos, similaridade acima de 0.8 para dicas de mescla suave—e você obtém um bloco auditável de correspondência difusa sem montar um motor de busca completo nem um stack de PLN próprio.
Casos de uso
Correspondência de produtos e SKU tolerante a typos
Ranqueie candidatos do catálogo quando a string do comprador ou fornecedor estiver a uma troca ou uma edição do SKU verdadeiro, sem chamar um modelo de embeddings.
Deduplicação de CRM e registros
Sinalize nomes e endereços quase duplicados em que trocas de letras adjacentes são comuns, usando um limiar fixo de distância ou similaridade.
Lições de casa e demos de algoritmos
Mostre aos alunos o programa dinâmico OSA em kitten/sitting e ab/ba para que o custo de transposição fique visível ao lado da Levenshtein simples.
Perguntas frequentes
O que é a distância de Damerau–Levenshtein?
É o número mínimo de inserções, exclusões, substituições e transposições de caracteres adjacentes necessárias para transformar uma string em outra.
Como difere da distância de Levenshtein comum?
A Levenshtein simples não tem operação de transposição, então vizinhos trocados custam duas substituições. Damerau–Levenshtein (OSA) conta uma troca adjacente como uma edição, o que combina melhor com typos reais de teclado.
Strings vazias são permitidas?
Sim. A distância de vazia para não vazia é o comprimento dessa string; duas vazias têm distância zero e similaridade um.
O que significa a pontuação de similaridade?
É 1 menos a distância dividida pelo comprimento do texto mais longo. Kitten e sitting estão a 3 edições e a palavra maior tem 7 letras, então a similaridade fica em torno de 0,571428571429. Textos idênticos dão 1.
A ferramenta diferencia maiúsculas de minúsculas?
Sim, por padrão Kitten e kitten estão a uma edição. Se você desligar essa diferenciação, os dois textos viram minúsculas antes do cálculo e as diferenças de maiúsculas deixam de contar.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"text_a": "kitten",
"text_b": "sitting"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.damerau_levenshtein",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
O caminho gratuito do navegador e a API pré-paga compartilham o mesmo módulo, assim verificações de lição de casa, limiares de correspondência difusa e pipelines de produção nunca discordam sobre se dois rótulos estão próximos o bastante para mesclar.
O que Damerau–Levenshtein mede e como difere da Levenshtein simples
Este endpoint usa a recorrência Optimal String Alignment (OSA): uma matriz de programação dinâmica em que a célula (i, j) é o mínimo de excluir, inserir, substituir ou coincidir e—quando os dois últimos caracteres de cada prefixo formam um par cruzado—transpor a partir da célula (i−2, j−2).
Contrato de entrada, campos de resposta e regras de validação
Cada string é limitada a cinco mil caracteres para que a tabela quadrática permaneça limitada no caminho gratuito de borda. Uma string formula curta documenta a recorrência OSA para exibição ao lado da resposta. Validação falha não é cobrada. Mantenha entradas curtas o bastante para uso interativo, fixe a distância inteira e a similaridade arredondada nos testes, e você obtém pontuações difusas reproduzíveis sem modelo de linguagem nem dicionário externo. Envie um corpo JSON com dois campos de string obrigatórios: text_a (aliases a, string1, s1, left, first, source) e text_b (aliases b, string2, s2, right, second, target). Ambos podem estar vazios; valores ausentes ou que não sejam string falham com invalid_input nomeando o campo. O opcional case_sensitive tem padrão true para que Kitten e kitten possam diferir; defina-o como false para converter ambos os lados em minúsculas antes de preencher a tabela. Em sucesso o corpo ecoa text_a, text_b e case_sensitive; informa distance como inteiro não negativo; informa len_a, len_b e max_len das strings normalizadas; informa similarity como (max_len − distance) / max_len arredondado a doze decimais (ou um quando ambos os comprimentos são zero); e define identical como true exatamente quando distance é zero. Exemplo: text_a kitten e text_b sitting produzem distance três, comprimentos seis e sete, max_len sete, similarity cerca de 0.571 e identical false. Exemplo: text_a ab e text_b ba produzem distance um por causa da troca adjacente.
Onde uma API Damerau–Levenshtein justifica o investimento
Como a implementação é parse pura de nível A, cada chamada bem-sucedida custa o preço base publicado US$ 0,002 sem tokens de modelo e sem rede de saída.
Perguntas técnicas
A comparação diferencia maiúsculas de minúsculas?
Por padrão sim (case_sensitive true). Defina case_sensitive como false para converter ambas as strings em minúsculas antes de calcular a distância, para que Kitten e kitten coincidam.
Quanto custa a calculadora Damerau–Levenshtein?
A ferramenta do navegador é gratuita. Pedidos API usam saldo pré-pago KIT a US$ 0,002 por chamada bem-sucedida; entrada inválida não é cobrada.