import re from typing import Dict, Any, Tuple CAREGIVER_PATTERNS = [ (r"(?:my\s*mother|my\s*mom|என்\s*அம்மா|அம்மாவுக்கு|मेरी\s*माँ|माँ\s*को|నా\s*తల్లి)", "mother"), (r"(?:my\s*father|my\s*dad|என்\s*அப்பா|அப்பாவுக்கு|मेरे\s*पिता|पिता\s*जी|నా\s*తండ్రి)", "father"), (r"(?:my\s*wife|my\s*husband|என்\s*மனைவி|என்\s*கணவர்|मेरी\s*पत्नी|मेरे\s*पति|నా\s*భార్య|నా\s*భర్త)", "spouse"), (r"(?:my\s*son|my\s*daughter|my\s*child|my\s*kid|என்\s*மகன்|என்\s*மகள்|என்\s*குழந்தை|मेरा\s*बेटा|मेरी\s*बेटी|నా\s*కొడుకు)", "child"), (r"(?:he\s*is|she\s*is|his\s*symptoms|her\s*symptoms|he\s*has|she\s*has|அவருக்கு|அவளுக்கு|उसको|उन्हें)", "relative") ] PATIENT_PATTERNS = [ r"(?:i\s*have|i\s*am|my\s*headache|my\s*chest|my\s*fever|my\s*pain|எனக்கு|எனக்குள்ள|मुझे|मेरे|నాకు)" ] def classify_speaker_turn(text: str) -> Dict[str, Any]: """ Dual-Speaker Diarization Classifier: Differentiates between direct Patient statements (1st Person) and Caregiver / Relative statements (3rd Person). Returns dictionary with speaker_type ('patient' vs 'caregiver'), relation, and formatted_label. """ txt_lower = (text or "").lower().strip() # 1. Check Caregiver / Relative Patterns for pattern, relation in CAREGIVER_PATTERNS: if re.search(pattern, txt_lower, re.IGNORECASE): label = f"Caregiver ({relation.capitalize()})" if relation != "relative" else "Caregiver" return { "speaker_type": "caregiver", "relation": relation, "formatted_label": label, "is_caregiver": True } # 2. Default to Patient Direct Statement return { "speaker_type": "patient", "relation": "self", "formatted_label": "Patient", "is_caregiver": False }