File size: 5,328 Bytes
18bbae8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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'  # Secret key for flash messages and session

# Load model, encoder, and CSV locally
model = joblib.load("symptom_checker_model.pkl")
mlb = joblib.load("mlb_encoder.pkl")
df = pd.read_csv("DiseaseAndSymptoms.csv")

# Symptom columns define karo
symptom_columns = [f"Symptom_{i}" for i in range(1, 18)]

# Saare symptoms extract karo
all_symptoms = sorted(set([symptom for col in symptom_columns for symptom in df[col].dropna().unique()]))

# Symptom categories dynamically banayein (except 'Other')
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"])]
}

# 'Other' category ko baaki categories ke baad calculate karo
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)  # Success flag
    feedback_error = session.get('feedback_error', False)  # Error flag

    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)
        
        # Binary vector banao
        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

        # Predict karo with probabilities
        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:]]  # Percentage format mein
        
        # Session mein prediction aur others store karo
        session['prediction'] = prediction
        session['others'] = others
        
        return redirect(url_for('result'))  # Redirect to result page
    
    # Feedback form handling
    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  # Error flag set karo
            return redirect(url_for('home'))  # Redirect karo
        else:
            # Current date aur time dd/mm/yy format mein
            submit_time = datetime.now().strftime("%d/%m/%y %H:%M:%S")
            # Feedback ko file mein save karo with date-time
            with open("feedback.txt", "a") as f:
                f.write(f"Date: {submit_time}, Name: {name}, Email: {email}, Feedback: {feedback}\n")
            session['feedback_submitted'] = True  # Success flag set karo
            print(f"Feedback received - Date: {submit_time}, Name: {name}, Email: {email}, Feedback: {feedback}")
            return redirect(url_for('home'))  # Redirect karo taaki repeat na ho
    
    # Feedback flags ko reset karo jab page normally load ho
    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():
    # Session se prediction aur others retrieve karo
    prediction = session.get('prediction')
    others = session.get('others', [])
    
    if not prediction:
        return redirect(url_for('home'))  # Agar session mein data nahi hai to home pe redirect
    
    return render_template("result.html", prediction=prediction, others=others)

if __name__ == "__main__":
    app.run(debug=True)