| import streamlit as st |
| import pickle |
| import re |
| import pandas as pd |
| from nltk.corpus import stopwords |
| from nltk.tokenize import word_tokenize |
| from nltk.stem import SnowballStemmer |
| import nltk |
|
|
| |
| |
| |
|
|
| |
| stop_words = set(stopwords.words('english')) |
| nltk.data.find('tokenizers/punkt') |
| |
| ss = SnowballStemmer('english') |
|
|
| |
| @st.cache_resource |
| def load_assets(): |
| try: |
| |
| with open('src/movie_sentiment.pkl', 'rb') as f: |
| loaded_model = pickle.load(f) |
|
|
| with open('src/count_vectorizer.pkl', 'rb') as f: |
| loaded_cv = pickle.load(f) |
| return loaded_model, loaded_cv |
| except FileNotFoundError: |
| st.error("Error: Model or Vectorizer files not found. Please check your file names.") |
| return None, None |
|
|
| loaded_model, loaded_cv = load_assets() |
|
|
| |
| |
| |
|
|
| st.title("π¬ Movie Review Sentiment Analysis") |
| st.markdown("Use the trained model to predict whether the entered review is **Positive** or **Negative**.") |
|
|
| |
| review_new = st.text_area("Enter Your Review Here:", height=150) |
|
|
| |
| if st.button("Predict Sentiment") and loaded_model and loaded_cv: |
| if not review_new: |
| st.warning("Please enter a review to make a prediction.") |
| else: |
| |
| |
| |
| |
| |
| clean_html = re.sub(r'<.*?>', '', review_new) |
| |
| |
| |
| clean_special = re.sub(r'[^a-zA-Z0-9\s]', ' ', clean_html) |
| |
| |
| review_lower = clean_special.lower() |
|
|
| |
| |
| |
| words = word_tokenize(review_lower) |
| |
| |
| |
| review_cleaned_list = [ss.stem(w) for w in words if w not in stop_words and w.strip() != ''] |
| |
| |
| review_cleaned_string = " ".join(review_cleaned_list) |
| |
| |
| |
| review_vectorized = loaded_cv.transform(pd.Series([review_cleaned_string])).toarray() |
|
|
| |
| prediction = loaded_model.predict(review_vectorized)[0] |
|
|
| |
| st.subheader("Prediction Result:") |
| if prediction == 1: |
| st.success(f"**The sentiment is POSITIVE π** (Predicted Label: 1)") |
| else: |
| st.error(f"**The sentiment is NEGATIVE π** (Predicted Label: 0)") |