Skip to content

Instantly share code, notes, and snippets.

@gpupo
Last active April 29, 2024 17:50
Show Gist options
  • Save gpupo/15d7634f81ced00d26423841bac9efc3 to your computer and use it in GitHub Desktop.
Save gpupo/15d7634f81ced00d26423841bac9efc3 to your computer and use it in GitHub Desktop.
Uso de distância de Levenshtein para calcular a similaridade entre as categorias entre dois arquivos CSV
import csv
import Levenshtein
"""
O script tem como objetivo encontrar a categoria mais similar
para cada categoria presente no arquivo "categorias.csv" com base
nas categorias do arquivo "categorias_native.csv".
Ele utiliza a distância de Levenshtein para calcular
a similaridade entre as categorias.
"""
def encontrar_categoria_similar(categoria, categorias_native):
melhor_similaridade = 0
melhor_categoria = None
for linha in categorias_native:
similiaridade = Levenshtein.ratio(categoria, linha[2])
if similiaridade > melhor_similaridade:
melhor_similaridade = similiaridade
melhor_categoria = linha
return melhor_categoria
"""
O script começa carregando as categorias do arquivo "categorias_native.csv"
em uma lista chamada categorias_native.
Em seguida, abre o arquivo "categorias.csv" para leitura e
o arquivo de saída "resultado.csv" para escrita.
"""
arquivo_categorias_native = 'categorias_native.csv'
arquivo_categorias_foreigner = 'data/categorias.csv'
arquivo_saida = 'resultado.csv'
# Carregar as categorias do arquivo categorias_native.csv
categorias_native = []
with open(arquivo_categorias_native, 'r') as arquivo_native:
leitor_native = csv.reader(arquivo_native)
next(leitor_native) # Ignorar o cabeçalho
for linha in leitor_native:
categorias_native.append(linha)
"""
O cabeçalho do arquivo de saída é composto pelo cabeçalho original
do arquivo "categorias.csv" acrescido das colunas "Categoria Predict ID" e "Categoria Predict Breadcrumb".
Essas colunas armazenarão o ID e o breadcrumb da categoria mais similar encontrada.
Abrir o arquivo de categorias.csv para leitura e o arquivo de saída para escrita
"""
with open(arquivo_categorias_foreigner, 'r') as arquivo_categorias_foreigner, open(arquivo_saida, 'w', newline='') as arquivo_saida:
leitor_categorias = csv.reader(arquivo_categorias_foreigner)
escritor_saida = csv.writer(arquivo_saida)
cabecalho_saida = next(leitor_categorias) + ['Categoria Predict ID', 'Categoria Predict Breadcrumb']
escritor_saida.writerow(cabecalho_saida)
"""
O script itera pelas linhas do arquivo "categorias.csv".
Para cada linha, chama a função encontrar_categoria_similar passando a categoria como argumento.
A função retorna a categoria mais similar encontrada, juntamente com seu ID e breadcrumb correspondentes.
A linha de saída é composta pelos valores da linha original do arquivo "categorias.csv"
acrescidos dos valores do ID e breadcrumb da categoria mais similar.
Essa linha é escrita no arquivo de saída.
Após processar todas as linhas do arquivo "categorias.csv", o script exibe uma mensagem
indicando a conclusão do processo e o arquivo "resultado.csv" onde os resultados foram gravados.
A função encontrar_categoria_similar recebe uma categoria como entrada e percorre todas
as linhas das categorias presentes em "categorias_native.csv".
Para cada linha, é calculada a similaridade usando a função Levenshtein.ratio da biblioteca Levenshtein.
A categoria com a maior similaridade é armazenada juntamente com o valor de similaridade correspondente.
"""
for linha in leitor_categorias:
categoria = linha[0]
categoria_correspondente = encontrar_categoria_similar(categoria, categorias_native)
linha_saida = linha + [categoria_correspondente[1], categoria_correspondente[2]]
escritor_saida.writerow(linha_saida)
print("Processo concluído. Resultado gravado em", arquivo_saida)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment