"""."""
import spacy
from spacy import displacy
import numpy as np
import streamlit as st
from scipy.special import softmax
from simpletransformers.ner import NERModel
from spacy.training import iob_to_biluo, biluo_tags_to_offsets
HTML_WRAPPER = """
{}
"""
def get_token_for_char(doc, char_idx):
"""Get the token id from character index."""
for i, token in enumerate(doc):
if char_idx > token.idx:
continue
if char_idx == token.idx:
return i
if char_idx < token.idx:
return i - 1
return len(doc) - 1
@st.cache(allow_output_mutation=True)
def load_models():
"""Load POS and NER trained telugu models."""
pos_model = NERModel('bert',
'kuppuluri/telugu_bertu_pos',
args={"use_multiprocessing": False},
labels=[
'QC', 'JJ', 'NN', 'QF', 'RDP', 'O',
'NNO', 'PRP', 'RP', 'VM', 'WQ',
'PSP', 'UT', 'CC', 'INTF', 'SYMP',
'NNP', 'INJ', 'SYM', 'CL', 'QO',
'DEM', 'RB', 'NST', ],
use_cuda=False)
ner_model = NERModel('bert',
'kuppuluri/telugu_bertu_ner',
labels=[
'B-PERSON', 'I-ORG', 'B-ORG', 'I-LOC', 'B-MISC',
'I-MISC', 'I-PERSON', 'B-LOC', 'O'
],
use_cuda=False,
args={"use_multiprocessing": False})
spacy_telugu_model = spacy.blank("te")
return pos_model, ner_model, spacy_telugu_model
def format_predictions_to_display(doc,
predictions,
probability_maps,
pos=False):
"""Format predictions into spacy display formar."""
bert_predictions = []
iob_tags = []
tags_formatted = []
for prediction, probability_map in zip(predictions[0],
probability_maps[0]):
word = list(prediction.keys())[0]
probas = probability_map[word]
normalized_probas = list(softmax(np.mean(probas, axis=0)))
bert_predictions.append(
(word, prediction[word], np.max(normalized_probas)))
if pos:
iob_tags.append("I-" + prediction[word])
else:
iob_tags.append(prediction[word])
biluo_tags = iob_to_biluo(iob_tags)
tags = biluo_tags_to_offsets(doc, biluo_tags)
for tag in tags:
start_token = get_token_for_char(doc, tag[0])
word_span = doc.text[tag[0]:tag[1]]
length_of_span = len(word_span.split())
if length_of_span == 1:
probs = [bert_predictions[start_token][2]]
else:
probs = [
item[2] for item in bert_predictions[start_token:start_token +
length_of_span]
]
tags_formatted.append({
"start": tag[0],
"end": tag[1],
"label": tag[2],
"score": np.prod(probs)
})
return bert_predictions, tags_formatted
def main():
"""BERT Telugu POS and NER model demo."""
st.sidebar.title("""
POS and NER model demo.
Example sentences:
1. కాంగ్రెస్ పార్టీకి గుడ్ బై చెప్పి ఇటీవల టీఆర్ ఎస్ తీర్థం పుచ్చుకున్న డీఎస్ కు కేసీఆర్ ఈ పదవినిచ్చి గౌరవించారు .
2. విరాట్ కోహ్లీ కూడా అదే నిర్లక్ష్యాన్ని ప్రదర్శించి కేవలం ఒక పరుగుకే రనౌటై పెవిలియన్ చేరాడు .
3. లాలూకు తోడు ఇప్పుడు నితీష్ కుమార్ కూడా ఈ సభకు హాజరు కాకూడదని నిర్ణయించుకోవటంతో మహాకూటమిలో నెలకొన్న విభేదాలు తార స్థాయికి చేరుకున్నాయని అంటున్నారు .
""")
st.sidebar.title("""
Legend for POS and NER:
http://universaldependencies.org/docs/en/pos/all.html
LOC: LOCATION
PERSON: PERSON
ORG: ORGANIZATION
MISC: MISCELLANEOUS
""")
text = st.text_area("Text (టెక్స్ట్)",
"హైదరాబాద్ లో కిడ్నాప్ కాపాడిన ఏపీ పోలీస్")
pos_model, ner_model, nlp = load_models()
if st.button("Get POS and NER"):
doc = nlp(text)
pos_predictions, pos_probability_map = pos_model.predict([text])
ner_predictions, ner_probability_map = ner_model.predict([text])
bert_pos_predictions, pos_tags_formatted = format_predictions_to_display(
doc, pos_predictions, pos_probability_map, pos=True)
bert_ner_predictions, ner_tags_formatted = format_predictions_to_display(
doc, ner_predictions, ner_probability_map)
pos_for_display = [{
"text": doc.text,
"ents": pos_tags_formatted,
"title": None
}]
ner_for_display = [{
"text": doc.text,
"ents": ner_tags_formatted,
"title": None
}]
st.title("Named Entity Results")
html_ner = displacy.render(ner_for_display, style="ent", manual=True)
html_ner = html_ner.replace("\n", " ")
st.write(HTML_WRAPPER.format(html_ner), unsafe_allow_html=True)
st.title("Part of Speech Results")
html_pos = displacy.render(pos_for_display, style="ent", manual=True)
html_pos = html_pos.replace("\n", " ")
st.write(HTML_WRAPPER.format(html_pos), unsafe_allow_html=True)
if __name__ == '__main__':
main()