Persuade / app.py
paragon-analytics's picture
Update app.py
d415981
raw
history blame
No virus
6.12 kB
# Import packages:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re
# tensorflow imports:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import losses
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
from tensorflow.keras.optimizers import RMSprop
import pickle
import gradio as gr
import yake
import spacy
from spacy import displacy
import streamlit as st
import spacy_streamlit
nlp = spacy.load('en_core_web_sm')
import torch
import tensorflow as tf
from transformers import RobertaTokenizer, RobertaModel, AutoModelForSequenceClassification, TFAutoModelForSequenceClassification
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("paragon-analytics/roberta_persuade")
model = AutoModelForSequenceClassification.from_pretrained("paragon-analytics/roberta_persuade")
# para_tokenizer = AutoTokenizer.from_pretrained("paragon-analytics/t5_para")
# para_model = AutoModelForSeq2SeqLM.from_pretrained("paragon-analytics/t5_para")
kw_extractor = yake.KeywordExtractor()
custom_kw_extractor = yake.KeywordExtractor(lan="en", n=2, dedupLim=0.2, top=10, features=None)
max_words = 2000
max_len = 173
from transformers_interpret import SequenceClassificationExplainer
cls_explainer = SequenceClassificationExplainer(
model,
tokenizer)
def process_final_text(text):
X_test = str(text).lower()
encoded_input = tokenizer(X_test, return_tensors='pt')
output = model(**encoded_input)
scores = output[0][0].detach().numpy()
scores = tf.nn.softmax(scores)
# Get Keywords:
keywords = custom_kw_extractor.extract_keywords(X_test)
letter = []
score = []
for i in keywords:
if i[1]>0.4:
a = "+++"
elif (i[1]<=0.4) and (i[1]>0.1):
a = "++"
elif (i[1]<=0.1) and (i[1]>0.01):
a = "+"
else:
a = "NA"
letter.append(i[0])
score.append(a)
keywords = [(letter[i], score[i]) for i in range(0, len(letter))]
# Get NER:
# NER:
doc = nlp(text)
sp_html = displacy.render(doc, style="ent", page=True, jupyter=False)
NER = (
""
+ sp_html
+ ""
)
# Transformer Interpret:
word_attributions = cls_explainer(X_test)
letter = []
score = []
for i in word_attributions:
if i[1]>0.5:
a = "++"
elif (i[1]<=0.5) and (i[1]>0.1):
a = "+"
elif (i[1]>=-0.5) and (i[1]<-0.1):
a = "-"
elif i[1]<-0.5:
a = "--"
else:
a = "NA"
letter.append(i[0])
score.append(a)
word_attributions = [(letter[i], score[i]) for i in range(0, len(letter))]
return {"Persuasive": float(scores.numpy()[1]), "Non-Persuasive": float(scores.numpy()[0])},keywords,NER,word_attributions
def main(prob1):
text = str(prob1)
obj = process_final_text(text)
return obj[0],obj[1],obj[2],obj[3]
title = "Welcome to **Persuade** πŸͺ"
description1 = """
This app takes text (up to a few sentences) and predicts to what extent the text contains persuasive content."""
with gr.Blocks(title=title) as demo:
gr.Markdown(f"## {title}")
gr.Markdown(description1)
gr.Markdown("""---""")
prob1 = gr.Textbox(label="Enter Your Text Here:",lines=2, placeholder="Type it here ...")
submit_btn = gr.Button("Analyze")
#text = gr.Textbox(label="Text:",lines=2, placeholder="Please enter text here ...")
#submit_btn2 = gr.Button("Analyze")
with gr.Column(visible=True) as output_col:
label = gr.Label(label = "Predicted Label")
impplot = gr.HighlightedText(label="Important Words", combine_adjacent=False).style(
color_map={"+++": "royalblue","++": "cornflowerblue",
"+": "lightsteelblue", "NA":"white"})
NER = gr.HTML(label = 'NER:')
intp =gr.HighlightedText(label="Word Scores",
combine_adjacent=False).style(color_map={"++": "darkgreen","+": "green",
"--": "darkred",
"-": "red", "NA":"white"})
submit_btn.click(
main,
[prob1],
[label,impplot,NER,intp], api_name="ResText"
)
gr.Markdown("### Click on any of the examples below to see to what extent they contain resilience messaging:")
gr.Examples([["We all have problems; it's how we deal with them that makes us different. If negative thoughts are overwhelming you, you can always talk to a friend, a parent, a teacher, a guidance councillor, or a healthcare professional. Control your problems. Control you life."],["If this is your idea of redeeming miles, this is your beer. 2.6 grams carbs and 95 calories. Michelob Ultra. Lose the carbs. Not the taste."],["Nestle Treasures... indulging yourself has its charm. Creamy chocolate. Luscious fillings. Consider them a gift to yourself. Nestle Treasures...from you to you."],["The Consumer Information Catalog from Pueblo, Colorado lists more than 200 free and low-cost, helpful, federal publications. You'll get the latest info on topics like investing your money, getting fit, parenting, even getting federal benefits. For the latest free catalog, call toll-free 1-888-8-PUEBLO."],["Jarlsberg Lite has 50% less fat and 60% less cholesterol than regular Swiss. It's delicious with fruit, salads, sandwiches. Or just plain snacking. Premium, imported, Jarlsberg Lite."],["Made with real blue cheese, sour cream, buttermilk and an uncompromising attention to detail, Marie's is the ultimate in fresh, homemade taste. Marie's. (Really, really fresh tasting salad dressing.) or (What makes it, makes it great.)"],["At Lexus, we believe that luxury should never be compromised for sportiness. And vice versa. Which is why the Lexus GS is 100% of both. Sports car or luxury car? Let your senses be the judge. The Lexus GS 430."]], [prob1], [label,impplot,NER,intp], main, cache_examples=True)
demo.launch()