import pandas as pd import numpy as np from sklearn.feature_extraction.text import CountVectorizer from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split import gradio as gr # Load and preprocess the data file_path = 'homework01_text_data_group16.csv' # Update with your file path data = pd.read_csv(file_path) sentences = data['reviews'] labels = data['class'] # Split the data sentence_train, sentence_test, y_train, y_test = train_test_split( sentences, labels, test_size=0.2, random_state=42 ) # Bag-of-Words vectorization vectorizer = CountVectorizer() X_train = vectorizer.fit_transform(sentence_train) X_test = vectorizer.transform(sentence_test) # Train models knn_model = KNeighborsClassifier(n_neighbors=3).fit(X_train, y_train) logistic_model = LogisticRegression().fit(X_train, y_train) svm_model = SVC(kernel='linear', probability=True).fit(X_train, y_train) rf_model = RandomForestClassifier(n_estimators=100).fit(X_train, y_train) # Gradio app function def predict_sentiment(text, model_name): vectorized_text = vectorizer.transform([text]) if model_name == 'KNN': probabilities = knn_model.predict_proba(vectorized_text)[0] elif model_name == 'Logistic Regression': probabilities = logistic_model.predict_proba(vectorized_text)[0] elif model_name == 'SVM': probabilities = svm_model.predict_proba(vectorized_text)[0] elif model_name == 'Random Forest': probabilities = rf_model.predict_proba(vectorized_text)[0] else: return "Invalid Model Selection" prediction = "Positive" if probabilities[1] > probabilities[0] else "Negative" prob_positive = round(probabilities[1] * 100, 2) prob_negative = round(probabilities[0] * 100, 2) return f"Prediction: {prediction}", f"Positive: {prob_positive}%\nNegative: {prob_negative}%" # Define the Gradio interface interface = gr.Interface( fn=predict_sentiment, inputs=["text", gr.Dropdown(["KNN", "Logistic Regression", "SVM", "Random Forest"])], outputs=[gr.Textbox(label="Prediction"), gr.Textbox(label="Details (Probabilities)")], title="Sentiment Analysis with Multiple Models", description="Enter a text review and select a model to predict sentiment and view probabilities." ) # Launch the app if __name__ == "__main__": interface.launch()