yashm commited on
Commit
ecd3f7e
·
verified ·
1 Parent(s): 58b85dc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -56
app.py CHANGED
@@ -1,59 +1,59 @@
1
  import streamlit as st
2
- from nltk import pos_tag, word_tokenize, download
3
- from nltk.tree import Tree
4
- from nltk.chunk.regexp import RegexpParser
5
- import plotly.graph_objects as go
6
-
7
- # Ensure NLTK resources are downloaded
8
- download('punkt')
9
- download('averaged_perceptron_tagger')
10
-
11
- # Function to create a syntax tree
12
- def create_syntax_tree(sentence):
13
- tokens = word_tokenize(sentence)
14
- tagged = pos_tag(tokens)
15
- grammar = "NP: {<DT>?<JJ>*<NN>}"
16
- cp = RegexpParser(grammar)
17
- chunked = cp.parse(tagged)
18
- return chunked
19
-
20
- # Function to manually plot a syntax tree using Plotly
21
- def plot_tree(tree):
22
- trace = go.Scatter(x=[], y=[], text=[], mode="text+markers", textposition="bottom center")
23
-
24
- def add_node(node, pos=0, level=1):
25
- x = pos
26
- y = -level
27
- trace['x'] += (x,)
28
- trace['y'] += (y,)
29
- trace['text'] += (node.label(),)
30
-
31
- child_pos = x - 0.5 * len(node) + 0.5
32
- for child in node:
33
- if isinstance(child, Tree):
34
- trace['x'] += (x, child_pos)
35
- trace['y'] += (y, -(level + 1))
36
- add_node(child, pos=child_pos, level=level + 1)
37
- else:
38
- trace['x'] += (child_pos,)
39
- trace['y'] += (-(level + 1),)
40
- trace['text'] += (child,)
41
- child_pos += 1
42
-
43
- add_node(tree)
44
-
45
- layout = go.Layout(title="Syntax Tree", xaxis={'showgrid': False, 'zeroline': False, 'showticklabels': False},
46
- yaxis={'showgrid': False, 'zeroline': False, 'showticklabels': False}, showlegend=False)
47
- fig = go.Figure(data=[trace], layout=layout)
48
- return fig
49
-
50
- st.title('Syntax Tree Generator')
51
- sentence = st.text_input('Enter a sentence:', '')
52
 
53
  if sentence:
54
- tree = create_syntax_tree(sentence)
55
- try:
56
- fig = plot_tree(tree)
57
- st.plotly_chart(fig, use_container_width=True)
58
- except Exception as e:
59
- st.error(f"An error occurred while generating the tree diagram: {e}")
 
 
1
  import streamlit as st
2
+ import spacy
3
+ from spacy import displacy
4
+ from anytree import Node, RenderTree
5
+ from anytree.exporter import DotExporter
6
+ import subprocess
7
+ from typing import Tuple
8
+ import os
9
+ import base64
10
+
11
+ # Initialize spaCy
12
+ nlp = spacy.load("en_core_web_md")
13
+
14
+ def postag(tk) -> str:
15
+ tag = ""
16
+ plural_tags = ["NNS", "NNPS"]
17
+ if tk.tag_ in plural_tags:
18
+ tag = f" ({tk.tag_}) (Plural)"
19
+ else:
20
+ tag = f" ({tk.tag_})"
21
+ return tag
22
+
23
+ def gen_syntactic_tree(expr: str) -> Tuple[str, str]:
24
+ doc = nlp(expr)
25
+ root = next(doc.sents).root
26
+ node = Node("" + root.text + ": (Root)" + postag(root), parent=None)
27
+
28
+ def tree(tk, last_node: Node, depth: int) -> None:
29
+ if tk.n_lefts + tk.n_rights > 0:
30
+ for child in tk.children:
31
+ tree(child, Node("" + child.text + ": " + str(depth + 1) + postag(child), parent=last_node), depth + 1)
32
+
33
+ tree(root, node, 0)
34
+ syntactic_str_tree = ""
35
+
36
+ for pre, fill, node in RenderTree(node):
37
+ syntactic_str_tree += f"{pre}{node.name}\n"
38
+
39
+ syntactic_tree = displacy.render(doc, style='dep', options={'distance': 100})
40
+ syntactic_html_tree = f"""
41
+ <center>
42
+ <div style='max-width: 800px; overflow-x:auto;'>
43
+ {syntactic_tree}
44
+ </div>
45
+ </center>
46
+ """
47
+ return syntactic_html_tree, syntactic_str_tree
48
+
49
+ st.title('Syntactic Tree Generator')
50
+ sentence = st.text_area("Enter a sentence:")
 
51
 
52
  if sentence:
53
+ error, syntactic_html_tree, syntactic_str_tree = "", "", ""
54
+ if sentence.strip() == "":
55
+ st.warning("The sentence cannot be empty!")
56
+ else:
57
+ syntactic_html_tree, syntactic_str_tree = gen_syntactic_tree(sentence)
58
+ st.markdown(syntactic_html_tree, unsafe_allow_html=True)
59
+ st.text(syntactic_str_tree)