| import gradio as gr |
| import pandas as pd |
| from sklearn.feature_extraction.text import TfidfVectorizer |
| from sklearn.metrics.pairwise import cosine_similarity |
|
|
| |
| 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() |
|
|
| |
| vectorizador = TfidfVectorizer() |
| X = vectorizador.fit_transform(observaciones) |
|
|
| |
| 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}" |
|
|
| |
| 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 |
|
|
| |
| 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() |
|
|