70 lines
3.7 KiB
Python
70 lines
3.7 KiB
Python
"""
|
|
Mental health crisis and self-harm detection engine.
|
|
"""
|
|
|
|
import re
|
|
from typing import Optional, Tuple
|
|
|
|
from app.ai.prompt_rules.safety_rules import CRISIS_KEYWORDS_EN, CRISIS_KEYWORDS_INDIC
|
|
|
|
|
|
TRANSLITERATED_CRISIS_PHRASES = [
|
|
"saaganam pola irukku", "uyiroda irukka virumbala", "saaga poraen", "valave pidikala",
|
|
"mar jane ka man", "apne aap ko nuksan", "khudkushee",
|
|
"chani povali", "sathokobeku",
|
|
]
|
|
|
|
|
|
def check_crisis(user_message: str, lang: str = "en") -> Tuple[bool, Optional[str], Optional[str]]:
|
|
"""
|
|
Evaluates patient message for mental health crisis or self-harm intent.
|
|
Returns: (is_crisis, reason, crisis_reply)
|
|
"""
|
|
if not user_message or not user_message.strip():
|
|
return False, None, None
|
|
|
|
# Check Indic script crisis keywords FIRST against raw message
|
|
for kw in CRISIS_KEYWORDS_INDIC:
|
|
if kw in user_message:
|
|
reply = _build_crisis_reply(lang)
|
|
return True, f"Matched Indic crisis phrase: '{kw}'", reply
|
|
|
|
indic_extra = ["காயப்படுத்திக்கணும்", "கொல்லணும்", "வாழவே பிடிக்கல", "உயிரோட இருக்க", "தற்கொலை", "உயிரை"]
|
|
for kw in indic_extra:
|
|
if kw in user_message:
|
|
reply = _build_crisis_reply(lang)
|
|
return True, f"Matched Indic crisis phrase: '{kw}'", reply
|
|
|
|
msg = user_message.strip().lower()
|
|
msg_clean = re.sub(r"[^\w\s]", " ", msg)
|
|
msg_clean = re.sub(r"\s+", " ", msg_clean)
|
|
|
|
# Check English crisis keywords
|
|
for kw in CRISIS_KEYWORDS_EN:
|
|
kw_clean = re.sub(r"[^\w\s]", " ", kw.lower())
|
|
if re.search(rf"\b{re.escape(kw_clean)}\b", msg_clean) or kw.lower() in msg:
|
|
reply = _build_crisis_reply(lang)
|
|
return True, f"Matched crisis phrase: '{kw}'", reply
|
|
|
|
# Check Transliterated crisis phrases
|
|
for kw in TRANSLITERATED_CRISIS_PHRASES:
|
|
if kw in msg_clean or kw in msg:
|
|
reply = _build_crisis_reply(lang)
|
|
return True, f"Matched transliterated crisis phrase: '{kw}'", reply
|
|
|
|
return False, None, None
|
|
|
|
|
|
def _build_crisis_reply(lang: str) -> str:
|
|
lang_clean = lang.lower() if lang else "en"
|
|
if lang_clean.startswith("ta"):
|
|
return "உங்களுக்கு மன உளைச்சல் இருந்தால், தயவுசெய்து டெலி-மானாஸ் (Tele-MANAS) உதவி எண் 14416-ஐ தொடர்பு கொள்ளவும் அல்லது மருத்துவமனை ஊழியர்களிடம் தெரிவிக்கவும்."
|
|
elif lang_clean.startswith("hi"):
|
|
return "यदि आप परेशानी में हैं, तो कृपया तुरंत टेली-मानस (Tele-MANAS) 14416 पर संपर्क करें या अस्पताल के कर्मचारियों को सूचित करें।"
|
|
elif lang_clean.startswith("te"):
|
|
return "మీరు తీవ్రమైన ఒత్తిడిలో ఉంటే, దయచేసి టెలి-మానస్ (Tele-MANAS) 14416 కు ఫోన్ చేయండి లేదా ఆసుపత్రి సిబ్బందికి చెప్పండి."
|
|
elif lang_clean.startswith("kn"):
|
|
return "ನೀವು ಮನೋಒತ್ತಡದಲ್ಲಿದ್ದರೆ, ದಯವಿಟ್ಟು ಟೆಲಿ-ಮಾನಸ್ (Tele-MANAS) 14416 ಗೆ ಕರೆ ಮಾಡಿ ಅಥವಾ ಆಸ್ಪತ್ರೆಯ ಸಿಬ್ಬಂದಿಗೆ ತಿಳಿಸಿ."
|
|
else:
|
|
return "If you're in distress, please reach out to Tele-MANAS at 14416 or alert the hospital staff right now."
|