File size: 1,991 Bytes
ff77082
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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()