Feri007 commited on
Commit
de22e0f
·
verified ·
1 Parent(s): 4a3b47a

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -275
app.py DELETED
@@ -1,275 +0,0 @@
1
- import gradio as gr
2
- import json
3
- from collections import defaultdict
4
- from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
5
- from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
6
- from reportlab.lib import colors
7
- from reportlab.lib.enums import TA_RIGHT
8
- from reportlab.pdfbase import pdfmetrics
9
- from reportlab.pdfbase.ttfonts import TTFont
10
- from reportlab.lib.units import inch
11
- import difflib
12
-
13
- # -------------------------------------------------------
14
- # بارگذاری داده‌ها
15
- # -------------------------------------------------------
16
- def load_guidelines(json_file_path):
17
- try:
18
- with open(json_file_path, 'r', encoding='utf-8') as file:
19
- data = json.load(file)
20
- return data['guidelines']
21
- except Exception as e:
22
- print(f"Error loading JSON file: {e}")
23
- return []
24
-
25
- guidelines = load_guidelines("enriched_guidelines_with_lab_findings_completed.json")
26
-
27
- # -------------------------------------------------------
28
- # توابع تحلیل
29
- # -------------------------------------------------------
30
- def analyze_symptoms(symptoms_input, guidelines):
31
- symptoms_input = [s.lower().strip() for s in symptoms_input.split(',') if s.strip()]
32
- matched_diseases = defaultdict(lambda: {'score': 0, 'matched_symptoms': [], 'alarm_matched': False, 'full_guideline_data': None})
33
-
34
- key_symptoms_weights = {
35
- 'signs of liver decompensation': 2.0,
36
- 'bloody diarrhea': 1.5,
37
- 'fever (≥38°c)': 1.3,
38
- 'abdominal pain (sudden or progressive)': 1.2,
39
- 'abdominal distension (ascites)': 1.2,
40
- 'back pain': 1.1,
41
- 'dyspepsia': 1.0,
42
- 'asymptomatic (incidental finding)': 0.8
43
- }
44
-
45
- for guideline in guidelines:
46
- disease_name = guideline.get('condition_name', 'Unknown')
47
- icd_code = guideline.get('icd_code', 'N/A')
48
- guideline_symptoms = [s.lower().strip() for s in guideline.get('symptoms', [])]
49
- alarm_features = guideline.get('alarm_features', {})
50
-
51
- matched_symptoms = [s for s in symptoms_input if s in guideline_symptoms]
52
- if matched_symptoms:
53
- score = sum([key_symptoms_weights.get(symptom, 1.0) for symptom in matched_symptoms])
54
- is_alarm_matched = any(
55
- symptom.lower() in str(alarm_features.values()).lower()
56
- for symptom in matched_symptoms
57
- )
58
- matched_diseases[disease_name] = {
59
- 'score': score,
60
- 'icd_code': icd_code,
61
- 'matched_symptoms': matched_symptoms,
62
- 'alarm_matched': is_alarm_matched,
63
- 'full_guideline_data': guideline
64
- }
65
-
66
- results = []
67
- total_score = sum(d['score'] for d in matched_diseases.values())
68
-
69
- if total_score == 0:
70
- return []
71
-
72
- for disease_name, data in matched_diseases.items():
73
- probability = (data['score'] / total_score) * 100
74
- if data['alarm_matched']:
75
- probability *= 1.5
76
- probability = max(min(probability, 100), 5)
77
-
78
- results.append({
79
- 'disease_name': disease_name,
80
- 'icd_code': data['icd_code'],
81
- 'probability': round(probability, 2),
82
- 'matched_symptoms': ', '.join(data['matched_symptoms']),
83
- 'full_data': data['full_guideline_data']
84
- })
85
-
86
- results.sort(key=lambda x: x['probability'], reverse=True)
87
- return results
88
-
89
-
90
- # -------------------------------------------------------
91
- # تحلیل آزمایش‌ها
92
- # -------------------------------------------------------
93
- synonyms = {
94
- "ast": ["ast", "sgot", "aspartate aminotransferase"],
95
- "alt": ["alt", "sgpt", "alanine aminotransferase"],
96
- "serum glucose": ["serum glucose", "glucose", "blood sugar"],
97
- "bilirubin": ["bilirubin", "total bilirubin"],
98
- "alkaline phosphatase": ["alkaline phosphatase", "alp"],
99
- "albumin": ["albumin", "serum albumin"],
100
- "prothrombin time": ["prothrombin time", "pt", "protime"],
101
- "creatinine": ["creatinine", "serum creatinine"],
102
- "platelets": ["platelets", "plts"],
103
- "hemoglobin": ["hemoglobin", "hgb"],
104
- "wbc": ["wbc", "white blood cell count"]
105
- }
106
-
107
- def normalize_test_name(name):
108
- name = name.lower().strip()
109
- for key, syns in synonyms.items():
110
- if name in syns:
111
- return key
112
- for key in synonyms.keys():
113
- if difflib.get_close_matches(name, synonyms[key], cutoff=0.7):
114
- return key
115
- return name
116
-
117
- def check_condition(user_value, expected):
118
- try:
119
- user_val = float(user_value)
120
- if expected.startswith("<="):
121
- return user_val <= float(expected[2:])
122
- elif expected.startswith(">="):
123
- return user_val >= float(expected[2:])
124
- elif expected.startswith("<"):
125
- return user_val < float(expected[1:])
126
- elif expected.startswith(">"):
127
- return user_val > float(expected[1:])
128
- else:
129
- return str(user_val) == expected
130
- except:
131
- return expected.lower() in user_value.lower() or user_value.lower() in expected.lower()
132
-
133
- def analyze_lab_results(lab_results_text, guidelines):
134
- lab_results_input = {}
135
- for line in lab_results_text.split('\n'):
136
- if ':' in line:
137
- key, value = line.split(':', 1)
138
- norm_key = normalize_test_name(key)
139
- lab_results_input[norm_key] = value.strip()
140
-
141
- matched_diseases = []
142
- for guideline in guidelines:
143
- disease_name = guideline.get('condition_name', 'Unknown')
144
- icd_code = guideline.get('icd_code', 'N/A')
145
- lab_findings = guideline.get('lab_findings', {})
146
-
147
- matches = []
148
- for lab_test, criteria in lab_findings.items():
149
- norm_test = normalize_test_name(lab_test)
150
- if norm_test in lab_results_input:
151
- user_value = lab_results_input[norm_test]
152
- expected = str(criteria.get('expected', '')).strip()
153
- meaning = criteria.get('meaning', '')
154
- if check_condition(user_value, expected):
155
- matches.append({
156
- 'test': lab_test,
157
- 'user_value': user_value,
158
- 'expected': expected,
159
- 'meaning': meaning
160
- })
161
-
162
- if matches:
163
- matched_diseases.append({
164
- 'disease_name': disease_name,
165
- 'icd_code': icd_code,
166
- 'lab_matches': matches,
167
- 'full_data': guideline
168
- })
169
-
170
- return matched_diseases
171
-
172
-
173
- # -------------------------------------------------------
174
- # ترکیب نتایج و رابط کاربری Gradio
175
- # -------------------------------------------------------
176
- def combined_analysis_for_ui(symptoms, lab_results_text):
177
- symptom_results = analyze_symptoms(symptoms, guidelines)
178
- lab_results = analyze_lab_results(lab_results_text, guidelines)
179
-
180
- if not symptom_results and not lab_results:
181
- return [], "❌ هیچ بیماری مرتبطی یافت نشد.", [], []
182
-
183
- symptom_table_data = []
184
- for r in symptom_results:
185
- symptom_table_data.append([r['disease_name'], r['icd_code'], f"{r['probability']}%", r['matched_symptoms']])
186
-
187
- lab_results_html = ""
188
- if lab_results:
189
- lab_results_html += "<h4>🧪 تحلیل بر اساس آزمایش‌ها:</h4>"
190
- for lab in lab_results:
191
- lab_results_html += f"<b>{lab['disease_name']}</b> (ICD: {lab['icd_code']})<br>"
192
- for match in lab['lab_matches']:
193
- lab_results_html += f" - <b>{match['test']}</b>: {match['user_value']} (انتظار: {match['expected']}) → {match['meaning']}<br>"
194
- lab_results_html += "<br>"
195
-
196
- return symptom_table_data, lab_results_html, symptom_results, lab_results
197
-
198
-
199
- # -------------------------------------------------------
200
- # ساخت رابط Gradio
201
- # -------------------------------------------------------
202
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
203
- gr.Markdown("<h2 style='text-align:center;color:#2E86C1;'>💡 سیستم هوشمند تحلیل علائم و آزمایش‌ها</h2>")
204
-
205
- with gr.Row():
206
- symptoms_input = gr.Textbox(label="✅ علائم (با کاما جدا کنید)")
207
- lab_results_input = gr.Textbox(label="🧪 نتایج آزمایش (هر خط: نام: مقدار)")
208
-
209
- analyze_button = gr.Button("🔍 تحلیل کن")
210
-
211
- with gr.Row():
212
- with gr.Column(scale=2):
213
- symptom_table_output = gr.Dataframe(headers=["بیماری", "ICD", "احتمال", "علائم منطبق"], interactive=False)
214
- lab_results_output = gr.HTML()
215
-
216
- with gr.Column(scale=3):
217
- detailed_output = gr.HTML()
218
-
219
- symptom_results_state = gr.State()
220
- lab_results_state = gr.State()
221
-
222
- analyze_button.click(
223
- fn=combined_analysis_for_ui,
224
- inputs=[symptoms_input, lab_results_input],
225
- outputs=[symptom_table_output, lab_results_output, symptom_results_state, lab_results_state]
226
- )
227
-
228
- # -------------------------------------------------------
229
- # تابع نمایش جزئیات هر بیماری
230
- # -------------------------------------------------------
231
- def show_details(evt: gr.SelectData, symptom_results):
232
- if evt is None or evt.index is None:
233
- return "هیچ بیماری انتخاب نشده است."
234
-
235
- # evt.index معمولاً اندیس ردیف است
236
- selected_row = evt.index[0] if isinstance(evt.index, (list, tuple)) else evt.index
237
- if selected_row < 0 or selected_row >= len(symptom_results):
238
- return "بیماری انتخاب شده معتبر نیست."
239
-
240
- disease = symptom_results[selected_row]["full_data"]
241
- html = f"<h4>{disease.get('condition_name','Unknown')}</h4>"
242
-
243
- if disease.get('diagnosis_criteria'):
244
- html += "<b>معیارهای تشخیصی:</b><ul>"
245
- for item in disease['diagnosis_criteria']:
246
- html += f"<li>{item}</li>"
247
- html += "</ul>"
248
-
249
- if disease.get('alarm_features'):
250
- html += "<b>علائم هشدار:</b><ul>"
251
- for k, v in disease['alarm_features'].items():
252
- html += f"<li><b>{k}</b>: {v}</li>"
253
- html += "</ul>"
254
-
255
- if disease.get('first_line_treatment'):
256
- html += "<b>درمان خط اول:</b><ul>"
257
- for t in disease['first_line_treatment']:
258
- html += f"<li>{t}</li>"
259
- html += "</ul>"
260
-
261
- return html
262
-
263
-
264
- # -------------------------------------------------------
265
- # اتصال رویداد انتخاب جدول به تابع جزئیات
266
- # -------------------------------------------------------
267
- symptom_table_output.select(
268
- fn=show_details,
269
- inputs=[symptom_results_state],
270
- outputs=detailed_output
271
- )
272
-
273
-
274
- if __name__ == "__main__":
275
- demo.launch()