# 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()