FreeToGenerate.com

Sete respostas para uma pergunta, porque não são a mesma pergunta.

Duas cadeias, todas as medidas

MedidaPontuaçãoEdições
Levenshtein0,6672
Damerau-Levenshtein0,8331
Jaro0,944
Jaro-Winkler0,961
Dice0,400
Jaccard0,250
Subsequência comum mais longa0,833

Edições é a distância bruta antes de virar pontuação: quantas mudanças de um caractere são necessárias. As outras medidas não contam edições de forma alguma.

0,711

A diferença entre a maior e a menor pontuação é justamente o ponto. São perguntas diferentes, não jeitos diferentes de dizer a mesma resposta.

Qual é a correspondência mais próxima?

MedidaEscolha delaPontuação
Levenshteinrelieve0,857
Damerau-Levenshteinreceive0,857
Jaroreceive0,952
Jaro-Winklerreceive0,967
Dicerelieve0,667
Jaccardrelieve0,500
Subsequência comum mais longareceive0,857

2 vencedores distintos entre as medidas, de uma única lista.

Levenshtein
O menor número de inserções, remoções e substituições que transforma uma cadeia na outra, dividido pela mais longa.
Damerau-Levenshtein
O mesmo, mais trocar dois caracteres vizinhos como uma única edição. É por isso que um corretor trata hte como a uma edição de the, e não a duas.
Jaro
Caracteres coincidentes dentro de uma janela de metade da cadeia mais longa, penalizado por quantas dessas coincidências estão fora de ordem.
Jaro-Winkler
Jaro com um bônus por coincidir nos primeiros caracteres, porque os nomes para os quais foi criado são escritos errado no fim muito mais do que no começo.
Dice
O dobro dos pares de letras vizinhas compartilhados sobre o total de pares. A ordem dentro do par importa; a posição na cadeia não.
Jaccard
Os pares de letras vizinhas compartilhados sobre a união deles. Ordena igual ao Dice, mas sempre pontua mais baixo.
Subsequência comum mais longa
A maior sequência de caracteres que aparece nas duas cadeias na mesma ordem, ainda que não vizinhos, sobre a cadeia mais longa.

Tudo é calculado no seu navegador sobre pontos de código, então um emoji conta como um caractere e não dois. Jaro e Jaro-Winkler reproduzem os números publicados junto às definições deles.

Também disponível em: English · Español · Français · العربية

Similaridade de textos: sete medidas lado a lado

Todas as medidas comuns de similaridade entre cadeias calculadas de uma vez, para você ver qual o seu problema realmente pede.

O que é similaridade de textos?

Similaridade de textos é um número dizendo o quanto duas cadeias se parecem, normalmente escalado de modo que 1 é idêntico e 0 não tem nada em comum. É o que está por baixo da busca aproximada, da limpeza de duplicatas numa lista de clientes, da caça a um erro de digitação num código de produto e do casamento entre um nome digitado por uma pessoa e outro guardado num banco de dados.

O problema é que não existe uma definição única. Levenshtein conta quantas edições de um caractere separam as duas. Jaro conta caracteres coincidentes e o quanto estão fora de ordem. Dice e Jaccard ignoram a posição por completo e comparam conjuntos de pares de letras vizinhas. A subsequência comum mais longa pergunta quanto de uma cadeia sobrevive dentro da outra em ordem. São perguntas diferentes e dão respostas diferentes.

Esta página calcula sete de uma vez em vez de escolher uma por você, porque escolher uma é a decisão de verdade e quase sempre é tomada sem querer.

Como usar

  1. Ponha duas cadeias nas caixas de cima. Todas as medidas pontuam o par na hora, com a contagem bruta de edições ao lado das duas que se baseiam em distância.
  2. Depois experimente o painel de ordenação. Dê a ele algo para procurar e uma lista de candidatas, uma por linha. Cada medida ordena a lista por conta própria e informa a vencedora dela.
  3. Veja as vencedoras discordarem. A linha abaixo daquela tabela conta quantas respostas distintas saíram de uma única lista. Quando diz mais de uma, a medida que você teria escolhido estava fazendo trabalho de verdade.

