import streamlit as st import numpy as np from tensorflow.keras.models import load_model import joblib from tensorflow.keras.preprocessing.sequence import pad_sequences st.title('Sentiment Analysis Prediction') # Initialize model and preproc as None model = None preproc = None # Load the model and preprocessor try: model = load_model('src/cnn_model.keras') preproc = joblib.load('src/preproc.joblib') except Exception as e: st.error(f"Error loading model or preprocessor: {e}") text_input = st.text_area('Enter text for sentiment analysis:', '') # Preprocess function with padding to match model input shape MAXLEN = 60 # Change this if your model expects a different input length def preprocess_text(text, preproc): if isinstance(preproc, dict): if 'tokenizer' in preproc: tokenizer = preproc['tokenizer'] seq = tokenizer.texts_to_sequences([text]) seq = pad_sequences(seq, maxlen=MAXLEN) return seq elif 'vectorizer' in preproc: vectorizer = preproc['vectorizer'] return vectorizer.transform([text]) else: raise ValueError("Unknown preprocessor dict keys.") else: if hasattr(preproc, 'transform'): return preproc.transform([text]) elif hasattr(preproc, 'texts_to_sequences'): seq = preproc.texts_to_sequences([text]) seq = pad_sequences(seq, maxlen=MAXLEN) return seq else: raise ValueError("Unknown preprocessor type.") if st.button('Predict Sentiment'): if not text_input.strip(): st.warning('Please enter some text.') elif model is None or preproc is None: st.error('Model or preprocessor not loaded. Please check the files and try again.') else: try: X = preprocess_text(text_input, preproc) prediction = model.predict(X) sentiment = 'Positive' if prediction[0][0] < 0.5 else 'Negative' st.success(f'Prediction: {sentiment}') except Exception as e: st.error(f"Error making prediction: {e}")