|
import gradio as gr |
|
from transformers import pipeline |
|
import pandas as pd |
|
import os |
|
|
|
|
|
classifier = pipeline( |
|
"text-classification", |
|
model="ashishkgpian/biolink_large_disease_classification" |
|
) |
|
|
|
|
|
icd9_data = pd.read_csv('D_ICD_DIAGNOSES.csv') |
|
icd9_data.columns = ['ROW_ID', 'ICD9_CODE', 'SHORT_TITLE', 'LONG_TITLE'] |
|
|
|
def preprocessing(test_df): |
|
test_df.loc[ |
|
test_df['ICD9_CODE'].str.startswith("V"), 'ICD9_CODE'] = test_df.ICD9_CODE.apply( |
|
lambda x: x[:4]) |
|
test_df.loc[ |
|
test_df['ICD9_CODE'].str.startswith("E"), 'ICD9_CODE'] = test_df.ICD9_CODE.apply( |
|
lambda x: x[:4]) |
|
test_df.loc[(~test_df.ICD9_CODE.str.startswith("E")) & ( |
|
~test_df.ICD9_CODE.str.startswith("V")), 'ICD9_CODE'] = test_df.ICD9_CODE.apply( |
|
lambda x: x[:3]) |
|
return test_df |
|
|
|
icd9_data = preprocessing(icd9_data) |
|
|
|
def classify_symptoms(text): |
|
try: |
|
results = classifier(text, top_k=5) |
|
formatted_results = [] |
|
for result in results: |
|
code = result['label'] |
|
code_info = icd9_data[icd9_data['ICD9_CODE'] == code] |
|
formatted_results.append({ |
|
"ICD9 Code": code, |
|
"Short Title": code_info['SHORT_TITLE'].iloc[0] if not code_info.empty else "N/A", |
|
"Long Title": code_info['LONG_TITLE'].iloc[0] if not code_info.empty else "N/A", |
|
"Confidence": f"{result['score']:.2%}" |
|
}) |
|
return formatted_results |
|
except Exception as e: |
|
return f"Error processing classification: {str(e)}" |
|
|
|
|
|
custom_css = """ |
|
.gradio-container { |
|
width: 100% !important; |
|
max-width: 100% !important; |
|
margin: 0 !important; |
|
padding: 0 !important; |
|
min-height: 100vh !important; |
|
display: flex !important; |
|
flex-direction: column !important; |
|
background-color: #000000 !important; |
|
color: #ffffff !important; |
|
} |
|
.main-container { |
|
text-align: center; |
|
padding: 2rem; |
|
margin: 0; |
|
background: #000000; |
|
width: 100%; |
|
color: #ffffff; |
|
} |
|
.content-wrapper { |
|
max-width: 1400px; |
|
margin: 0 auto; |
|
padding: 0 2rem; |
|
width: 100%; |
|
box-sizing: border-box; |
|
background: #000000; |
|
color: #ffffff; |
|
} |
|
h1 { |
|
color: #b388ff !important; |
|
font-size: 2.5rem !important; /* Reduced from 3rem */ |
|
margin-bottom: 0.5rem !important; |
|
font-weight: 700 !important; |
|
} |
|
h3 { |
|
color: #9575cd !important; |
|
font-size: 1.2rem !important; /* Reduced from 1.4rem */ |
|
font-weight: 500 !important; |
|
margin-bottom: 2rem !important; |
|
} |
|
.input-container { |
|
background: #121212 !important; |
|
padding: 2rem !important; |
|
border-radius: 12px !important; |
|
box-shadow: 0 4px 6px rgba(255, 255, 255, 0.05) !important; |
|
margin: 2rem 0 !important; |
|
width: 100% !important; |
|
border: 1px solid #333333 !important; |
|
} |
|
.input-container label { |
|
color: #ffffff !important; |
|
font-weight: 600 !important; |
|
font-size: 1rem !important; /* Reduced from 1.1rem */ |
|
margin-bottom: 0.5rem !important; |
|
background: transparent !important; |
|
} |
|
textarea { |
|
background: #1e1e1e !important; |
|
color: #ffffff !important; |
|
border: 2px solid #673ab7 !important; |
|
border-radius: 8px !important; |
|
padding: 1rem !important; |
|
font-size: 1.1rem !important; /* Reduced from 1.2rem */ |
|
min-height: 150px !important; |
|
width: 100% !important; |
|
} |
|
.submit-btn { |
|
background-color: #673ab7 !important; |
|
color: white !important; |
|
padding: 1rem 3rem !important; |
|
border-radius: 8px !important; |
|
font-size: 1.1rem !important; /* Reduced from 1.2rem */ |
|
margin-top: 1.5rem !important; |
|
transition: all 0.3s ease !important; |
|
width: auto !important; |
|
font-weight: 600 !important; |
|
border: none !important; |
|
} |
|
.submit-btn:hover { |
|
background-color: #5e35b1 !important; |
|
} |
|
.output-container { |
|
background: #121212 !important; |
|
padding: 2rem !important; |
|
border-radius: 12px !important; |
|
box-shadow: 0 4px 6px rgba(255, 255, 255, 0.05) !important; |
|
margin: 2rem 0 !important; |
|
width: 100% !important; |
|
border: 1px solid #333333 !important; |
|
color: #ffffff !important; |
|
} |
|
.output-container label { |
|
color: #ffffff !important; |
|
font-weight: 600 !important; |
|
font-size: 1rem !important; /* Reduced from 1.1rem */ |
|
margin-bottom: 1rem !important; |
|
background: transparent !important; |
|
} |
|
.examples-container { |
|
background: #121212 !important; |
|
padding: 2rem !important; |
|
border-radius: 12px !important; |
|
margin: 2rem 0 !important; |
|
box-shadow: 0 4px 6px rgba(255, 255, 255, 0.05) !important; |
|
width: 100% !important; |
|
border: 1px solid #333333 !important; |
|
color: #ffffff !important; |
|
} |
|
.examples-container label { |
|
color: #ffffff !important; |
|
font-weight: 600 !important; |
|
font-size: 1rem !important; /* Reduced from 1.1rem */ |
|
background: transparent !important; |
|
} |
|
.footer { |
|
text-align: center; |
|
padding: 2rem; |
|
background: #000000; |
|
margin-top: auto; |
|
width: 100%; |
|
border-top: 1px solid #333333; |
|
color: #ffffff; |
|
} |
|
""" |
|
|
|
with gr.Blocks(css=custom_css) as demo: |
|
with gr.Row(elem_classes=["main-container"]): |
|
with gr.Column(elem_classes=["content-wrapper"]): |
|
gr.Markdown( |
|
""" |
|
# 🏥 Clinical Symptom ICD9 Classifier |
|
### AI-Powered Medical Diagnosis Code Suggestion Tool |
|
""" |
|
) |
|
with gr.Row(elem_classes=["input-output-row"]): |
|
with gr.Column(elem_classes=["input-container"]): |
|
gr.Markdown("Clinical Symptom Description") |
|
with gr.Column(elem_classes=["inner-input-container"]): |
|
input_text = gr.Textbox( |
|
show_label=False, |
|
placeholder="Enter detailed patient symptoms and clinical observations...", |
|
lines=5 |
|
) |
|
submit_btn = gr.Button("Analyze Symptoms", elem_classes=["submit-btn"]) |
|
|
|
with gr.Column(elem_classes=["output-container"]): |
|
output = gr.JSON( |
|
label="Suggested ICD9 Diagnostic Codes with Descriptions" |
|
) |
|
|
|
with gr.Row(elem_classes=["examples-container"]): |
|
examples = gr.Examples( |
|
examples=[ |
|
["45-year-old male experiencing severe chest pain, radiating to left arm, with shortness of breath and excessive sweating"], |
|
["Persistent headache for 2 weeks, accompanied by dizziness and occasional blurred vision"], |
|
["Diabetic patient reporting frequent urination, increased thirst, and unexplained weight loss"], |
|
["Elderly patient with chronic knee pain, reduced mobility, and signs of inflammation"] |
|
], |
|
inputs=input_text, |
|
label="Example Clinical Cases" |
|
) |
|
|
|
submit_btn.click(fn=classify_symptoms, inputs=input_text, outputs=output) |
|
input_text.submit(fn=classify_symptoms, inputs=input_text, outputs=output) |
|
|
|
with gr.Row(elem_classes=["footer"]): |
|
gr.Markdown( |
|
""" |
|
⚕️ <strong>Medical Disclaimer:</strong> This AI tool is designed to assist medical professionals in ICD9 code classification. |
|
Always verify suggestions with clinical judgment and consult appropriate medical resources. |
|
""" |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch(share=True) |