File size: 3,132 Bytes
f853b58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# requirements.txt
# spacy
# https://github.com/explosion/spacy-models/releases/download/es_core_news_sm-3.7.0/es_core_news_sm-3.7.0-py3-none-any.whl

import gradio as gr
import spacy
import os

# Descargar el modelo si no existe
def descargar_modelo():
    try:
        nlp = spacy.load("es_core_news_sm")
        print("✅ Modelo ya descargado")
    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 correctamente")

# Cargar modelo después de asegurar que existe
descargar_modelo()
nlp = spacy.load("es_core_news_sm")

def analizar_texto(texto):
    if not texto.strip():
        return "❌ Por favor, ingresa un texto para analizar."
    
    doc = nlp(texto)
    
    resultado = "🔍 ANÁLISIS COMPLETO:\n"
    resultado += "=" * 50 + "\n"
    
    # 1. Tokens y POS tagging
    resultado += "\n📝 TOKENS Y GRAMÁTICA:\n"
    for token in doc:
        resultado += f"{token.text:15} {token.pos_:10} {spacy.explain(token.pos_)}\n"
    
    # 2. Entidades nombradas
    resultado += "\n🏷️ ENTIDADES RECONOCIDAS:\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"
    
    # 3. Análisis de dependencias
    resultado += "\n🔗 DEPENDENCIAS:\n"
    for token in doc:
        if token.dep_ != "punct":  # Ignorar puntuación
            resultado += f"{token.text:10} <-{token.dep_:10}- {token.head.text:10}\n"
    
    return resultado

# Crear interfaz Gradio
with gr.Blocks(title="Analizador de Texto con spaCy") as demo:
    gr.Markdown("# 🇪🇸 Analizador de Texto en Español")
    gr.Markdown("Analiza texto en español usando spaCy: tokens, POS tagging, entidades nombradas y dependencias.")
    
    with gr.Row():
        texto_input = gr.Textbox(
            label="Ingresa tu texto en español",
            placeholder="Ej: El presidente de Microsoft, Satya Nadella, anunció nuevas inversiones en España.",
            lines=3,
            max_lines=6
        )
    
    with gr.Row():
        analizar_btn = gr.Button("🔍 Analizar Texto")
    
    with gr.Row():
        resultado_output = gr.Textbox(
            label="Resultado del Análisis",
            lines=20,
            interactive=False
        )
    
    # Ejemplos
    gr.Markdown("### Ejemplos:")
    ejemplos = [
        "El presidente de Microsoft, Satya Nadella, anunció nuevas inversiones en España.",
        "La Universidad de Buenos Aires fue fundada en 1821.",
        "María compró manzanas en el mercado central de Madrid."
    ]
    gr.Examples(
        examples=ejemplos,
        inputs=texto_input
    )
    
    # Conectar el botón
    analizar_btn.click(
        fn=analizar_texto,
        inputs=texto_input,
        outputs=resultado_output
    )

if __name__ == "__main__":
    demo.launch()