File size: 9,215 Bytes
4b00aa2
e673c68
 
 
 
4b00aa2
 
e673c68
 
 
 
 
4b00aa2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e673c68
 
 
 
4b00aa2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e673c68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4b00aa2
e673c68
 
 
 
 
 
 
4b00aa2
 
e673c68
4b00aa2
e673c68
4b00aa2
e673c68
 
 
4b00aa2
e673c68
4b00aa2
e673c68
 
 
 
 
 
 
 
 
 
4b00aa2
e673c68
4b00aa2
e673c68
 
 
 
4b00aa2
e673c68
 
 
 
 
4b00aa2
 
e673c68
4b00aa2
 
 
 
e673c68
4b00aa2
 
 
 
 
 
 
e673c68
4b00aa2
 
 
 
 
e673c68
 
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# app.py

import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
import gradio as gr

# — Download NLTK resources if they’re missing —
#    (Only needs to be run once per environment)
nltk.download("punkt")
nltk.download("wordnet")

forward_rules = {
    "cold": ["Aconitum napellus", "Allium cepa"],
    "fever": ["Gelsemium", "Belladonna", "Ferrum phosphoricum"],
    "dry cough": ["Bryonia alba", "Drosera rotundifolia"],
    "wet cough": ["Antimonium tartaricum", "Pulsatilla"],
    "headache": ["Belladonna", "Glonoinum", "Nux vomica"],
    "sore throat": ["Mercurius solubilis", "Belladonna"],
    "watery eyes": ["Euphrasia", "Allium cepa"],
    "runny nose": ["Allium cepa", "Arsenicum album"],
    "constipation": ["Nux vomica", "Alumina", "Bryonia alba"],
    "dandruff": ["Thuja occidentalis", "Sulphur", "Graphites"],
    "diarrhea": ["Podophyllum peltatum", "Aloe socotrina"],
    "indigestion": ["Carbo vegetabilis", "Nux vomica"],
    "acidity": ["Robinia", "Natrum phosphoricum"],
    "gas": ["Lycopodium clavatum", "Carbo vegetabilis"],
    "toothache": ["Chamomilla", "Plantago major"],
    "earache": ["Belladonna", "Pulsatilla"],
    "vomiting": ["Ipecacuanha", "Arsenicum album"],
    "nausea": ["Nux vomica", "Ipecacuanha"],
    "menstrual pain": ["Magnesia phosphorica", "Pulsatilla"],
    "acne": ["Hepar sulphuris", "Sulphur"],
    "eczema": ["Graphites", "Sulphur"],
    "asthma": ["Blatta orientalis", "Ipecacuanha"],
    "insomnia": ["Coffea cruda", "Passiflora incarnata"],
    "anxiety": ["Argentum nitricum", "Aconitum napellus"],
    "depression": ["Ignatia amara", "Natrum muriaticum"],
    "fatigue": ["Kali phosphoricum", "Gelsemium sempervirens"],
    "sciatica": ["Colocynthis", "Gnaphalium polycephalum"],
    "joint pain": ["Rhus toxicodendron", "Bryonia alba"],
    "back pain": ["Calcarea phosphorica", "Rhus toxicodendron"],
    "arthritis": ["Causticum", "Bryonia alba"],
    "sprain": ["Arnica montana", "Ruta graveolens"],
    "injury": ["Arnica montana", "Calendula officinalis"],
    "burns": ["Cantharis vesicatoria", "Calendula officinalis"],
    "urinary infection": ["Cantharis vesicatoria", "Berberis vulgaris"],
    "kidney stone": ["Berberis vulgaris", "Lycopodium clavatum"],
    "hair fall": ["Lycopodium clavatum", "Silicea"],
    "allergy": ["Allium cepa", "Histaminum hydrochloricum"],
    "migraine": ["Sanguinaria canadensis", "Iris versicolor"],
    "psoriasis": ["Arsenicum album", "Sulphur"],
    "warts": ["Thuja occidentalis", "Causticum"],
    "cold sore": ["Natrum muriaticum", "Rhus toxicodendron"],
    "eye infection": ["Euphrasia officinalis", "Belladonna"],
    "mouth ulcer": ["Borax", "Mercurius solubilis"],
    "bleeding gums": ["Phosphorus", "Arnica montana"],
    "palpitation": ["Digitalis purpurea", "Cactus grandiflorus"],
    "hypertension": ["Natrum muriaticum", "Crataegus oxyacantha"],
    "arrhythmia": ["Digitalis purpurea", "Cactus grandiflorus"],
    "high cholesterol": ["Lycopodium clavatum", "Plumbum metallicum"],
    "diabetes": ["Syzygium jambolanum", "Phosphorus"],
    "obesity": ["Calcarea carbonica", "Lycopodium clavatum"],
    "hypothyroidism": ["Thyroidinum", "Calcarea carbonica"],
    "hyperthyroidism": ["Iodum", "Spongia tosta"],
    "anemia": ["Ferrum metallicum", "China officinalis"],
    "bronchitis": ["Bryonia alba", "Antimonium tartaricum"],
    "sinusitis": ["Kali bichromicum", "Sanguinaria canadensis"],
    "rosacea": ["Belladonna", "Hepar sulphuris"],
    "varicose veins": ["Hamamelis virginiana", "Pulsatilla"],
    "hemorrhoids": ["Aesculus hippocastanum", "Nux vomica"],
    "vertigo": ["Conium maculatum", "Gelsemium sempervirens"],
    "tinnitus": ["Chininum sulphuricum", "China officinalis"],
    "low libido": ["Kreosotum", "Damiana"],
    "impotence": ["Caladium seguinum", "Agnus castus"],
    "menopause hot flashes": ["Sepia officinalis", "Lachesis mutus"],
    "menstrual irregularity": ["Pulsatilla", "Sepia officinalis"],
    "pcos": ["Apis mellifica", "Lycopodium clavatum"],
    "cystitis": ["Cantharis vesicatoria", "Staphysagria"],
    "gastritis": ["Nux vomica", "Arsenicum album"],
    "peptic ulcer": ["Arsenicum album", "Nux vomica"],
    "gout": ["Benzoicum acidum", "Colchicum autumnale"],
    "fibromyalgia": ["Rhus toxicodendron", "Kali phosphoricum"],
    "rheumatoid arthritis": ["Causticum", "Rhus toxicodendron"],
    "lupus": ["Sulphur", "Arsenicum album"],
    "seborrheic dermatitis": ["Sepia officinalis", "Graphites"],
    "vitiligo": ["Arsenicum bromatum", "Natrum muriaticum"],
    "alopecia areata": ["Phosphorus", "Sepia officinalis"],
    "copd": ["Arsenicum album", "Bryonia alba"],
    "pneumonia": ["Antimonium tartaricum", "Bryonia alba"],
    "influenza": ["Influenzinum", "Gelsemium sempervirens"],
    "tonsillitis": ["Belladonna", "Mercurius solubil"],
    "gingivitis": ["Mercurius solubil", "Arsenicum album"],
    "halitosis": ["Mercurius solubil", "Carbo vegetabilis"],
    "oral thrush": ["Borax", "Mercurius solubil"],
    "shingles": ["Rhus toxicodendron", "Mezereum"],
    "chickenpox": ["Rhus toxicodendron", "Antimonium tartaricum"],
    "measles": ["Euphrasia officinalis", "Aconitum napellus"],
    "mumps": ["Calcarea carbonica", "Aconitum napellus"],
    "whooping cough": ["Drosera rotundifolia", "Cocculus indicus"],
    "malaria": ["Chininum sulphuricum", "Gambogia"],
    "dengue": ["Echinacea angustifolia", "Eupatorium perfoliatum"],
    "jaundice": ["Chelidonium majus", "Carduus marianus"],
    "hepatitis": ["Chelidonium majus", "Phosphorus"],
    "cirrhosis": ["Chelidonium majus", "Podophyllum peltatum"],
    "osteoarthritis": ["Rhus toxicodendron", "Bryonia alba"],
    "osteoporosis": ["Calcarea phosphorica", "Silicea"],
    "bursitis": ["Rhus toxicodendron", "Bryonia alba"],
    "tendonitis": ["Arnica montana", "Ruta graveolens"],
    "carpal tunnel syndrome": ["Hypericum perforatum", "Arnica montana"],
    "chronic fatigue syndrome": ["Gelsemium sempervirens", "Kali phosphoricum"],
    "multiple sclerosis": ["Causticum", "Plumbum metallicum"]
}

