Skinalyze / app.py
Code0ut's picture
Update app.py
6ffa4a5 verified
Raw
History Blame
4.02 kB
import os
import json
import re
import numpy as np
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
import torch
from torch.nn.functional import cosine_similarity
from sentence_transformers import SentenceTransformer
import gradio as gr
# Download necessary NLTK data
nltk.download('punkt_tab')
nltk.download('stopwords')
nltk.download('wordnet')
# Load dataset
dataset_path = "dataset.json"
if not os.path.exists(dataset_path):
raise FileNotFoundError(f"{dataset_path} not found. Please ensure the file is in the current directory.")
with open(dataset_path, "r") as f:
data = json.load(f)
disease_data = {d["name"]: d for d in data["diseases"]}
# Preprocessing
lemmatizer = WordNetLemmatizer()
stop_words = set(stopwords.words('english'))
medical_synonyms = {
"itchy": "itch", "pruritic": "itch", "rash": "eruption",
"redness": "red", "swollen": "swelling", "bumps": "lesion"
}
def advanced_preprocess_text(text):
text = text.lower()
text = re.sub(r'[^a-zA-Z\s]', ' ', text)
tokens = word_tokenize(text)
tokens = [medical_synonyms.get(token, token) for token in tokens]
tokens = [lemmatizer.lemmatize(token) for token in tokens if token not in stop_words]
return " ".join(tokens)
# Prepare disease descriptions
disease_names = []
disease_descriptions = []
for disease_name, details in disease_data.items():
disease_names.append(disease_name)
description = ""
if "symptoms" in details:
description += "Symptoms: " + " ".join(details["symptoms"]) + ". "
if "causes" in details:
description += "Causes: " + " ".join(details["causes"]) + ". "
if "cure" in details:
description += "Cure: " + " ".join(details["cure"]) + ". "
if "home_remedies" in details:
description += "Home Remedies: " + " ".join(details["home_remedies"]) + ". "
processed_desc = advanced_preprocess_text(description)
disease_descriptions.append(processed_desc)
# Load BERT model
bert_model = SentenceTransformer('all-MiniLM-L6-v2')
disease_embeddings = bert_model.encode(disease_descriptions, convert_to_tensor=True)
def gradio_chatbot(primary_symptom, location, associated_symptoms, duration, severity, additional_info):
user_input = " ".join([
primary_symptom, location, associated_symptoms, duration, severity, additional_info
])
processed_input = advanced_preprocess_text(user_input)
user_embedding = bert_model.encode(processed_input, convert_to_tensor=True)
similarities = cosine_similarity(user_embedding, disease_embeddings)
best_match_idx = torch.argmax(similarities).item()
predicted_disease = disease_names[best_match_idx]
details = disease_data.get(predicted_disease, {})
causes = ", ".join(details.get("causes", ["Not available"]))
cure = ", ".join(details.get("cure", ["Not available"]))
home_remedies = ", ".join(details.get("home_remedies", ["Not available"]))
response = (f"🩺 **Predicted Disease:** {predicted_disease}\n\n"
f"**Causes:** {causes}\n\n"
f"**Cure:** {cure}\n\n"
f"**Home Remedies:** {home_remedies}")
return response
iface = gr.Interface(
fn=gradio_chatbot,
inputs=[
gr.Textbox(label="1. Primary Symptom", placeholder="e.g., itching, rash"),
gr.Textbox(label="2. Location on Body", placeholder="e.g., face, arms"),
gr.Textbox(label="3. Associated Symptoms", placeholder="e.g., swelling, redness"),
gr.Textbox(label="4. Duration", placeholder="e.g., 2 days, 1 week"),
gr.Textbox(label="5. Severity (scale 1-10)", placeholder="e.g., 5"),
gr.Textbox(label="6. Additional Observations", placeholder="e.g., recent exposure, diet changes")
],
outputs="markdown",
title="Advanced Skin Disease AI Chatbot",
description="Answer a few questions about your symptoms and get a predicted skin disease along with recommended solutions."
)
iface.launch()