import gradio as gr import spacy import os # Descargar modelo si no existe def descargar_modelo(): try: nlp = spacy.load("es_core_news_sm") print("✅ Modelo cargado correctamente") return nlp except OSError: print("📥 Descargando modelo de spaCy...") os.system("python -m spacy download es_core_news_sm") nlp = spacy.load("es_core_news_sm") print("✅ Modelo descargado y cargado") return nlp # Cargar modelo nlp = descargar_modelo() def analizar_completo(texto, opciones): if not texto.strip(): return "❌ Ingresa un texto para analizar." try: doc = nlp(texto) resultado = "" # Debug: ver qué opciones llegan print(f"Opciones recibidas: {opciones}, tipo: {type(opciones)}") # Si no hay opciones seleccionadas if not opciones: return "⚠️ Por favor selecciona al menos una opción de análisis." # Análisis de Tokens y POS Tagging if "tokens" in opciones: resultado += "📝 TOKENS Y GRAMÁTICA:\n" resultado += "-" * 40 + "\n" for token in doc: if not token.is_space: resultado += f"{token.text:15} {token.pos_:10} {spacy.explain(token.pos_)}\n" resultado += "\n" + "="*50 + "\n\n" # Análisis de Entidades Nombradas if "entidades" in opciones: resultado += "🏷️ ENTIDADES NOMBRADAS:\n" resultado += "-" * 40 + "\n" if doc.ents: for ent in doc.ents: resultado += f"{ent.text:20} {ent.label_:15} {spacy.explain(ent.label_)}\n" else: resultado += "No se encontraron entidades nombradas.\n" resultado += "\n" + "="*50 + "\n\n" # Análisis de Dependencias if "dependencias" in opciones: resultado += "🔗 ANÁLISIS DE DEPENDENCIAS:\n" resultado += "-" * 40 + "\n" for token in doc: if token.dep_ != "punct" and not token.is_space: resultado += f"{token.text:12} <-{token.dep_:12}- {token.head.text:12}\n" resultado += "\n" + "="*50 + "\n\n" # Lematización if "lemas" in opciones: resultado += "📖 LEMATIZACIÓN:\n" resultado += "-" * 40 + "\n" lemas_unicos = set() for token in doc: if not token.is_punct and not token.is_space and token.lemma_.strip(): lemas_unicos.add((token.lemma_, token.pos_)) for lemma, pos in sorted(lemas_unicos): resultado += f"{lemma:20} ({pos})\n" resultado += "\n" return resultado except Exception as e: return f"❌ Error al procesar el texto: {str(e)}" # Crear la interfaz Gradio with gr.Blocks(theme="soft", title="Analizador de Texto con spaCy") as demo: gr.Markdown(""" # 🔍 Analizador de Texto Avanzado con spaCy **Analiza texto en español usando procesamiento de lenguaje natural** """) with gr.Row(): with gr.Column(scale=1): gr.Markdown("### 📝 Entrada de Texto") texto_input = gr.Textbox( label="Escribe tu texto aquí", placeholder="Ej: El presidente de Microsoft visitó España la semana pasada...", lines=4, max_lines=6 ) gr.Markdown("### ⚙️ Opciones de Análisis") opciones = gr.CheckboxGroup( label="Selecciona qué análisis deseas realizar:", choices=[ "tokens", "entidades", "dependencias", "lemas" ], value=["tokens", "entidades"], info="Puedes seleccionar múltiples opciones" ) analizar_btn = gr.Button("🚀 Analizar Texto", variant="primary", size="lg") with gr.Column(scale=2): gr.Markdown("### 📊 Resultados del Análisis") resultado_output = gr.Textbox( label="Resultado", lines=20, show_copy_button=True, placeholder="Los resultados del análisis aparecerán aquí...", elem_id="resultado" ) # Ejemplos predefinidos gr.Markdown("### 💡 Ejemplos para Probar") # Definir ejemplos como lista de listas ejemplos_lista = [ ["El presidente de Argentina anunció nuevas medidas económicas para 2024.", ["tokens", "entidades"]], ["María compró tres manzanas rojas en el supermercado de Madrid.", ["tokens", "lemas", "dependencias"]], ["La empresa Google fue fundada en 1998 por Larry Page y Sergey Brin.", ["entidades", "dependencias"]], ["El rápido zorro marrón salta sobre el perro perezoso.", ["tokens", "dependencias", "lemas"]] ] gr.Examples( examples=ejemplos_lista, inputs=[texto_input, opciones], label="Haz clic en un ejemplo para probar:", examples_per_page=4 ) # Conectar el botón analizar_btn.click( fn=analizar_completo, inputs=[texto_input, opciones], outputs=resultado_output ) # Pie de página gr.Markdown(""" --- *🔧 Desarrollado con spaCy y Gradio | Modelo: es_core_news_sm* """) if __name__ == "__main__": demo.launch(share=False, server_name="127.0.0.1", server_port=7860)