Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import time | |
| from collections import defaultdict | |
| # Load the symptom-to-disease mapping | |
| symptom_data = { | |
| "Shortness of breath": { | |
| "questions": [ | |
| "Do you also have chest pain?", | |
| "Do you feel fatigued often?", | |
| "Have you noticed swelling in your legs?" | |
| ], | |
| "diseases": ["Atelectasis", "Emphysema", "Edema"], | |
| "weights_yes": [30, 30, 40], | |
| "weights_no": [10, 20, 30] | |
| }, | |
| "Persistent cough": { | |
| "questions": [ | |
| "Is your cough dry or with mucus?", | |
| "Do you experience fever?", | |
| "Do you have difficulty breathing?" | |
| ], | |
| "diseases": ["Pneumonia", "Fibrosis", "Infiltration"], | |
| "weights_yes": [35, 30, 35], | |
| "weights_no": [10, 15, 20] | |
| }, | |
| "Sharp chest pain": { | |
| "questions": [ | |
| "Does it worsen with deep breaths?", | |
| "Do you feel lightheaded?", | |
| "Have you had recent trauma or surgery?" | |
| ], | |
| "diseases": ["Pneumothorax", "Effusion", "Cardiomegaly"], | |
| "weights_yes": [40, 30, 30], | |
| "weights_no": [15, 20, 25] | |
| }, | |
| "Fatigue & swelling": { | |
| "questions": [ | |
| "Do you feel breathless when lying down?", | |
| "Have you gained weight suddenly?", | |
| "Do you experience irregular heartbeat?" | |
| ], | |
| "diseases": ["Edema", "Cardiomegaly"], | |
| "weights_yes": [50, 30, 20], | |
| "weights_no": [20, 15, 15] | |
| }, | |
| "Chronic wheezing": { | |
| "questions": [ | |
| "Do you have a history of smoking?", | |
| "Do you feel tightness in your chest?", | |
| "Do you have frequent lung infections?" | |
| ], | |
| "diseases": ["Emphysema", "Fibrosis"], | |
| "weights_yes": [40, 30, 30], | |
| "weights_no": [15, 25, 20] | |
| } | |
| } | |
| # Global variables to track user state | |
| user_state = {} | |
| def chatbot(user_input): | |
| if "state" not in user_state: | |
| user_state["state"] = "greet" | |
| if user_state["state"] == "greet": | |
| user_state["state"] = "ask_symptom" | |
| return "Hello! I'm a medical AI assistant. Please describe your primary symptom." | |
| elif user_state["state"] == "ask_symptom": | |
| if user_input not in symptom_data: | |
| return "I don't recognize that symptom. Please enter one of these: " + ", ".join(symptom_data.keys()) | |
| user_state["symptom"] = user_input | |
| user_state["state"] = "ask_duration" | |
| return "How long have you been experiencing this symptom? (Less than a week / More than a week)" | |
| elif user_state["state"] == "ask_duration": | |
| if user_input.lower() == "less than a week": | |
| user_state.clear() | |
| return "It might be a temporary issue. Please monitor your symptoms and consult a doctor if they persist." | |
| elif user_input.lower() == "more than a week": | |
| user_state["state"] = "follow_up" | |
| user_state["current_question"] = 0 | |
| user_state["disease_scores"] = defaultdict(int) | |
| return symptom_data[user_state["symptom"]]["questions"][0] | |
| else: | |
| return "Please respond with 'Less than a week' or 'More than a week'." | |
| elif user_state["state"] == "follow_up": | |
| symptom = user_state["symptom"] | |
| question_index = user_state["current_question"] | |
| # Update probabilities | |
| if user_input.lower() == "yes": | |
| for i, disease in enumerate(symptom_data[symptom]["diseases"]): | |
| user_state["disease_scores"][disease] += symptom_data[symptom]["weights_yes"][i] | |
| else: | |
| for i, disease in enumerate(symptom_data[symptom]["diseases"]): | |
| user_state["disease_scores"][disease] += symptom_data[symptom]["weights_no"][i] | |
| # Move to the next question or finish | |
| user_state["current_question"] += 1 | |
| if user_state["current_question"] < len(symptom_data[symptom]["questions"]): | |
| return symptom_data[symptom]["questions"][user_state["current_question"]] | |
| # Final diagnosis | |
| probable_disease = max(user_state["disease_scores"], key=user_state["disease_scores"].get) | |
| user_state.clear() | |
| return f"Based on your symptoms, the most likely condition is: {probable_disease}. Please consult a doctor for confirmation." | |
| # Gradio Chatbot UI with improved features | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Conversational Image Recognition Assistant: AI-Powered X-ray Diagnosis for Healthcare") | |
| chatbot_ui = gr.Chatbot() | |
| user_input = gr.Textbox(placeholder="Enter your response...", label="Your Message") | |
| submit = gr.Button("Send") | |
| clear_chat = gr.Button("Clear Chat") | |
| def respond(user_message, history): | |
| history.append((user_message, "Thinking...")) # Show thinking message | |
| yield history, "" # Immediate update | |
| time.sleep(1.5) # Simulate processing delay | |
| bot_response = chatbot(user_message) | |
| history[-1] = (user_message, bot_response) # Update with real response | |
| yield history, "" | |
| submit.click(respond, [user_input, chatbot_ui], [chatbot_ui, user_input]) | |
| user_input.submit(respond, [user_input, chatbot_ui], [chatbot_ui, user_input]) | |
| clear_chat.click(lambda: ([], ""), outputs=[chatbot_ui, user_input]) | |
| demo.launch() |