#https://www.analyticsvidhya.com/blog/2021/04/create-interface-for-your-machine-learning-models-using-gradio-python-library/ import re import string import numpy as np import gradio as gr import pandas as pd from gensim import models import gensim.corpora as corpora from gensim.models import LdaModel from gensim.models import Word2Vec from gensim.corpora import Dictionary from gensim.test.utils import common_texts from gensim.matutils import jensen_shannon lista_exclusiones = [] with open(r'datos/lista_exclusiones.txt', 'r') as lta: for linea in lta: x = linea[:-1] lista_exclusiones.append(x) df = pd.read_csv('datos/df_general_entrenamiento_v2.csv', index_col= 0) lista_estados = [e for e in df.groupby(by= 'Entidad').groups] corpus = corpora.MmCorpus('modelo/corpus_gensim.mm') diccionario = Dictionary.load_from_text('modelo/diccionario') lda_gensim = LdaModel.load('modelo/modelo_gensim_v2.model') def remover_palabras_breves(texto): nuevo_texto = re.sub(r'\b[a-zA-Z]{1}\b', '', texto) nuevo_texto = re.sub(r'\b[a-zA-Z]{2}\b', '', nuevo_texto) nuevo_texto = re.sub(r'\b[a-zA-Z]{3}\b', '', nuevo_texto) nuevo_texto = re.sub(r'\s+', ' ', nuevo_texto) return nuevo_texto def remover_exclusiones(texto): return " ".join([palabra for palabra in str(texto).split() if palabra not in lista_exclusiones]) def remover_emojis(cadena): patron_emoji = re.compile("[" u"\U0001F600-\U0001F64F" # emoticones u"\U0001F300-\U0001F5FF" # símbolos y pictogramas u"\U0001F680-\U0001F6FF" # transporte símbolos de mapas u"\U0001F1E0-\U0001F1FF" # banderas (iOS) u"\U00002500-\U00002BEF" # caracteres chinos u"\U00002702-\U000027B0" u"\U00002702-\U000027B0" u"\U000024C2-\U0001F251" u"\U0001f926-\U0001f937" u"\U00010000-\U0010ffff" u"\u2640-\u2642" u"\u2600-\u2B55" u"\u200d" u"\u23cf" u"\u23e9" u"\u231a" u"\ufe0f" # dingbats (¿?) u"\u3030" "]+", flags= re.UNICODE) return patron_emoji.sub(r'', cadena) def procesamiento(texto): texto = re.sub(r'http\S+', '', texto) texto = texto.replace('\d+', '') texto = remover_exclusiones(texto) texto = remover_emojis(texto) texto = texto.lower() texto = remover_palabras_breves(texto) texto = re.sub('[%s]' % re.escape(string.punctuation), '' , texto) texto = texto.strip() texto = re.sub(r'\s+', ' ', texto) lista = list(texto.split()) bow = diccionario.doc2bow(lista) distribucion = lda_gensim.get_document_topics(bow= bow, minimum_probability= 0) return distribucion def calcular_similitudes_docs(doc_uno, doc_dos): return jensen_shannon(doc_uno, doc_dos) def recomendacion(texto: str, entidad: str, numero_resultados: int = 1000) -> dict: distribucion = procesamiento(texto= texto) distancias = [calcular_similitudes_docs(distribucion, lda_gensim[texto]) for texto in corpus] similares = np.argsort(distancias) lista_nombres = [] lista_espacios = [] lista_municipios = [] lista_enlaces_sic = [] diccionario = {} for i in range(0, numero_resultados): if df.iloc[int(similares[i])]['Entidad'] == entidad: nombre = df.iloc[int(similares[i])]["Nombre"] tipo = df.iloc[int(similares[i])]["Tipo de espacio/patrimonio"] municipio = df.iloc[int(similares[i])]["Municipio"] enlace_sic = df.iloc[int(similares[i])]["Enlace SIC"] lista_nombres.append(nombre) lista_espacios.append(tipo) lista_municipios.append(municipio) lista_enlaces_sic.append(enlace_sic) diccionario["Nombre"] = lista_nombres diccionario["Tipo"] = lista_espacios diccionario["Municipio"] = lista_municipios diccionario["Enlace SIC"] = lista_enlaces_sic return diccionario #gr.Dropdown(choices= lista_estados) #interface = gr.Interface(fn= recomendacion, inputs= ["text", "text"], outputs= "json") interface = gr.Interface(fn= recomendacion, inputs= ["text", gr.Dropdown(choices= lista_estados)], outputs= "json") interface.launch()