File size: 3,110 Bytes
7ddab05
 
 
 
 
 
 
 
 
 
 
 
c2d6dab
 
 
 
 
 
7ddab05
c2d6dab
 
 
7ddab05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c2d6dab
 
 
 
 
 
 
 
 
48e6a6e
 
 
 
 
 
 
c2d6dab
48e6a6e
c2d6dab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48e6a6e
c2d6dab
 
 
 
7ddab05
48e6a6e
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
import gradio as gr
import spacy
from graphviz import Digraph
import os
import uuid

# Cargar modelo de spaCy
nlp = spacy.load("es_dep_news_trf")

# Carpeta persistente para imágenes
os.makedirs("outputs", exist_ok=True)

def limpiar_outputs():
    for archivo in os.listdir("outputs"):
        ruta = os.path.join("outputs", archivo)
        if os.path.isfile(ruta):
            os.remove(ruta)

def generar_grafico_dependencia(texto):
    # Limpiar la carpeta de imágenes antes de generar nuevas
    limpiar_outputs()

    doc = nlp(texto)
    raices = [token for token in doc if token.head == token]
    rutas_imagenes = []

    for i, raiz in enumerate(raices):
        dot = Digraph(comment=f"Árbol {i+1}")
        dot.attr('node', shape='ellipse')

        def agregar_nodo(palabra):
            nodo_id = f"{palabra.text}_{palabra.i}"
            etiqueta = f"{palabra.text}\n({palabra.pos_})"
            dot.node(nodo_id, etiqueta)
            for hijo in palabra.children:
                hijo_id = f"{hijo.text}_{hijo.i}"
                etiqueta_hijo = f"{hijo.text}\n({hijo.pos_})"
                dot.node(hijo_id, etiqueta_hijo)
                dot.edge(nodo_id, hijo_id, label=hijo.dep_)
                agregar_nodo(hijo)

        agregar_nodo(raiz)

        # Guardar archivo con nombre único
        nombre_archivo = f"outputs/arbol_{uuid.uuid4().hex}.png"
        dot.render(filename=nombre_archivo, format='png', cleanup=True)
        rutas_imagenes.append(nombre_archivo + ".png")  # Graphviz añade extensión

    return rutas_imagenes

# Ejemplos
ejemplos = [
    ["El gato duerme en el sofá."],
    ["María compró un libro en la librería."],
    ["Aunque llueva, iremos al parque."],
    ["Pedro dijo que vendría mañana."],
    ["Los niños que juegan en el parque están felices."]
]

CSS = """
.contain { display: flex; flex-direction: column; }
.gallery-container { height: calc(100vh - 200px) !important; }"
#component-0 { height: 100%; }
#gallery { flex-grow: 1; overflow: auto;}
"""

# Interfaz con Blocks
with gr.Blocks(title="Visualización de Dependencias Sintácticas", theme=gr.themes.Ocean(), css=CSS) as demo:
    gr.Markdown("# 🌐 Visualización de Dependencias Sintácticas en Español")
    gr.Markdown("Introduce un texto en español para ver el árbol de dependencias generado con spaCy y Graphviz.")
    
    with gr.Row():
        with gr.Column(scale=1):
          texto_input = gr.Textbox(lines=4, label="Texto en español", placeholder="Escribe aquí tu frase...")
          boton = gr.Button("Generar gráfico")
          gr.Examples(
              examples=ejemplos,
              inputs=texto_input,
              outputs=galeria,
              fn=generar_grafico_dependencia,
              label="Ejemplos de texto"
          )
        with gr.Column(scale=2):
          galeria = gr.Gallery(label="Gráfico(s) generado(s)", show_label=True, columns=4, height="auto", elem_id="gallery")

    boton.click(fn=generar_grafico_dependencia, inputs=texto_input, outputs=galeria)

# Lanzar app
if __name__ == "__main__":
    demo.launch(inbrowser=True)