87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
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
|