Spaces:
Running
Running
| NEGATIVE_TERMS = ['clear', 'normal', 'unremarkable', 'no', 'negative', 'absent', 'within normal limits', 'stable'] | |
| POSITIVE_TERMS = ['opacity', 'infiltrate', 'consolidation', 'fracture', 'abnormal', 'effusion', 'edema', 'pneumothorax', 'cardiomegaly', 'mass', 'nodule', 'atelectasis'] | |
| CRITICAL_TERMS = ['acute', 'severe', 'large', 'extensive', 'pneumothorax', 'fracture', 'mass', 'suspicious'] | |
| MEDICAL_GLOSSARY = { | |
| 'pulmonary edema': 'Fluid buildup in the lungs, making breathing difficult', | |
| 'focal consolidation': 'Dense area in lung tissue, possibly indicating infection', | |
| 'pleural effusion': 'Fluid accumulation around the lungs', | |
| 'pneumothorax': 'Collapsed lung due to air leak', | |
| 'cardiomegaly': 'Enlarged heart', | |
| 'opacity': 'Cloudy area on X-ray, may indicate infection or fluid', | |
| 'infiltrate': 'Abnormal substance in lung tissue', | |
| 'atelectasis': 'Partial lung collapse', | |
| 'nodule': 'Small round growth in the lung', | |
| 'mass': 'Larger abnormal tissue growth requiring investigation', | |
| 'consolidation': 'Area where air spaces are filled with fluid or tissue', | |
| 'effusion': 'Abnormal fluid collection' | |
| } | |
| def structure_entities(entities): | |
| anatomy_entities = [] | |
| observation_entities = [] | |
| positive_findings = [] | |
| negative_findings = [] | |
| critical_findings = [] | |
| for entity in entities: | |
| if entity['label'] == 'ANATOMY': | |
| anatomy_entities.append(entity['text']) | |
| elif entity['label'] == 'OBSERVATION': | |
| observation_entities.append(entity['text']) | |
| obs_lower = entity['text'].lower() | |
| is_critical = any(term in obs_lower for term in CRITICAL_TERMS) | |
| is_negative = any(term in obs_lower for term in NEGATIVE_TERMS) | |
| is_positive = any(term in obs_lower for term in POSITIVE_TERMS) | |
| if is_critical: | |
| critical_findings.append(entity['text']) | |
| elif is_negative: | |
| negative_findings.append(entity['text']) | |
| elif is_positive: | |
| positive_findings.append(entity['text']) | |
| return { | |
| 'anatomy': list(set(anatomy_entities)), | |
| 'all_observations': observation_entities, | |
| 'positive_findings': list(set(positive_findings)), | |
| 'negative_findings': list(set(negative_findings)), | |
| 'critical_findings': list(set(critical_findings)) | |
| } | |
| def generate_summary(structured): | |
| total_entities = len(structured['anatomy']) + len(structured['all_observations']) | |
| anatomy_count = len(structured['anatomy']) | |
| observations_count = len(structured['all_observations']) | |
| has_critical = len(structured['critical_findings']) > 0 | |
| has_abnormalities = len(structured['positive_findings']) > 0 | |
| return { | |
| 'total_entities': total_entities, | |
| 'anatomy_count': anatomy_count, | |
| 'observations_count': observations_count, | |
| 'has_critical_findings': has_critical, | |
| 'has_abnormalities': has_abnormalities | |
| } | |
| def generate_patient_friendly_summary(structured): | |
| summary = { | |
| 'overall_status': '', | |
| 'key_findings': [], | |
| 'areas_of_concern': [], | |
| 'next_steps': [], | |
| 'explanation': '' | |
| } | |
| total_abnormalities = len(structured['positive_findings']) | |
| total_critical = len(structured['critical_findings']) | |
| if total_critical > 0: | |
| summary['overall_status'] = 'URGENT ATTENTION REQUIRED' | |
| summary['explanation'] = 'Your X-ray shows findings that need immediate medical attention. Please contact your doctor right away.' | |
| elif total_abnormalities > 0: | |
| summary['overall_status'] = 'ABNORMALITIES DETECTED' | |
| summary['explanation'] = 'Your X-ray shows some areas of concern that should be discussed with your doctor. This does not necessarily mean a serious problem, but follow-up is recommended.' | |
| else: | |
| summary['overall_status'] = 'NO MAJOR CONCERNS' | |
| summary['explanation'] = 'Your chest X-ray appears normal with no significant abnormalities detected. Continue regular health maintenance.' | |
| for finding in structured['positive_findings']: | |
| finding_lower = finding.lower() | |
| explanation = None | |
| for term, desc in MEDICAL_GLOSSARY.items(): | |
| if term in finding_lower: | |
| explanation = desc | |
| break | |
| summary['key_findings'].append({ | |
| 'finding': finding, | |
| 'explanation': explanation if explanation else 'Please consult your doctor for clarification on this finding' | |
| }) | |
| for critical in structured['critical_findings']: | |
| critical_lower = critical.lower() | |
| explanation = None | |
| for term, desc in MEDICAL_GLOSSARY.items(): | |
| if term in critical_lower: | |
| explanation = desc | |
| break | |
| summary['areas_of_concern'].append({ | |
| 'finding': critical, | |
| 'explanation': explanation if explanation else 'This requires immediate medical evaluation', | |
| 'severity': 'HIGH' | |
| }) | |
| if total_critical > 0: | |
| summary['next_steps'] = [ | |
| 'Contact your doctor immediately', | |
| 'Do not delay seeking medical attention', | |
| 'Bring this report to your appointment', | |
| 'Follow all recommended treatments' | |
| ] | |
| elif total_abnormalities > 0: | |
| summary['next_steps'] = [ | |
| 'Schedule a follow-up with your doctor within 1-2 weeks', | |
| 'Additional tests or imaging may be recommended', | |
| 'Discuss treatment options if needed', | |
| 'Monitor for any new or worsening symptoms' | |
| ] | |
| else: | |
| summary['next_steps'] = [ | |
| 'Maintain regular health check-ups', | |
| 'Continue healthy lifestyle practices', | |
| 'Report any new respiratory symptoms to your doctor', | |
| 'Follow recommended screening schedules' | |
| ] | |
| return summary | |
| def generate_recommendations(structured): | |
| recommendations = [] | |
| if len(structured['critical_findings']) > 0: | |
| recommendations.append("Immediate medical consultation required") | |
| recommendations.append("Consider emergency department visit if symptomatic") | |
| if len(structured['positive_findings']) > 0: | |
| recommendations.append("Follow-up imaging may be needed") | |
| recommendations.append("Consult with a pulmonologist or radiologist") | |
| if 'pneumothorax' in ' '.join(structured['positive_findings']).lower(): | |
| recommendations.append("Urgent evaluation for possible chest tube placement") | |
| if 'mass' in ' '.join(structured['positive_findings']).lower() or 'nodule' in ' '.join(structured['positive_findings']).lower(): | |
| recommendations.append("CT scan recommended for further evaluation") | |
| recommendations.append("Consider biopsy if clinically indicated") | |
| if 'effusion' in ' '.join(structured['positive_findings']).lower(): | |
| recommendations.append("Consider thoracentesis if symptomatic") | |
| if len(structured['critical_findings']) == 0 and len(structured['positive_findings']) == 0: | |
| recommendations.append("Continue routine health maintenance") | |
| recommendations.append("Repeat imaging only if clinically indicated") | |
| return recommendations | |