edgamer's picture
Update app.py
1e61e4a
#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()