|
|
|
|
|
|
|
|
import nltk |
|
|
from nltk.tokenize import word_tokenize |
|
|
from nltk.stem import WordNetLemmatizer |
|
|
import gradio as gr |
|
|
|
|
|
|
|
|
|
|
|
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 = [] |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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" |
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|