HUTAMS_AUDIO/app/services/analyzer.py

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