MedSpeech-012324 / backupapp.py
awacke1's picture
Update backupapp.py
b56e939
import streamlit as st
import json
import pandas as pd
import streamlit.components.v1 as components
# Initialize session state for tracking the last clicked row
if 'last_clicked_row' not in st.session_state:
st.session_state['last_clicked_row'] = None
# Function to load JSONL file into a DataFrame
def load_jsonl(file_path):
data = []
with open(file_path, 'r') as f:
for line in f:
data.append(json.loads(line))
return pd.DataFrame(data)
# Function to filter DataFrame by keyword
def filter_by_keyword(df, keyword):
return df[df.apply(lambda row: row.astype(str).str.contains(keyword).any(), axis=1)]
# Function to generate HTML with textarea
def generate_html_with_textarea(text_to_speak):
return f'''
<!DOCTYPE html>
<html>
<head>
<title>Read It Aloud</title>
<script type="text/javascript">
function readAloud() {{
const text = document.getElementById("textArea").value;
const speech = new SpeechSynthesisUtterance(text);
window.speechSynthesis.speak(speech);
}}
</script>
</head>
<body>
<h1>πŸ”Š Read It Aloud</h1>
<textarea id="textArea" rows="10" cols="80">
{text_to_speak}
</textarea>
<br>
<button onclick="readAloud()">πŸ”Š Read Aloud</button>
</body>
</html>
'''
# Streamlit App πŸš€
st.title("AI Medical Explorer with Speech Synthesis πŸŽ™")
# Dropdown for file selection
file_option = st.selectbox("Select file:", ["usmle_16.2MB.jsonl", "usmle_2.08MB.jsonl"])
st.write(f"You selected: {file_option}")
# Load data
large_data = load_jsonl("usmle_16.2MB.jsonl")
small_data = load_jsonl("usmle_2.08MB.jsonl")
data = large_data if file_option == "usmle_16.2MB.jsonl" else small_data
# Top 20 healthcare terms for USMLE
top_20_terms = ['Heart', 'Lung', 'Pain', 'Memory', 'Kidney', 'Diabetes', 'Cancer', 'Infection', 'Virus', 'Bacteria', 'Gastrointestinal', 'Skin', 'Blood', 'Surgery']
# Create Expander and Columns UI for terms
with st.expander("Search by Common Terms πŸ“š"):
cols = st.columns(4)
for term in top_20_terms:
with cols[top_20_terms.index(term) % 4]:
if st.button(f"{term}"):
filtered_data = filter_by_keyword(data, term)
st.write(f"Filter on '{term}' πŸ“Š")
with st.sidebar:
st.dataframe(filtered_data)
if not filtered_data.empty:
html_blocks = []
for idx, row in filtered_data.iterrows():
# Extracting fields from the row
question_number = idx + 1 # Assuming idx represents the question number
question = row.get("question", "No question field")
answer = row.get("answer", "No answer field")
options = row.get("options", {})
# Formatting options dictionary into a string
options_text = "<br>".join([f"{key}: {value}" for key, value in options.items()])
# Concatenating with labels
question_text = (f"QuestionNumber: {question_number}<br>"
f"Question: {question}<br>"
f"Options: {options_text}<br>"
f"Answer: {answer}")
# Generating HTML content
documentHTML5 = generate_html_with_textarea(question_text)
html_blocks.append(documentHTML5)
all_html = ''.join(html_blocks)
components.html(all_html, width=1280, height=1024)
# Text input for search keyword
search_keyword = st.text_input("Or, enter a keyword to filter data:")
if st.button("Search πŸ•΅οΈβ€β™€οΈ"):
filtered_data = filter_by_keyword(data, search_keyword)
st.write(f"Filtered Dataset by '{search_keyword}' πŸ“Š")
st.dataframe(filtered_data)
if not filtered_data.empty:
html_blocks = []
for idx, row in filtered_data.iterrows():
question_text = row.get("question", "No question field")
documentHTML5 = generate_html_with_textarea(question_text)
html_blocks.append(documentHTML5)
all_html = ''.join(html_blocks)
components.html(all_html, width=1280, height=1024)
# Inject HTML5 and JavaScript for styling
st.markdown("""
<style>
.big-font {
font-size:24px !important;
}
</style>
""", unsafe_allow_html=True)
# Markdown and emojis for the case presentation
st.markdown("# πŸ₯ Case Study: 32-year-old Woman's Wellness Check")
st.markdown("## πŸ“‹ Patient Information")
st.markdown("""
- **Age**: 32
- **Gender**: Female
- **Past Medical History**: Asthma, Hypertension, Anxiety
- **Current Medications**: Albuterol, Fluticasone, Hydrochlorothiazide, Lisinopril, Fexofenadine
- **Vitals**
- **Temperature**: 99.5Β°F (37.5Β°C)
- **Blood Pressure**: 165/95 mmHg
- **Pulse**: 70/min
- **Respirations**: 15/min
- **Oxygen Saturation**: 98% on room air
""")
# Clinical Findings
st.markdown("## πŸ“‹ Clinical Findings")
st.markdown("""
- Cardiac exam reveals a S1 and S2 heart sound with a normal rate.
- Pulmonary exam is clear to auscultation bilaterally with good air movement.
- Abdominal exam reveals a bruit, normoactive bowel sounds, and an audible borborygmus.
- Neurological exam reveals cranial nerves II-XII as grossly intact with normal strength and reflexes in the upper and lower extremities.
""")
# Next Step Options
st.markdown("## πŸ€” What is the best next step in management?")
# Multiple Choice
options = ["Blood Test", "MRI Scan", "Ultrasound with Doppler", "Immediate Surgery"]
choice = st.selectbox("", options)
# Explanation
if st.button("Submit"):
if choice == "Ultrasound with Doppler":
st.success("Correct! πŸŽ‰")
st.markdown("""
### Explanation
The patient's high blood pressure coupled with an abdominal bruit suggests the possibility of renal artery stenosis.
An **Ultrasound with Doppler** is the best next step for assessing blood flow and evaluating for renal artery stenosis.
""")
else:
st.error("Incorrect. 😞")
st.markdown("""
The best next step is **Ultrasound with Doppler**.
""")