| | from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, AutoModelForSequenceClassification, TextClassificationPipeline |
| | import torch |
| | import gradio as gr |
| | from openpyxl import load_workbook |
| | from numpy import mean |
| |
|
| | |
| | tokenizer = AutoTokenizer.from_pretrained("suriya7/bart-finetuned-text-summarization") |
| | model = AutoModelForSeq2SeqLM.from_pretrained("suriya7/bart-finetuned-text-summarization") |
| |
|
| | tokenizer_keywords = AutoTokenizer.from_pretrained("transformer3/H2-keywordextractor") |
| | model_keywords = AutoModelForSeq2SeqLM.from_pretrained("transformer3/H2-keywordextractor") |
| |
|
| | device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| | new_model = AutoModelForSequenceClassification.from_pretrained('roberta-rating') |
| | new_tokenizer = AutoTokenizer.from_pretrained('roberta-rating') |
| |
|
| | classifier = TextClassificationPipeline(model=new_model, tokenizer=new_tokenizer, device=device) |
| |
|
| | label_mapping = {1: '1/5', 2: '2/5', 3: '3/5', 4: '4/5', 5: '5/5'} |
| |
|
| | |
| | def parse_xl(file_path): |
| | cells = [] |
| |
|
| | workbook = load_workbook(filename=file_path) |
| | for sheet in workbook.worksheets: |
| | for row in sheet.iter_rows(): |
| | for cell in row: |
| | if cell.value != None: |
| | cells.append(cell.value) |
| |
|
| | return cells |
| |
|
| | |
| | def evaluate(file): |
| | reviews = parse_xl(file) |
| | ratings = [] |
| | text = "" |
| | sentiments = [] |
| |
|
| | for review in reviews: |
| | rating = int(classifier(review)[0]['label'].split('_')[1]) |
| | ratings.append(rating) |
| | text += review |
| | text += " " |
| | |
| | sentiment = classifier(review)[0]['label'] |
| | sentiment_label = "Positive" if sentiment == "LABEL_4" or sentiment == "LABEL_5" else "Negative" if sentiment == "LABEL_1" or sentiment == "LABEL_2" else "Neutral" |
| | sentiments.append(sentiment_label) |
| | |
| | overall_sentiment = "Positive" if sentiments.count("Positive") > sentiments.count("Negative") else "Negative" if sentiments.count("Negative") > sentiments.count("Positive") else "Neutral" |
| | |
| | inputs = tokenizer([text], max_length=1024, truncation=True, return_tensors="pt") |
| | summary_ids = model.generate(inputs["input_ids"], num_beams=2, min_length=10, max_length=50) |
| | summary = tokenizer.batch_decode(summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] |
| |
|
| | |
| | summary = summary.replace("I", "He/She").replace("my", "his/her").replace("me", "him/her") |
| |
|
| | inputs_keywords = tokenizer_keywords([text], max_length=1024, truncation=True, return_tensors="pt") |
| | summary_ids_keywords = model_keywords.generate(inputs_keywords["input_ids"], num_beams=2, min_length=0, max_length=100) |
| | keywords = tokenizer_keywords.batch_decode(summary_ids_keywords, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] |
| |
|
| | return round(mean(ratings), 2), summary, keywords, overall_sentiment |
| |
|
| | |
| | def test_area(text): |
| | inputs = tokenizer([text], max_length=1024, truncation=True, return_tensors="pt") |
| | summary_ids = model.generate(inputs["input_ids"], num_beams=2, min_length=10, max_length=50) |
| | summary = tokenizer.batch_decode(summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] |
| |
|
| | |
| | summary = summary.replace("I", "He/She").replace("my", "his/her").replace("me", "him/her") |
| |
|
| | inputs_keywords = tokenizer_keywords([text], max_length=1024, truncation=True, return_tensors="pt") |
| | summary_ids_keywords = model_keywords.generate(inputs_keywords["input_ids"], num_beams=2, min_length=0, max_length=100) |
| | keywords = tokenizer_keywords.batch_decode(summary_ids_keywords, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] |
| |
|
| | sentiment = classifier(text)[0]['label'] |
| | sentiment_label = "Positive" if sentiment == "LABEL_4" or sentiment == "LABEL_5" else "Negative" if sentiment == "LABEL_1" or sentiment == "LABEL_2" else "Neutral" |
| | |
| | rating = int(classifier(text)[0]['label'].split('_')[1]) |
| |
|
| | return rating, summary, keywords, sentiment_label |
| |
|
| | |
| | main_interface = gr.Interface( |
| | fn=evaluate, |
| | inputs=gr.File(label="Reviews"), |
| | outputs=[gr.Textbox(label="Overall Rating"), gr.Textbox(label="Summary"), gr.Textbox(label="Keywords"), gr.Textbox(label="Overall Sentiment")], |
| | title='Summarize Reviews', |
| | description="Evaluate and summarize collection of reviews. Reviews are submitted as an Excel file, where each review is in its own cell." |
| | ) |
| |
|
| | |
| | testing_interface = gr.Interface( |
| | fn=test_area, |
| | inputs=gr.Textbox(label="Input Text"), |
| | outputs=[gr.Textbox(label="Rating"), gr.Textbox(label="Summary"), gr.Textbox(label="Keywords"), gr.Textbox(label="Sentiment")], |
| | title='Testing Area', |
| | description="Test the summarization, keyword extraction, sentiment analysis, and rating on custom text input." |
| | ) |
| |
|
| | |
| | with gr.Blocks() as demo: |
| | with gr.Row(): |
| | with gr.Column(scale=1): |
| | gr.Markdown("## Sidebar") |
| | gr.Button("Button 1") |
| | gr.Button("Button 2") |
| | with gr.Column(scale=4): |
| | iface = gr.TabbedInterface( |
| | [main_interface, testing_interface], |
| | ["Summarize Reviews", "Testing Area"] |
| | ) |
| |
|
| | demo.launch(share=True) |
| |
|