from pathlib import Path from collections import Counter import gradio as gr import pandas as pd import numpy from scipy.special import softmax import torch from transformers import pipeline, TextClassificationPipeline from transformers import ( AutoTokenizer, AutoConfig, AutoModelForSequenceClassification ) # model_path = "EmotiScan/amazon-comments-bert" # To use your model, on line 55, you'll have to change i to i+1 # model_path = "nlptown/bert-base-multilingual-uncased-sentiment" model_path = "Mofe/emotiscan_model_2" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForSequenceClassification.from_pretrained(model_path) description = f"""#

Opinion orbit Amazon Products Review

Input a single review to predict sentiment or multiple from a text file.

""" sample_reviews = [ "A comfortable pair of boots, but a little difficult to \ remove without unlacing. So be prepared to unlace before \ removing. Takes a few seconds to get them on and off, but \ otherwise a very comfortable, sturdy product.", "Very nice boot, it's narrow whc I wasn't expecting, more \ for a not so wide of a foot. My foot is not that wide, but \ with socks on it will feel a little tight in the middle and back \ of the heel, I would go a half or whole size up.", "If you like to continue having dry skin AND to smell like \ the inside of a Shoppers Drug Mart then this product is for you!! \ Sadly, I don't care for either of those things. I will continue \ to hunt for a moisturizer/shower oil", "I really dislike this product.", "This is the best product ever!." ] def upload_file(file): return file.name def get_sentiments(text): encoded_input = tokenizer(text, return_tensors='pt') with torch.no_grad(): logits = model(**encoded_input).logits logits_list = logits[0].tolist() logits_labels = [model.config.id2label[i] for i in range(0, len(logits_list))] probs = softmax(logits_list) scores = {l:float(s) for (l,s) in zip(logits_labels, probs)} return scores def get_multiple_sentiments(input_file): with open(input_file) as fn: reviews = fn.readlines() reviews = [review.strip() for review in reviews] classifier = pipeline('text-classification', model=model_path) scores = classifier(reviews) scores = [pred['label'] for pred in scores] preds = dict(Counter(scores)) labels = preds.keys() counts = preds.values() review_counts = pd.DataFrame( { "labels": labels, "counts": counts, } ) total = len(scores) return gr.BarPlot( review_counts, x="labels", y="counts", title=f"# of Reviews: {total}", tooltip=["labels", "counts"], y_lim=[0, total + 10], min_width=500 ) with gr.Blocks() as demo: with gr.Row(): gr.Markdown(value=description) with gr.Row(): with gr.Column(): with gr.Tab("Single Input"): single = True input_text = gr.Textbox(label="Input Text", placeholder="Input the product review...") predict_btn = gr.Button("Get Sentiment") with gr.Accordion("Here are some sample reviews!"): examples = gr.Examples(examples=sample_reviews, inputs=[input_text]) with gr.Tab("File Upload"): multiple = True file_output = gr.File() upload_button = gr.UploadButton("Upload a .txt file with each review on a line.", file_types=["text"]) upload_button.upload(upload_file, upload_button, file_output) file_predict_btn = gr.Button("Get Sentiments") with gr.Column(): output = gr.Label(label="Single Prediction") plots = gr.BarPlot(label="Plot Multiple Reviews") predict_btn.click(fn=get_sentiments, inputs=input_text, outputs=output,) # api_name="product_review") file_predict_btn.click(fn=get_multiple_sentiments, inputs=file_output, outputs=plots) demo.launch(share=True)