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
- 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.
- 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.
- 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.