File size: 6,511 Bytes
4bce033
 
 
af59780
4bce033
415e3b3
 
 
4bce033
 
 
 
 
 
 
04d4dca
 
 
4bce033
9412e3a
415e3b3
9412e3a
 
 
 
 
 
c4c0ccb
 
9412e3a
 
 
 
 
 
 
3461dfe
9412e3a
c4c0ccb
9412e3a
 
 
e477a54
9412e3a
044d565
3fddc37
 
9412e3a
3fddc37
 
9412e3a
 
 
4bce033
0e091b8
4bce033
9412e3a
ee1e608
725e817
04d4dca
9412e3a
 
 
55abb28
9412e3a
 
b0f8dd2
415e3b3
 
 
 
d0cf89f
415e3b3
5c7aeeb
 
 
 
 
 
 
bc22cbf
d0cf89f
 
e92438f
 
 
d0cf89f
5c7aeeb
d0cf89f
415e3b3
 
d0cf89f
 
 
415e3b3
 
04d4dca
 
 
 
 
 
415e3b3
 
 
 
 
 
 
 
 
 
04d4dca
415e3b3
 
 
 
 
 
 
 
 
e21a683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415e3b3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import streamlit as st
import json
import pandas as pd
import streamlit.components.v1 as components

if 'last_clicked_row' not in st.session_state:
    st.session_state['last_clicked_row'] = None
    
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("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("""
<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**.
        """)