end_to_end / app.py
Ars135's picture
Upload 6 files
bc9fad3 verified
from flask import Flask, request, jsonify
import joblib
import string
import nltk
import os
# Initialize App
app = Flask(__name__)
# --- ROBUST NLTK SETUP ---
# Set NLTK data path to a local folder to avoid permission issues
nltk_data_dir = os.path.join(os.getcwd(), 'nltk_data')
nltk.data.path.append(nltk_data_dir)
def download_nltk_resources():
resources = ['stopwords', 'wordnet', 'punkt', 'punkt_tab']
for res in resources:
try:
nltk.data.find(f'corpora/{res}')
except LookupError:
try:
nltk.data.find(f'tokenizers/{res}')
except LookupError:
print(f"Downloading {res}...")
nltk.download(res, download_dir=nltk_data_dir, quiet=True)
download_nltk_resources()
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
# -------------------------
# Load Model
print("Loading model...")
try:
model = joblib.load('sentiment_model.pkl')
vectorizer = joblib.load('tfidf_vectorizer.pkl')
print("Model loaded successfully.")
except Exception as e:
print(f"CRITICAL ERROR: Could not load model files. {e}")
model = None
lemmatizer = WordNetLemmatizer()
stop_words = set(stopwords.words('english'))
def preprocess_text(text):
if not isinstance(text, str): return ""
text = text.lower()
text = text.translate(str.maketrans('', '', string.punctuation))
tokens = nltk.word_tokenize(text)
clean_tokens = [lemmatizer.lemmatize(word) for word in tokens if word not in stop_words]
return " ".join(clean_tokens)
@app.route('/predict', methods=['POST'])
def predict():
if model is None:
return jsonify({'error': 'Model not loaded properly.'}), 500
try:
data = request.get_json()
if not data or 'review_text' not in data:
return jsonify({'error': 'No review_text provided'}), 400
text = data['review_text']
clean_text = preprocess_text(text)
vectorized_text = vectorizer.transform([clean_text])
prediction = model.predict(vectorized_text)[0]
return jsonify({
'review': text,
'sentiment': "Positive" if prediction == 1 else "Negative"
})
except Exception as e:
print(f"Prediction Error: {e}")
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)