| from flask import Flask, request, render_template, flash, session, redirect, url_for
|
| import numpy as np
|
| import joblib
|
| import pandas as pd
|
| import os
|
| from datetime import datetime
|
|
|
| app = Flask(__name__)
|
| app.secret_key = 'x7k9p2m4q8r5t1n3j6h0'
|
|
|
|
|
| model = joblib.load("symptom_checker_model.pkl")
|
| mlb = joblib.load("mlb_encoder.pkl")
|
| df = pd.read_csv("DiseaseAndSymptoms.csv")
|
|
|
|
|
| symptom_columns = [f"Symptom_{i}" for i in range(1, 18)]
|
|
|
|
|
| all_symptoms = sorted(set([symptom for col in symptom_columns for symptom in df[col].dropna().unique()]))
|
|
|
|
|
| symptom_categories = {
|
| "Skin": [s for s in all_symptoms if any(kw in s for kw in ["skin", "rash", "itch", "patch", "eruption"])],
|
| "Respiratory": [s for s in all_symptoms if any(kw in s for kw in ["cough", "breath", "sputum", "chest", "phlegm"])],
|
| "Digestive": [s for s in all_symptoms if any(kw in s for kw in ["vomit", "nausea", "abdominal", "diarrhoea", "constipation", "ulcer", "acidity"])],
|
| "General": [s for s in all_symptoms if any(kw in s for kw in ["fever", "fatigue", "chill", "sweat", "malaise", "weight", "thirst"])],
|
| "Neurological": [s for s in all_symptoms if any(kw in s for kw in ["headache", "dizz", "balance", "confusion", "numb"])]
|
| }
|
|
|
|
|
| symptom_categories["Other"] = [s for s in all_symptoms if s not in sum(symptom_categories.values(), [])]
|
|
|
| @app.route("/", methods=["GET", "POST"])
|
| def home():
|
| selected_symptoms = []
|
| feedback_submitted = session.get('feedback_submitted', False)
|
| feedback_error = session.get('feedback_error', False)
|
|
|
| if request.method == "POST" and 'symptom-form' in request.form:
|
| for category in symptom_categories:
|
| selected_symptoms.extend(request.form.getlist(category))
|
|
|
| if len(selected_symptoms) < 3:
|
| return render_template("index.html", categories=symptom_categories,
|
| selected_symptoms=selected_symptoms,
|
| error="Please select at least 3 symptoms",
|
| feedback_submitted=feedback_submitted,
|
| feedback_error=feedback_error)
|
|
|
|
|
| input_vector = np.zeros(len(mlb.classes_))
|
| for symptom in selected_symptoms:
|
| if symptom in mlb.classes_:
|
| input_vector[np.where(mlb.classes_ == symptom)] = 1
|
|
|
|
|
| probabilities = model.predict_proba([input_vector])[0]
|
| top_preds = sorted(zip(model.classes_, probabilities), key=lambda x: x[1], reverse=True)[:3]
|
| prediction = top_preds[0][0]
|
| others = [f"{p[0]} ({p[1] * 100:.0f}%)" for p in top_preds[1:]]
|
|
|
|
|
| session['prediction'] = prediction
|
| session['others'] = others
|
|
|
| return redirect(url_for('result'))
|
|
|
|
|
| if request.method == "POST" and 'feedback-form' in request.form:
|
| name = request.form.get('name')
|
| email = request.form.get('email')
|
| feedback = request.form.get('feedback')
|
|
|
| if not name or not email or not feedback:
|
| session['feedback_error'] = True
|
| return redirect(url_for('home'))
|
| else:
|
|
|
| submit_time = datetime.now().strftime("%d/%m/%y %H:%M:%S")
|
|
|
| with open("feedback.txt", "a") as f:
|
| f.write(f"Date: {submit_time}, Name: {name}, Email: {email}, Feedback: {feedback}\n")
|
| session['feedback_submitted'] = True
|
| print(f"Feedback received - Date: {submit_time}, Name: {name}, Email: {email}, Feedback: {feedback}")
|
| return redirect(url_for('home'))
|
|
|
|
|
| if request.method == "GET":
|
| if 'feedback_submitted' in session:
|
| session.pop('feedback_submitted')
|
| if 'feedback_error' in session:
|
| session.pop('feedback_error')
|
|
|
| return render_template("index.html", categories=symptom_categories,
|
| selected_symptoms=selected_symptoms,
|
| feedback_submitted=feedback_submitted,
|
| feedback_error=feedback_error)
|
|
|
| @app.route("/result")
|
| def result():
|
|
|
| prediction = session.get('prediction')
|
| others = session.get('others', [])
|
|
|
| if not prediction:
|
| return redirect(url_for('home'))
|
|
|
| return render_template("result.html", prediction=prediction, others=others)
|
|
|
| if __name__ == "__main__":
|
| app.run(debug=True) |