File size: 2,804 Bytes
e512f7f
7cabef0
e512f7f
 
 
 
 
 
7cabef0
4abd544
5f007b2
4abd544
 
 
 
 
 
 
5f007b2
7cabef0
 
 
4abd544
7cabef0
 
 
 
bb18842
7cabef0
 
 
 
 
0fe32b8
7cabef0
 
 
 
 
4abd544
 
 
e512f7f
4abd544
 
 
 
e512f7f
4abd544
e512f7f
4abd544
 
 
e512f7f
4abd544
e512f7f
 
 
 
 
2310bfe
e512f7f
 
 
 
 
2310bfe
e512f7f
 
 
 
18e49ea
7cabef0
702f8f4
18e49ea
 
 
e512f7f
702f8f4
e512f7f
 
026f6fc
f29f0a2
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
78
79
80
81
82
83
84
85
86
87
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 postag(tk):
    tag = ""
    plural_tags = ["NNS", "NNPS"]
    if tk.tag_ in plural_tags:
        tag = " (Plural)"
    else:
        tag = " ({})".format(tk.tag_)
    return tag
    
def genFlatDepthTree(expr):
    doc = nlp(expr)
    root = next(doc.sents).root
    node = Node(root.text+": 0 (Root)"+postag(root), 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+" :"+str(depth+1)+postag(ch), 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> <h2>🌳 Syntactic Tree Generator 🌳</h2> </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 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=5,
    )
    
    input_expr.change(     
        fn=genFlatDepthTree, 
        inputs=input_expr, 
        outputs=[out_image_tree, out_flat_tree])

demo.launch()