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()
|