Munazz's picture
Update app.py
4ca93fe verified
import gradio as gr
import joblib
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
# Load models (change paths to where your .pkl files are stored)
logreg_model = joblib.load('best_lr_model.pkl')
knn_model = joblib.load('best_knn_model.pkl')
svc_model = joblib.load('best_svc_model.pkl') # Ensure this model has 'probability=True' if needed
rf_model = joblib.load('best_rf_model.pkl')
# Preprocessing: Load the same vectorizer you used during training
vectorizer = joblib.load('vectorizer.pkl')
# Define the function to predict sentiment
def predict_sentiment(review_text, model_name, positive_threshold=0.6):
# Preprocess the review text using the same vectorizer used during training
transformed_text = vectorizer.transform([review_text]) # This is sparse matrix
# Convert sparse matrix to dense (necessary for SVM and other models)
transformed_text_dense = transformed_text.toarray() # Convert sparse matrix to dense array
# Choose model based on the dropdown selection
if model_name == "Logistic Regression":
model = logreg_model
elif model_name == "K-Nearest Neighbors":
model = knn_model
elif model_name == "Random Forest":
model = rf_model
elif model_name == "SVM":
model = svc_model
# Make predictions and get probabilities
if hasattr(model, 'predict_proba'):
prob = model.predict_proba(transformed_text_dense) # Use dense matrix here
sentiment_prob = prob[0][1] # Probability of positive sentiment
sentiment = model.predict(transformed_text_dense)[0]
# Apply threshold to determine sentiment class
if sentiment_prob >= positive_threshold:
sentiment_class = "Positive"
probability = f"Positive Comment: {sentiment_prob*100:.2f}%, Negative Comment: {(1-sentiment_prob)*100:.2f}%"
else:
sentiment_class = "Negative"
probability = f"Positive Comment: {sentiment_prob*100:.2f}%, Negative Comment: {(1-sentiment_prob)*100:.2f}%"
else:
sentiment = model.predict(transformed_text_dense)[0]
probability = "Model does not support probability estimation."
# Return the predicted sentiment class and probabilities
sentiment_class = "Positive" if sentiment == 1 else "Negative"
return sentiment_class, probability
# Step 6.4: Put all components together in Gradio's interface
with gr.Blocks() as demo:
# Input components
review_input = gr.Textbox(label="Review Comment", lines=2, placeholder="Enter your review comment here...")
model_dropdown = gr.Dropdown(choices=["Logistic Regression", "K-Nearest Neighbors", "Random Forest", "SVM"], label="Select Model")
# Output components
output_sentiment = gr.Textbox(label="Predicted Sentiment Class", placeholder="Predicted sentiment will appear here...")
output_probability = gr.Textbox(label="Predicted Probability", placeholder="Probabilities will appear here...")
# Submit Button
submit_button = gr.Button("Submit")
# Define the action when the button is clicked
submit_button.click(fn=predict_sentiment, inputs=[review_input, model_dropdown], outputs=[output_sentiment, output_probability])
# Launch the interface
demo.launch()