43 lines
2.2 KiB
Python
43 lines
2.2 KiB
Python
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
|
|
}
|