Encontrando registros iguais com nomes diferentes: como usei a Distância de Levenshtein para comparar duas bases de dados
1. Introdução
Em qualquer operação que envolva integração de dados, um problema recorrente é a duplicidade causada por grafias diferentes para a mesma entidade.
Imagine que você tenha duas bases de clientes: uma do sistema de vendas e outra do CRM. Ao tentar cruzar os registros, percebe que o mesmo cliente aparece escrito como "Maria Aparecida da Silva" em uma base e "Maria Ap. Silva" em outra.
Essa diferença impede que ferramentas de junção exata (JOIN) no SQL ou no Excel reconheçam que se trata da mesma pessoa.
Foi exatamente essa situação que encontrei em um projeto recente. A solução veio com o uso de um algoritmo clássico de ciência da computação: a Distância de Levenshtein.
2. O que é a Distância de Levenshtein
A Distância de Levenshtein é uma métrica que mede o número mínimo de operações necessárias para transformar uma string em outra.
As operações possíveis são:
- Inserção (adicionar um caractere)
- Remoção (excluir um caractere)
- Substituição (trocar um caractere por outro)
Exemplo simples:
- Transformar
"casa"em"caso"requer 1 substituição (a → o). - Transformar
"kitten"em"sitting"requer 3 operações:kitten→sitten(substituiçãok → s)sitten→sittin(substituiçãoe → i)sittin→sitting(inserçãog)
Quanto menor a distância, mais parecidas as strings.
3. O caso prático
Contexto
- Base A: 15.000 registros de clientes vindos do ERP.
- Base B: 14.500 registros do CRM.
- Coluna comparada: Nome/Razão Social.
Problemas encontrados:
- Abreviações: “José Carlos Pereira” vs “José C. Pereira”
- Erros de digitação: “Agropecuaria Boa Esperanca” vs “Agropec Boa Esperança”
- Diferença de acentos, maiúsculas/minúsculas e pontuação.
4. Preparando os dados
Antes de aplicar o algoritmo, foi necessário normalizar os textos:
- Converter para minúsculas
- Remover acentos
- Remover caracteres especiais
- Reduzir múltiplos espaços
Código de exemplo (usando Python e rapidfuzz):
from rapidfuzz import process, fuzz
import pandas as pd
from unidecode import unidecode
def normalizar(s):
return unidecode(str(s).lower().strip())
baseA = pd.read_excel("baseA.xlsx")
baseB = pd.read_excel("baseB.xlsx")
resultados = []
for nome in baseA["nome"]:
match = process.extractOne(
normalizar(nome),
baseB["nome"].map(normalizar),
scorer=fuzz.WRatio
)
if match:
nome_b = baseB.iloc[match[2]]["nome"]
score = match[1]
resultados.append((nome, nome_b, score))
df_result = pd.DataFrame(resultados, columns=["Nome_BaseA", "Nome_BaseB", "Similaridade"])
df_result.to_csv("resultado.csv", index=False, encoding="utf-8-sig")
5. Resultados
Registros analisados: 15.000
Matches automáticos (similaridade ≥ 90%): 13.200 (88%)
Casos para revisão manual (80–89%): 1.050 (7%)
Não encontrados: 750 (5%)
Exemplos de correspondências detectadas:
Nome na Base A Nome na Base B Similaridade
Maria Aparecida da Silva Maria Ap. Silva 92%
João Batista de Souza J. B. Souza 90%
Agropecuária Boa Esperança Ltda Agropec Boa Esperanca LTDA 96%
6. Impacto no negócio
Eliminação de duplicidades e inconsistências.
Relatórios mais precisos e confiáveis.
Integração mais fluída entre ERP e CRM.
Redução significativa do trabalho manual de conferência.
7. Visualizações
Exemplo de matriz de cálculo da distância de Levenshtein:
Distribuição das similaridades encontradas no case:
8. Lições aprendidas
Pré-processamento é essencial — a qualidade do match depende muito de como os dados são limpos.
Defina um limiar — no meu caso, 90% foi um bom ponto de corte para considerar registros iguais.
Revise casos limítrofes — registros com 80–89% de similaridade merecem inspeção manual.
Documente a metodologia — isso facilita replicar o processo futuramente.
9. Conclusão
A Distância de Levenshtein é um algoritmo simples, mas extremamente útil em projetos de integração e limpeza de dados.
Quando combinada com boas práticas de pré-processamento e bibliotecas como rapidfuzz, ela se torna uma ferramenta poderosa para identificar registros equivalentes mesmo com grafias diferentes.
No meu caso, a aplicação dessa técnica resultou em bases unificadas, menos retrabalho e maior confiabilidade nas análises — algo essencial para qualquer empresa que dependa de dados precisos para tomar decisões.