import re import os import logging from typing import Optional logger = logging.getLogger("uvicorn.error") def get_critical_keywords() -> list[str]: default_kw = ["탈선", "화재", "사상", "구호", "단전", "충돌"] # project_root/data/critical_keywords.txt base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) txt_path = os.path.join(base_dir, "data", "critical_keywords.txt") try: if os.path.exists(txt_path): with open(txt_path, "r", encoding="utf-8") as f: lines = [line.strip() for line in f if line.strip()] if lines: return lines except Exception as e: logger.warning(f"[Analyzer] 긴급 키워드 파일 읽기 실패, 기본값 사용: {e}") return default_kw CRITICAL_KEYWORDS = get_critical_keywords() def check_urgency(text: str) -> str: """텍스트 내 긴급 키워드가 포함되어 있는지 확인합니다.""" for kw in CRITICAL_KEYWORDS: if kw in text: return "긴급" return "일반" KOR_NUM_MAP: dict[str, str] = { "영": "0", "공": "0", "일": "1", "이": "2", "삼": "3", "사": "4", "오": "5", "육": "6", "칠": "7", "팔": "8", "구": "9" } def extract_train_number(text: str) -> Optional[str]: """ STT 텍스트에서 열차 번호("K1234", "3042", "삼공사이", "삼천사십이")를 추출합니다. """ # 1. 일반 영어+숫자 조합 (K1234, 1234 등) m1 = re.search(r'([Kk케이]?\s*\d{3,4})', text) if m1: num_str = m1.group(1).replace(" ", "").replace("케이", "K").upper() if num_str.startswith("K") or len(num_str) >= 3: return num_str # 2. 한글 숫자로 읽는 방식 매칭 ("삼공사이", "삼천사십이", "케이삼천사백") m2 = re.search(r'([Kk케이]?\s*[영공일이삼사오육칠팔구천백십]{2,10})', text) if m2: raw = m2.group(1).replace(" ", "").replace("케이", "K").upper() prefix = "K" if raw.startswith("K") else "" if prefix: raw = raw[1:] has_units = any(c in raw for c in ["천", "백", "십"]) res = 0 if not has_units: # "삼공사이" 방식 digits = "".join(KOR_NUM_MAP.get(c, "") for c in raw) if len(digits) >= 3: return f"{prefix}{digits}" else: # "삼천사십이" 방식 curr = 0 for ch in raw: if ch in KOR_NUM_MAP: curr = int(KOR_NUM_MAP[ch]) elif ch == "천": res += (curr if curr != 0 else 1) * 1000 curr = 0 elif ch == "백": res += (curr if curr != 0 else 1) * 100 curr = 0 elif ch == "십": res += (curr if curr != 0 else 1) * 10 curr = 0 res += curr if res >= 100: # 최소 3자리의 숫자값 보장 return f"{prefix}{res}" return None