Gist ID: 15d7634f81ced00d26423841bac9efc3

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)