import torch import torch.nn as nn from transformers import T5Tokenizer, T5EncoderModel import gradio as gr import re import nltk from nltk.tokenize import word_tokenize from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer # === NLTK Downloads === nltk.download('punkt_tab') nltk.download('stopwords') nltk.download('wordnet') nltk.download('omw-1.4') # === Preprocessing Function === stop_words = set(stopwords.words('english')) lemmatizer = WordNetLemmatizer() def preprocess_text(text): text = re.sub(r'[^A-Za-z\s]', '', text) text = re.sub(r'\s+', ' ', text).strip() text = text.lower() tokens = word_tokenize(text) tokens = [word for word in tokens if word not in stop_words] tokens = [lemmatizer.lemmatize(word) for word in tokens] return ' '.join(tokens) # === Model Definition === class T5Classifier(nn.Module): def __init__(self, model_name='t5-small', num_labels=2): super(T5Classifier, self).__init__() self.encoder = T5EncoderModel.from_pretrained(model_name) self.classifier = nn.Linear(self.encoder.config.d_model, num_labels) def forward(self, input_ids, attention_mask): encoder_output = self.encoder(input_ids=input_ids, attention_mask=attention_mask) cls_representation = encoder_output.last_hidden_state[:, 0, :] logits = self.classifier(cls_representation) return logits # === Load Model & Tokenizer === device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') tokenizer = T5Tokenizer.from_pretrained("t5-small") model = T5Classifier(model_name='t5-small', num_labels=2) model.load_state_dict(torch.load("best_model.pth", map_location=device)) model.to(device) model.eval() # === Prediction Function === label_map = {0: "Negative", 1: "Positive"} def predict_sentiment(text): cleaned = preprocess_text(text) inputs = tokenizer(cleaned, return_tensors="pt", padding="max_length", truncation=True, max_length=128) input_ids = inputs["input_ids"].to(device) attention_mask = inputs["attention_mask"].to(device) with torch.no_grad(): logits = model(input_ids=input_ids, attention_mask=attention_mask) pred = torch.argmax(logits, dim=1).item() return label_map[pred] # === Gradio Interface === demo = gr.Interface( fn=predict_sentiment, inputs=gr.Textbox(label="Enter Movie Review"), outputs=gr.Text(label="Predicted Sentiment"), title="🎬 T5 Movie Review Classifier", description="Enter a movie review, and the model will predict whether the sentiment is Positive or Negative." ) demo.launch()