ArielMakaruk's picture
Create app.py
ff77082 verified
import gradio as gr
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# ▶ Cargar base original
base = pd.read_excel("Base de datos de observaciones.xlsx")
base = base.dropna(subset=["DESCRIPCION ITEM", "Descripcion Agrupada"])
observaciones = base["DESCRIPCION ITEM"].astype(str).str.lower().str.strip()
categorias = base["Descripcion Agrupada"].astype(str).str.strip()
# ▶ Vectorizar
vectorizador = TfidfVectorizer()
X = vectorizador.fit_transform(observaciones)
# ▶ Guardar en CSV externo (se sobreescribe o acumula)
def guardar_observacion(frase, categoria_final):
nueva = pd.DataFrame([{"Observación Nueva": frase, "Categoria Validada": categoria_final}])
try:
existente = pd.read_csv("entrenamiento.csv")
actualizado = pd.concat([existente, nueva], ignore_index=True)
except FileNotFoundError:
actualizado = nueva
actualizado.to_csv("entrenamiento.csv", index=False)
return f"✅ Guardado: '{frase}' → {categoria_final}"
# ▶ Clasificación automática
def clasificar(frase):
frase_proc = frase.lower().strip()
vec = vectorizador.transform([frase_proc])
simil = cosine_similarity(vec, X).flatten()
top_idx = simil.argmax()
sugerida = categorias.iloc[top_idx]
return sugerida
# ▶ Interfaz Gradio
with gr.Blocks() as demo:
gr.Markdown("## 🚆 Clasificador y Entrenador de Observaciones")
gr.Markdown("1. Ingresá una observación nueva.\n2. El sistema sugiere una categoría.\n3. Podés corregirla y guardar la validación.")
entrada = gr.Textbox(label="✏️ Nueva observación")
sugerencia = gr.Textbox(label="📂 Categoría sugerida (editable)")
resultado = gr.Textbox(label="💾 Confirmación")
entrada.change(fn=clasificar, inputs=entrada, outputs=sugerencia)
gr.Button("✅ Guardar").click(fn=guardar_observacion, inputs=[entrada, sugerencia], outputs=resultado)
demo.launch()