Karthik Uppuluri commited on
Commit
774ee0a
1 Parent(s): 58a3d54

Telugu POS and NER app

Browse files
Files changed (2) hide show
  1. app.py +155 -0
  2. requirements.txt +7 -0
app.py ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """."""
2
+ import spacy
3
+ from spacy import displacy
4
+ import numpy as np
5
+ import streamlit as st
6
+ from scipy.special import softmax
7
+ from simpletransformers.ner import NERModel
8
+ from spacy.gold import iob_to_biluo, offsets_from_biluo_tags
9
+
10
+ HTML_WRAPPER = """<div style="overflow-x: auto; border: 1px solid #e6e9ef; border-radius: 0.25rem; padding: 1rem; margin-bottom: 2.5rem">{}</div>"""
11
+
12
+
13
+ def get_token_for_char(doc, char_idx):
14
+ """Get the token id from character index."""
15
+ for i, token in enumerate(doc):
16
+ if char_idx > token.idx:
17
+ continue
18
+ if char_idx == token.idx:
19
+ return i
20
+ if char_idx < token.idx:
21
+ return i - 1
22
+ return len(doc) - 1
23
+
24
+
25
+ @st.cache(allow_output_mutation=True)
26
+ def load_models():
27
+ """Load POS and NER trained telugu models."""
28
+ pos_model = NERModel('bert',
29
+ 'kuppuluri/telugu_bertu_pos',
30
+ args={"use_multiprocessing": False},
31
+ labels=[
32
+ 'QC', 'JJ', 'NN', 'QF', 'RDP', 'O',
33
+ 'NNO', 'PRP', 'RP', 'VM', 'WQ',
34
+ 'PSP', 'UT', 'CC', 'INTF', 'SYMP',
35
+ 'NNP', 'INJ', 'SYM', 'CL', 'QO',
36
+ 'DEM', 'RB', 'NST', ],
37
+ use_cuda=False)
38
+
39
+ ner_model = NERModel('bert',
40
+ 'kuppuluri/telugu_bertu_ner',
41
+ labels=[
42
+ 'B-PERSON', 'I-ORG', 'B-ORG', 'I-LOC', 'B-MISC',
43
+ 'I-MISC', 'I-PERSON', 'B-LOC', 'O'
44
+ ],
45
+ use_cuda=False,
46
+ args={"use_multiprocessing": False})
47
+
48
+ spacy_telugu_model = spacy.blank("te")
49
+
50
+ return pos_model, ner_model, spacy_telugu_model
51
+
52
+
53
+ def format_predictions_to_display(doc,
54
+ predictions,
55
+ probability_maps,
56
+ pos=False):
57
+ """Format predictions into spacy display formar."""
58
+ bert_predictions = []
59
+ iob_tags = []
60
+ tags_formatted = []
61
+
62
+ for prediction, probability_map in zip(predictions[0],
63
+ probability_maps[0]):
64
+ word = list(prediction.keys())[0]
65
+ probas = probability_map[word]
66
+ normalized_probas = list(softmax(np.mean(probas, axis=0)))
67
+ bert_predictions.append(
68
+ (word, prediction[word], np.max(normalized_probas)))
69
+ if pos:
70
+ iob_tags.append("I-" + prediction[word])
71
+ else:
72
+ iob_tags.append(prediction[word])
73
+
74
+ biluo_tags = iob_to_biluo(iob_tags)
75
+ tags = offsets_from_biluo_tags(doc, biluo_tags)
76
+
77
+ for tag in tags:
78
+ start_token = get_token_for_char(doc, tag[0])
79
+ word_span = doc.text[tag[0]:tag[1]]
80
+ length_of_span = len(word_span.split())
81
+ if length_of_span == 1:
82
+ probs = [bert_predictions[start_token][2]]
83
+ else:
84
+ probs = [
85
+ item[2] for item in bert_predictions[start_token:start_token +
86
+ length_of_span]
87
+ ]
88
+ tags_formatted.append({
89
+ "start": tag[0],
90
+ "end": tag[1],
91
+ "label": tag[2],
92
+ "score": np.prod(probs)
93
+ })
94
+ return bert_predictions, tags_formatted
95
+
96
+
97
+ def main():
98
+ """BERT Telugu POS and NER model demo."""
99
+ st.sidebar.title("""
100
+ POS and NER model demo.
101
+ Example sentences:
102
+ 1. కాంగ్రెస్‌ పార్టీకి గుడ్‌ బై చెప్పి ఇటీవల టీఆర్‌ ఎస్‌ తీర్థం పుచ్చుకున్న డీఎస్‌ కు కేసీఆర్‌ ఈ పదవినిచ్చి గౌరవించారు .
103
+ 2. విరాట్ కోహ్లీ కూడా అదే నిర్లక్ష్యాన్ని ప్రదర్శించి కేవలం ఒక పరుగుకే రనౌటై పెవిలియన్ చేరాడు .
104
+ 3. లాలూకు తోడు ఇప్పుడు నితీష్‌ కుమార్ కూడా ఈ సభకు హాజరు కాకూడదని నిర్ణయించుకోవటంతో మహాకూటమిలో నెలకొన్న విభేదాలు తార స్థాయికి చేరుకున్నాయని అంటున్నారు .
105
+ """)
106
+
107
+ st.sidebar.title("""
108
+ Legend for POS and NER:
109
+ http://universaldependencies.org/docs/en/pos/all.html
110
+ LOC: LOCATION
111
+ PERSON: PERSON
112
+ ORG: ORGANIZATION
113
+ MISC: MISCELLANEOUS
114
+ """)
115
+
116
+ text = st.text_area("Text (టెక్స్ట్)",
117
+ "హైదరాబాద్ లో కిడ్నాప్ కాపాడిన ఏపీ పోలీస్")
118
+ pos_model, ner_model, nlp = load_models()
119
+
120
+ if st.button("Get POS and NER"):
121
+
122
+ doc = nlp(text)
123
+
124
+ pos_predictions, pos_probability_map = pos_model.predict([text])
125
+ ner_predictions, ner_probability_map = ner_model.predict([text])
126
+
127
+ bert_pos_predictions, pos_tags_formatted = format_predictions_to_display(
128
+ doc, pos_predictions, pos_probability_map, pos=True)
129
+ bert_ner_predictions, ner_tags_formatted = format_predictions_to_display(
130
+ doc, ner_predictions, ner_probability_map)
131
+
132
+ pos_for_display = [{
133
+ "text": doc.text,
134
+ "ents": pos_tags_formatted,
135
+ "title": None
136
+ }]
137
+ ner_for_display = [{
138
+ "text": doc.text,
139
+ "ents": ner_tags_formatted,
140
+ "title": None
141
+ }]
142
+
143
+ st.title("Named Entity Results")
144
+ html_ner = displacy.render(ner_for_display, style="ent", manual=True)
145
+ html_ner = html_ner.replace("\n", " ")
146
+ st.write(HTML_WRAPPER.format(html_ner), unsafe_allow_html=True)
147
+
148
+ st.title("Part of Speech Results")
149
+ html_pos = displacy.render(pos_for_display, style="ent", manual=True)
150
+ html_pos = html_pos.replace("\n", " ")
151
+ st.write(HTML_WRAPPER.format(html_pos), unsafe_allow_html=True)
152
+
153
+
154
+ if __name__ == '__main__':
155
+ main()
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ transformers
2
+ simpletransformers
3
+ streamlit
4
+ torch
5
+ spacy
6
+ numpy
7
+ scipy