Quem trabalha como engenheiro de dados tem o hábito de trabalhar com vários tipos de arquivos de diversas fontes, com isso, é normal receber arquivos com dados que deveriam ser iguais, porém não são. É comum, por exemplo, esperar que chegue no cabeçalho do arquivo uma coluna com o campo ‘nome_responsavel‘, porém por erro a coluna pode vir com o nome ‘nom_respons‘ ou o nome do usuário que deveria vir Vinicius Aquino do Vale venha como Vinícios Aqino Vale.

Quem trabalha no setor financeiro, já está acostumado com normas que definem como os dados devem ser catalogados com nomenclatura e padrões, então este tipo de situação é incomum, mas quem trabalha com saúde sabe que a palavra padrão, muitas vezes nem existe.

No meu caso, eu tenho dois problemas. O primeiro diz respeito ao nome da coluna, como cada cliente exporta manualmente suas planilhas, muitas vezes excel. É comum que o nome um dia venha nome_paciente, e no outro venha nome_beneficiario. Outro problema é o nome que muitas vezes vem diferente, seja por acentuação ou por erro de grafia.

Nosso processo precisa unificar todos os usuários para que não sejam duplicados, e muitas vezes precisamos analisar similaridade entre palavras. Neste sentido, precisamos avaliar as palavras para identificar se são similares.

As Métricas de String são técnicas criadas para identificação de similaridade entre palavras que rege um conjunto amplo de algoritmos. Existem diversos tipos, sendo os mais comuns: Levenshtein distance, Damerau–Levenshtein, Hamming distance, Jaro–Winkler distance, Jaccard similarity e TFIDF distance

Não entrarei no mérito de qual é o melhor, pois cada um tem suas características que devem ser levadas em conta para cada situação. No meu caso, o algoritmo JaroWinkler trouxe mais confiança no que eu precisava, e é o que adotamos.

Usando Python3.7 com a biblioteca jellyfish que contém todos os métodos citados acima, vamos ao exemplo.

Perceba que o algoritmo do jaro_winkler me trouxe uma similaridade de 89%, enquanto os outros algoritmos me deram uma distancia de 6, que representa a quantidade de modificações entre as palavras. Preciso, neste caso, sempre imaginar que quanto maior a palavra, mais será meu limite.

Vamos ao comparativo da coluna para ver se nos atende. Preciso que o sistema reconheça os nome das colunas mesmo que sofram leve modificações.

Veja que chegamos a 84% de chances similaridade entre as palavras. E agora, que já sabemos qual algoritmo usaremos apenas preciso criar um dicionário do DE, ou seja, o nome de todas as colunas que tenho dos clientes, e o PARA, ou seja, o nome do que se transformaram. Algo como um mini-dicionário de colunas.

Dessa forma, uma coluna ‘nome‘ representa meu campo ‘beneficiario‘, da mesma forma que a coluna resp_pessoa, também representa o campo ‘beneficiario‘. Assim é possível comparar erros de grafia e saber direcionar conforme meu dicionário.

O algoritmo jaro_winkler bateu 90% de similaridade entre ‘nom_respons‘ com ‘nome_responsavel‘ que representa o campo beneficiário. Dessa forma possa armazenar este novo nome, para aprimorar meu dicionário.

Este é o método que usamos para receber qualquer tipo de layout e saber trabalhar quais campos eles representam conforme analisamos o dicionário. Este procedimento ajuda em um processo que muitas vezes é manual e requer interferência humana.

Espero que tenham gostado.