|
import torch |
|
import gradio as gr |
|
from transformers import AutoTokenizer, AutoModelForSequenceClassification |
|
from peft import PeftModel, PeftConfig |
|
|
|
|
|
adapter_name = "shukdevdatta123/twitter-distilbert-base-uncased-sentiment-analysis-lora-text-classification" |
|
config = PeftConfig.from_pretrained(adapter_name) |
|
|
|
|
|
base_model = AutoModelForSequenceClassification.from_pretrained(config.base_model_name_or_path) |
|
tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path) |
|
|
|
|
|
model = PeftModel.from_pretrained(base_model, adapter_name) |
|
|
|
|
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
model.to(device) |
|
model.eval() |
|
|
|
|
|
id2label = { |
|
0: "Negative", |
|
1: "Positive" |
|
} |
|
|
|
|
|
def predict_sentiment(text): |
|
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True).to(device) |
|
|
|
with torch.no_grad(): |
|
logits = model(**inputs).logits |
|
|
|
predicted_class = torch.argmax(logits, dim=1).item() |
|
label = id2label[predicted_class] |
|
|
|
probs = torch.nn.functional.softmax(logits, dim=1) |
|
confidence = probs[0][predicted_class].item() |
|
|
|
return f"{label} (Confidence: {confidence:.2f})" |
|
|
|
|
|
interface = gr.Interface( |
|
fn=predict_sentiment, |
|
inputs=gr.Textbox(lines=2, placeholder="Enter a sentence to analyze sentiment..."), |
|
outputs="text", |
|
title="Twitter Sentiment Classifier (LoRA + DistilBERT)", |
|
description="This app uses a DistilBERT model with LoRA adapters to classify tweet sentiment as Positive or Negative." |
|
) |
|
|
|
interface.launch() |