# -*- coding: utf-8 -*- """자동차관리법 기반 차량 규격 표준 상수 자동차관리법 시행규칙 별표1 기준 차종 분류 및 규격 범위. OCR 값 검증 및 교차 검증에 사용. Ported from OCR_Vehicle_02. """ # ── 차종 (규모 x 유형 조합) ── VEHICLE_TYPES = { "경형승용", "소형승용", "중형승용", "대형승용", "경형승합", "소형승합", "중형승합", "대형승합", "경형화물", "소형화물", "중형화물", "대형화물", "경형특수", "소형특수", "중형특수", "대형특수", "소형이륜", "중형이륜", "대형이륜", } # ── 용도 ── USAGE_TYPES = {"자가용", "영업용", "관용"} # ── 연료타입 ── FUEL_TYPES = { "휘발유", "경유", "LPG", "CNG", "LNG", "전기", "수소전기", "수소", "하이브리드", "휘발유+전기", "경유+전기", "LPG+전기", "플러그인하이브리드", "휘발유+전기(PHEV)", "경유+전기(PHEV)", "기타", } # OCR 오인식 보정 매핑 FUEL_TYPE_CORRECTIONS = { "수소전키": "수소전기", "수소전거": "수소전기", "수소전기차": "수소전기", "수소전": "수소전기", "휘발": "휘발유", "디젤": "경유", "가솔린": "휘발유", "엘피지": "LPG", "액화석유가스": "LPG", "천연가스": "CNG", "압축천연가스": "CNG", } # ── 잡음 패턴: 안내문구/법률 텍스트 필터링 ── NOISE_PATTERNS = [ "말합니다", "증명합니다", "과태료", "위반", "무보험", "사유발생일", "변경등록", "말소등록", "검사 시행", "자동차등록규칙", "별지", "번호판교부", "형사고발", "범칙금", "벌점", "위반시", "보험에 가입", "의무보험", "소유권 이전", "자동차관리법", "도로교통법", "등록원부", ] # ── 차종별 규격 범위 (자동차관리법 시행규칙 별표1) ── DIMENSION_RANGES = { "경형승용": { "length_mm": (2500, 3700), "width_mm": (1200, 1700), "height_mm": (1200, 2100), "weight_kg": (500, 1400), "capacity": (2, 5), }, "소형승용": { "length_mm": (3500, 4800), "width_mm": (1400, 1800), "height_mm": (1200, 2100), "weight_kg": (800, 2100), "capacity": (4, 7), }, "중형승용": { "length_mm": (4200, 5100), "width_mm": (1650, 1950), "height_mm": (1200, 2100), "weight_kg": (1100, 2500), "capacity": (5, 7), }, "대형승용": { "length_mm": (4600, 5700), "width_mm": (1750, 2200), "height_mm": (1200, 2100), "weight_kg": (1400, 3500), "capacity": (5, 10), }, "경형승합": { "length_mm": (2500, 3700), "width_mm": (1300, 1700), "height_mm": (1400, 2100), "weight_kg": (600, 1500), "capacity": (6, 11), }, "소형승합": { "length_mm": (3600, 4800), "width_mm": (1500, 1800), "height_mm": (1700, 2200), "weight_kg": (1000, 3500), "capacity": (11, 15), }, "중형승합": { "length_mm": (4700, 9200), "width_mm": (1700, 2300), "height_mm": (1900, 3300), "weight_kg": (2500, 12000), "capacity": (16, 35), }, "대형승합": { "length_mm": (9000, 14000), "width_mm": (2300, 2600), "height_mm": (2800, 3900), "weight_kg": (8000, 25000), "capacity": (36, 80), }, "경형화물": { "length_mm": (2500, 3700), "width_mm": (1200, 1700), "height_mm": (1200, 2100), "weight_kg": (400, 1500), "capacity": (2, 3), }, "소형화물": { "length_mm": (3600, 4800), "width_mm": (1400, 1800), "height_mm": (1400, 2200), "weight_kg": (1000, 3500), "capacity": (2, 6), }, "중형화물": { "length_mm": (4700, 9500), "width_mm": (1700, 2400), "height_mm": (1800, 3600), "weight_kg": (3500, 10000), "capacity": (2, 3), }, "대형화물": { "length_mm": (7000, 14000), "width_mm": (2200, 2600), "height_mm": (2400, 4200), "weight_kg": (8000, 50000), "capacity": (2, 3), }, "소형특수": { "length_mm": (3000, 4800), "width_mm": (1400, 1800), "height_mm": (1400, 2600), "weight_kg": (1000, 3500), "capacity": (2, 3), }, "대형특수": { "length_mm": (5000, 16000), "width_mm": (2000, 2600), "height_mm": (2000, 4500), "weight_kg": (5000, 50000), "capacity": (2, 5), }, } # ── 차명별 표준 규격 (차명 → 고정 스펙) ── # 차명+차종이 같으면 규격이 동일하므로, OCR 누락/오인식 시 보충·교정에 사용 # 키: 차명 내 포함 키워드 (OCR 변형 대응), 값: 표준 규격 MODEL_SPECS = { # ── 현대 대형승합 ── "뉴슈퍼에어로시티저상": { "vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490", "height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44", "fuel_type": "경유", }, "뉴슈퍼에어로시티초저상": { "vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490", "height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44", "fuel_type": "경유", }, "슈퍼에어로시티": { "vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490", "height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44", "fuel_type": "경유", }, "일렉시티": { "vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490", "height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44", "fuel_type": "전기", }, "일렉시티수소": { "vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490", "height_mm": "3340", "total_weight_kg": "18000", "passenger_capacity": "33", "fuel_type": "수소전기", }, "유니버스": { "vehicle_type": "대형승합", "length_mm": "12000", "width_mm": "2490", "height_mm": "3575", "total_weight_kg": "18000", "passenger_capacity": "45", "fuel_type": "경유", }, # ── 현대 중형승합 ── "그린시티": { "vehicle_type": "중형승합", "length_mm": "9000", "width_mm": "2490", "height_mm": "3050", "total_weight_kg": "14000", "passenger_capacity": "33", "fuel_type": "경유", }, "카운티": { "vehicle_type": "소형승합", "length_mm": "7080", "width_mm": "2040", "height_mm": "2755", "total_weight_kg": "8500", "passenger_capacity": "25", "fuel_type": "경유", }, # ── 현대 화물 ── "마이티": { "vehicle_type": "소형화물", "length_mm": "6085", "width_mm": "1995", "height_mm": "2420", "total_weight_kg": "8500", "fuel_type": "경유", }, "파비스": { "vehicle_type": "중형화물", "length_mm": "8590", "width_mm": "2340", "height_mm": "2945", "total_weight_kg": "15000", "fuel_type": "경유", }, "엑시언트": { "vehicle_type": "대형화물", "length_mm": "11550", "width_mm": "2495", "height_mm": "3465", "total_weight_kg": "40000", "fuel_type": "경유", }, # ── 자일대우 대형승합 ── "BS110": { "vehicle_type": "대형승합", "length_mm": "11050", "width_mm": "2490", "height_mm": "3150", "total_weight_kg": "16500", "passenger_capacity": "43", "fuel_type": "경유", }, "BS106": { "vehicle_type": "대형승합", "length_mm": "10555", "width_mm": "2490", "height_mm": "3090", "total_weight_kg": "16000", "passenger_capacity": "40", "fuel_type": "경유", }, "FX120": { "vehicle_type": "대형승합", "length_mm": "12000", "width_mm": "2490", "height_mm": "3575", "total_weight_kg": "18000", "passenger_capacity": "45", "fuel_type": "경유", }, "FX116": { "vehicle_type": "대형승합", "length_mm": "11635", "width_mm": "2490", "height_mm": "3575", "total_weight_kg": "18000", "passenger_capacity": "43", "fuel_type": "경유", }, # ── 자일대우 중형승합 ── "레스타": { "vehicle_type": "소형승합", "length_mm": "7080", "width_mm": "2040", "height_mm": "2705", "total_weight_kg": "8500", "passenger_capacity": "25", "fuel_type": "경유", }, } def lookup_model_specs(model_name): """차명에서 표준 규격 조회. 키워드 포함 매칭 (OCR 변형 대응). Args: model_name: OCR로 추출한 차명 문자열 Returns: dict or None: 매칭된 표준 규격 딕셔너리 """ if not model_name: return None # 공백 제거 후 매칭 clean = model_name.replace(' ', '') # 1. 긴 키워드부터 매칭 (초저상 > 저상 > 에어로시티 순) for keyword in sorted(MODEL_SPECS.keys(), key=len, reverse=True): if keyword in clean: return MODEL_SPECS[keyword] # 2. 영문 모델명 (대소문자 무시) clean_upper = clean.upper() for keyword in MODEL_SPECS: if keyword.upper() in clean_upper: return MODEL_SPECS[keyword] return None # ── 차종 미확인 시 전체 허용 범위 ── UNIVERSAL_RANGES = { "length_mm": (1400, 16000), "width_mm": (500, 2600), "height_mm": (800, 4500), "weight_kg": (70, 50000), "capacity": (1, 80), "model_year": (1970, 2030), }