Como criar uma biblioteca para unificar nomes em uma coluna de strings não uniformes

Identificando o problema: variações para a mesma string

Vincent Belz
Loft
4 min readApr 25, 2022

--

Primeiramente, uma string trata-se de uma sequência de caracteres, geralmente utilizada para representar palavras, frases ou textos de um programa. E na programação, ao lidar com colunas de string em um dataframe de pandas, é comum encontrar erros de digitação, gerando assim muitas variações para a mesma string (nome).

Eu encontrei esse problema olhando para a coluna de bairros para o conjunto de dados do IPTU de São Paulo (Para saber mais como baixar esses dados, clique aqui). Abaixo um exemplo de que tipo de variação de nomes houveram:

Isso é problemático, pois precisaríamos apenas de uma maneira de escrever o nome do bairro para cada string (entidade). Vamos ver como podemos resolver esse problema.

Entendendo a metodologia utilizada para resolver o problema

Como temos muitos nomes escritos de formas muito diferentes, o primeiro passo seria reduzir a lista de nomes tendo apenas os nomes mais prováveis. Para isso, podemos observar o número de ocorrências para cada nome exclusivo e manter apenas as que aparecem com mais frequência.

No meu caso, meu conjunto de dados tinha mais de 20 milhões de linhas e cada bairro poderia conter vários milhares de apartamentos. Eu filtrei nomes de bairros mais prováveis ​​como tendo mais de 5.000 ocorrências. Se seu conjunto de dados for menor ou tiver menor número de ocorrências por entidade única, você deve adaptar esse processo de filtro. Essa parte de filtragem não é obrigatória, mas ajuda a reduzir o número de candidatos a nome verdadeiro.

A partir desta lista de nomes exclusivos, executo uma desduplicação de nomes semelhantes com base na distância de Levenshtein usando o pacote fuzzywuzzy:

Aqui a lista com o nome unique_bairro agora está livre de qualquer duplicação de nomes. Depois disso, obtemos uma lista reduzida de nomes de bairros, que seriam nossos candidatos a serem os nomes finais de cada bairro. Vamos chamá-lo de lista de bairros.

Então, para todos os nomes exclusivos em nossa coluna de strings, usamos o pacote fuzzywuzzy para obter uma correspondência na lista de bairros e sua pontuação (onde 100 significa correspondência perfeita). Aqui está um exemplo do processo de correspondência para uma palavra:

Podemos ver que foi encontrado com sucesso uma boa correspondência (“SANTA EFIGENIA”) com uma pontuação de 96. Uma pontuação de 100 significa uma correspondência perfeita e geralmente pontuações acima de 80 são boas candidatas.

Vamos explicar um pouco mais sobre como funciona o processo de correspondência com o pacote fuzzywuzzy:

  • Uma função de razão calcula a razão de similaridade de distância de Levenshtein padrão entre duas sequências.
  • A lógica “parcial ideal” é usada: se a string curta tiver um comprimento k e a string mais longa tiver o comprimento m, então o algoritmo busca a pontuação da substring de comprimento k melhor correspondente.
  • As strings são tokenizadas e pré-processadas, transformando-as em minúsculas e eliminando a pontuação.
  • Os tokens de string são classificados em ordem alfabética e, em seguida, unidos. Em seguida, aplica-se a função razão para obter a porcentagem de similaridade.

Agora que vimos o processo para uma palavra, obteremos as correspondências para todos os nomes exclusivos na coluna ‘bairros’. A partir disso, criamos uma tabela com a melhor correspondência e sua pontuação para todos os nomes exclusivos. Aqui está um exemplo de como fica o resultado:

Em seguida, filtramos as pontuações acima de 80 para atribuir uma boa correspondência para todos os nomes exclusivos. Não atribuímos nenhuma correspondência quando a pontuação é inferior a 80.

Podemos usar essa correspondência de tabela para que todos os nomes exclusivos sejam mesclados de volta à tabela de vizinhança original. Agora temos a coluna de vizinhança com nomes unificados (coluna ‘best_match’).

Uma biblioteca para usar todo o processo

Unificar nomes em uma coluna de string não uniformes pode ser muito útil e pode ser aplicado a muitos tipos de colunas de string. Por isso, decidimos transformar o processo em uma biblioteca simples, disponibilizando para todos. Para instalar a biblioteca, basta digitar no terminal:

pip install unifyname

Aqui está um exemplo de como aplicamos a biblioteca em um conjunto de dados de exemplo:

Como podemos ver, a biblioteca conseguiu unificar nomes para “SANTA EFIGENIA” com sucesso! Espero que a dica seja útil para você também e que já esteja presente no seu próximo projeto.

Por fim, se você deseja fazer parte de um time que joga junto e é focado em melhoria contínua, confira nossas vagas abertas: loft.vc/vagas e #VemPraLoft

--

--