Last active
April 29, 2024 17:50
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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