File size: 5,844 Bytes
7de1a88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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)