def make_tag(text, bgcolor="#e0f7fa", fgcolor="#006064"):
    return (
        f'<span style="display:inline-block; background-color:{bgcolor}; '
        f'color:{fgcolor}; padding:4px 8px; border-radius:12px; '
        f'margin:2px; font-weight:600;">{text}</span>'
    )

lemmatizer = WordNetLemmatizer()

def preprocess(text: str):
    """
    Tokenize + lemmatize, just in case you want lemmatized tokens
    for future extensions. We won’t use this for exact phrase matching,
    but it may help if you want to add more advanced NLP logic later.
    """
    tokens = word_tokenize(text.lower())
    lemmas = [lemmatizer.lemmatize(token) for token in tokens]
    return lemmas

def homeopathy_bot(user_input: str) -> str:
    """
    1. Try forward lookup: check if any symptom‐phrase is literally a substring
       of user_input.lower()
    2. If not found, do reverse lookup: check if any remedy‐phrase is in user_input.lower()
    """
    raw = user_input.lower()
    html_chunks = []

    # 1) Forward lookup (symptom → remedies)
    for symptom, meds in forward_rules.items():
        if symptom in raw:
            html_chunks.append(f"<p>💊 Suggested medicines for {make_tag(symptom)}:</p>")
            med_tags = " ".join(
                make_tag(m, bgcolor="#e8f5e9", fgcolor="#1b5e20") for m in meds
            )
            html_chunks.append(f"<p>{med_tags}</p>")
            return "\n".join(html_chunks)  # Once matched, return immediately

    # 2) Reverse lookup (remedy → symptoms)
    #    Loop through every (symptom, [meds]) pair and see if any med is in raw.
    related_symptoms = []
    med_found = ""
    for symptom, meds in forward_rules.items():
        for med in meds:
            if med.lower() in raw:
                related_symptoms.append(symptom)
                med_found = med
    if related_symptoms:
        html_chunks.append(
            f"<p>{make_tag(med_found, bgcolor='#ffe0b2', fgcolor='#e65100')} is used for:</p>"
        )
        unique_symptoms = sorted(set(related_symptoms))
        symptom_tags = " ".join(make_tag(s) for s in unique_symptoms)
        html_chunks.append(f"<p>{symptom_tags}</p>")
        return "\n".join(html_chunks)

    # 3) If nothing matches
    html_chunks.append(
        "<p style='color:#b71c1c; font-weight:600;'>"
        "❌ Sorry, I couldn’t find any matches. Try another symptom or medicine.</p>"
    )
    return "\n".join(html_chunks)

# Build the Gradio interface
demo = gr.Interface(
    fn=homeopathy_bot,
    inputs=gr.Textbox(
        lines=2,
        placeholder="Type a symptom/disease (e.g., 'cold', 'headache') or a medicine name…",
        label="Your Query"
    ),
    outputs=gr.HTML(label="Response"),
    title="🩺 Homeopathy Chatbot",
    description=(
        "Enter a symptom/disease to get suggested homeopathic remedies, "
        "or enter a medicine name to see which conditions it’s used for. "
        "Results appear as colorful tags!"
    ),
    theme="huggingface",
    allow_flagging="never"   # ← disable the 🏴 flag button
)

if __name__ == "__main__":
    demo.launch()