O quanto discordam, medido

Não é preocupação teórica. Tomando o código-fonte deste site como corpus e sorteando trios de identificadores em camelCase, Levenshtein e Jaro-Winkler colocam as mesmas duas candidatas em ordem diferente em 27,7% das vezes ao longo de 3.479 pares. Contra a medida Ratcliff/Obershelp que o difflib do Python usa, Levenshtein discorda em 25,5%.

O efeito é pior no caso que as pessoas realmente constroem: escolher a correspondência mais próxima de uma lista. Escolhendo de um conjunto de 400 candidatas, Levenshtein e Jaro-Winkler apontaram vencedoras diferentes em 62% das consultas. Esse número depende do tamanho do conjunto, então trate os 27,7% como a manchete honesta e este como demonstração da direção em que a coisa se move.

O exemplo carregado por padrão é o caso clássico. Procure o erro recieve entre receive, relieve, reprieve, retrieve e recipe. O Levenshtein puro prefere relieve, porque está a uma substituição enquanto receive está a duas edições — as letras foram trocadas de lugar, e o Levenshtein não tem noção de troca. O Damerau-Levenshtein, que conta a troca de dois caracteres vizinhos como uma só edição, pontua receive e relieve igual em 0,857 e escolhe a primeira das duas. O Jaro-Winkler põe receive estritamente no topo com 0,967. Três comportamentos de uma mesma lista, e só um deles entrega a palavra que você quis dizer.

Qual você deveria usar?

Para erros de digitação humanos, o Damerau-Levenshtein costuma ser um padrão melhor que o Levenshtein puro, porque trocar duas letras é um dos enganos mais comuns e o Levenshtein cobra em dobro por ele. Para nomes, o Jaro-Winkler foi criado exatamente para esse serviço no censo dos Estados Unidos, e o bônus de prefixo dele reflete que as pessoas acertam o começo de um nome muito mais do que o fim.

Para textos mais longos em que palavras inteiras mudam de lugar, as medidas de conjunto se saem melhor. Dice e Jaccard comparam sacos de pares de letras vizinhas, então reordenar importa bem menos para elas, e ordenam igual entre si — o Jaccard apenas pontua sempre mais baixo para o mesmo par, o que surpreende quem compara limiares copiados de fontes diferentes.

A única generalização honesta é que um limiar não é transferível. Um corte de 0,8 significa algo bem diferente sob Jaccard e sob Jaro-Winkler, e para o par MARTHA e MARHTA carregado acima as pontuações vão de 0,250 a 0,961 conforme a medida que você consultar. Qualquer limiar herdado de um post de blog vem colado a uma medida, e a medida quase nunca é declarada.

O que esta página não consegue dizer

Nenhuma dessas medidas entende significado. Gato e felino pontuam quase zero; colour e color pontuam alto. Se você precisa saber que duas frases dizem a mesma coisa com outras palavras, a similaridade entre cadeias é a ferramenta errada e nenhum limiar vai salvá-la.

Elas também são baseadas em caracteres, e caractere aqui significa ponto de código, não o que você chamaria de letra. Isso corrige o bug comum de um emoji contar como dois caracteres e dois emojis diferentes saírem a duas edições, mas para antes dos agrupamentos de grafemas: uma bandeira ou um emoji com tom de pele continua sendo vários pontos de código, e as definições clássicas dessas medidas não tratam disso.

Por fim, o painel de ordenação resolve empates pela ordem de entrada. Quando duas candidatas pontuam igual, vence a que estiver mais acima na sua lista, o que é uma propriedade desta ferramenta e não da medida. As pontuações aparecem para você ver quando isso aconteceu.

Por que é grátis?

As sete medidas são algumas dezenas de linhas de aritmética que rodam no seu navegador. Nada do que você digita é enviado, nada é registrado e não há conta a criar.

Sem cadastro, sem limites e sem marca d'água em nada que você copiar.