Spaces:
Sleeping
Sleeping
Karthik Uppuluri
commited on
Commit
•
774ee0a
1
Parent(s):
58a3d54
Telugu POS and NER app
Browse files- app.py +155 -0
- 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
|