MMuzamilAI's picture
Update app.py
e673c68 verified
# 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()