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()