File size: 2,570 Bytes
e512f7f
7cabef0
e512f7f
 
 
 
 
 
7cabef0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e512f7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7cabef0
e512f7f
 
 
 
18e49ea
7cabef0
 
18e49ea
 
 
e512f7f
7cabef0
e512f7f
 
026f6fc
e512f7f
 
 
 
 
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
import gradio as gr
from anytree import Node, RenderTree
import spacy
from spacy import displacy

nlp = spacy.load("en_core_web_md")

# -- Main functions --

def genFlatDepthTree(expr):
    doc = nlp(expr)
    root = next(doc.sents).root
    node = Node(root.text+" : depth="+str(0), parent=None)

    def tree(tk, last_node, depth):
        if tk.n_lefts + tk.n_rights > 0:
            for ch in tk.children:
                tree(ch, Node(ch.text+" : depth="+str(depth+1), parent=last_node), depth+1)
    
    tree(root, node, 0)
    flat_tree = ""

    for pre, fill, node in RenderTree(node):
        flat_tree += "{}{}\n".format(pre, node.name)

    img_tree = displacy.render(doc, style='dep', options={'distance': 100})
    
    return "<center><div style='max-width: 800px; overflow-x:auto;'>"+img_tree+"</div></center>", flat_tree
    
def syntacticTree(expr):
    doc = nlp(expr)
    depths = {}

    def walk_tree(tk, depth):
        depths[tk.text] = depth
        if tk.n_lefts + tk.n_rights > 0: # if Doesn't root
            [walk_tree(child, depth + 1) for child in tk.children]

    [walk_tree(sent.root, 0) for sent in doc.sents]

    flat_tree = [tk.text+" - "+str(depths[tk.text]) for tk in doc]
    image_tree = displacy.render(doc, style='dep', options={'distance': 100})
    image_tree = "<center><div style='max-width: 800px; overflow-x:auto;'>"+image_tree+"</div></center>"
    
    return image_tree,flat_tree

# -- Interface --
demo = gr.Blocks(css=".container { max-width: 900px; margin: auto;}", title="Syntactic tree generator")

with demo:
    gr.Markdown("""<center> <h1>Syntactic tree generator</h1> </center>""")
    with gr.Row():
        with gr.Column():
            gr.Image(value="https://img.unocero.com/2019/11/facebook-app-para-hacer-memes-1-1024x576.jpg",label="", type="URL")
        with gr.Column():
            input_expr = gr.Textbox(label="Input", placeholder="Enter an expression here")
            out_flat_tree = gr.Text(label="Flat depth tree", value="")
    
    out_image_tree = gr.HTML(label="")

    gr.Examples(
        examples=[ 
            "glass in guys hand on right first guy",
[            "i have been happy",
            "the happy spiders",
            "gradio is a package that allows users to create simple web apps with just a few lines of code",
            "the best dog out there"],
        inputs=input_expr,
        examples_per_page=4,
    )
    
    input_expr.change(     
        fn=syntacticTree, 
        inputs=input_expr, 
        outputs=[out_image_tree, out_flat_tree])

demo.launch()