ZahraAznour commited on
Commit
9769e99
·
verified ·
1 Parent(s): aa7865d

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +72 -0
  2. utils.py +49 -0
app.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Import necessary libraries
2
+ from flask import Flask, render_template, request, jsonify
3
+ from utils import model_predict, get_available_models
4
+
5
+ # Initialize Flask app
6
+ app = Flask(__name__)
7
+
8
+ @app.route("/")
9
+ def home():
10
+ models = get_available_models()
11
+ return render_template("ZAHRAAZNOUR.html", models=models)
12
+
13
+ @app.route('/predict', methods=["POST"])
14
+ def predict():
15
+ """
16
+ Handles form submission and returns prediction.
17
+ """
18
+ email = request.form.get('email')
19
+ model_name = request.form.get('model')
20
+
21
+ if not email:
22
+ return render_template("ZAHRAAZNOUR.html",
23
+ error="Please provide an email",
24
+ models=get_available_models())
25
+
26
+ if not model_name:
27
+ return render_template("ZAHRAAZNOUR.html",
28
+ error="Please select a model",
29
+ models=get_available_models())
30
+
31
+ try:
32
+ prediction = model_predict(email, model_name)
33
+ result = "Spam" if prediction == 1 else "Not Spam"
34
+ return render_template("ZAHRAAZNOUR.html",
35
+ prediction=result,
36
+ email=email,
37
+ selected_model=model_name,
38
+ models=get_available_models())
39
+ except Exception as e:
40
+ return render_template("ZAHRAAZNOUR.html",
41
+ error=f"Error: {str(e)}",
42
+ models=get_available_models())
43
+
44
+ @app.route('/api/predict', methods=["POST"])
45
+ def predict_api():
46
+ """
47
+ API endpoint that accepts a JSON payload and returns a prediction.
48
+ """
49
+ try:
50
+ data = request.get_json()
51
+ email = data.get("email")
52
+ model_name = data.get("model")
53
+
54
+ if not email:
55
+ return jsonify({'error': 'No email provided'}), 400
56
+
57
+ if not model_name:
58
+ return jsonify({'error': 'No model selected'}), 400
59
+
60
+ prediction = model_predict(email, model_name)
61
+ result = "Spam" if prediction == 1 else "Not Spam"
62
+ return jsonify({
63
+ 'email': email,
64
+ 'model': model_name,
65
+ 'prediction': result
66
+ })
67
+
68
+ except Exception as e:
69
+ return jsonify({'error': str(e)}), 400
70
+
71
+ if __name__ == "__main__":
72
+ app.run(host="0.0.0.0", port=5000, debug=True)
utils.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # utils.py (Helper Functions)
2
+ import pickle
3
+ import os
4
+ from pathlib import Path
5
+
6
+ MODELS = {
7
+ 'Support Vector Machine': 'Models/svm_model.pkl',
8
+ 'Random Forest': 'Models/rf_model.pkl',
9
+ 'K-Nearest Neighbors': 'Models/knn_model.pkl',
10
+ 'Naive Bayes': 'Models/clf_NaiveBaised.pkl',
11
+ 'Decision Tree': 'Models/DT_model.pkl'
12
+ }
13
+
14
+
15
+ def get_available_models():
16
+ """
17
+ Returns a list of available models
18
+ """
19
+ return list(MODELS.keys())
20
+
21
+
22
+ def load_model(model_name):
23
+ """
24
+ Loads the specified model from file.
25
+ """
26
+ if model_name not in MODELS:
27
+ raise ValueError(f"Model {model_name} not found")
28
+
29
+ model_file = MODELS[model_name]
30
+ try:
31
+ with open(model_file, "rb") as file:
32
+ model = pickle.load(file)
33
+ return model
34
+ except FileNotFoundError:
35
+ raise FileNotFoundError(f"Model file {model_file} not found")
36
+ except Exception as e:
37
+ raise Exception(f"Error loading model: {str(e)}")
38
+
39
+
40
+ def model_predict(email, model_name):
41
+ """
42
+ Predicts using the specified model.
43
+ """
44
+ try:
45
+ model = load_model(model_name)
46
+ prediction = model.predict([email])
47
+ return 1 if prediction[0] == 1 else -1
48
+ except Exception as e:
49
+ raise Exception(f"Prediction error: {str(e)}")