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''' Read It Aloud

πŸ”Š Read It Aloud


''' # Streamlit App πŸš€ st.title("2πŸŽ“MedπŸ’‘Speech") # 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 = ['Melanoma', 'carcinoma','Constipation', 'Colon', 'Muscle', 'Rehabilitation', '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 = "".join([f"{key}: {value}" for key, value in options.items()]) # Concatenating with labels question_text = (f"QuestionNumber: {question_number}\r\n" f"Question: {question}\r\n" f"Options: {options_text}\r\n" 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(""" """, 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**. """)