엑셀 파싱 이원화(표준/인벤터) 및 자재 분류기(Plate, H-Beam, Swagelok) 개선

This commit is contained in:
Hyungi Ahn
2026-01-08 11:14:25 +09:00
parent 6ad1ef7aad
commit afea8428b2
7 changed files with 1059 additions and 1290 deletions

View File

@@ -13,10 +13,18 @@ LEVEL1_TYPE_KEYWORDS = {
"VALVE": ["VALVE", "GATE", "BALL", "GLOBE", "CHECK", "BUTTERFLY", "NEEDLE", "RELIEF", "SIGHT GLASS", "STRAINER", "밸브", "게이트", "", "글로브", "체크", "버터플라이", "니들", "릴리프", "사이트글라스", "스트레이너"],
"FLANGE": ["FLG", "FLANGE", "플랜지", "프랜지", "ORIFICE", "SPECTACLE", "PADDLE", "SPACER", "BLIND", "REDUCING FLANGE", "RED FLANGE"],
"PIPE": ["PIPE", "TUBE", "파이프", "배관", "SMLS", "SEAMLESS"],
"FITTING": ["SOCK-O-LET", "WELD-O-LET", "ELL-O-LET", "THREAD-O-LET", "ELB-O-LET", "NIP-O-LET", "COUP-O-LET", "SOCKOLET", "WELDOLET", "ELLOLET", "THREADOLET", "ELBOLET", "NIPOLET", "COUPOLET", "OLET", "ELBOW", "ELL", "TEE", "REDUCER", "CAP", "COUPLING", "NIPPLE", "SWAGE", "PLUG", "엘보", "", "리듀서", "", "니플", "커플링", "플러그", "CONC", "ECC"],
"FITTING": [
"SOCK-O-LET", "WELD-O-LET", "ELL-O-LET", "THREAD-O-LET", "ELB-O-LET", "NIP-O-LET", "COUP-O-LET",
"SOCKOLET", "WELDOLET", "ELLOLET", "THREADOLET", "ELBOLET", "NIPOLET", "COUPOLET", "OLET",
"ELBOW", "ELL", "TEE", "REDUCER", "CAP", "COUPLING", "NIPPLE", "SWAGE", "PLUG",
"엘보", "", "리듀서", "", "니플", "커플링", "플러그", "CONC", "ECC",
"SWAGELOK", "UNION", "CONNECTOR", "FERRULE", "NUT & FERRULE", "MALE CONNECTOR", "FEMALE CONNECTOR"
],
"GASKET": ["GASKET", "GASK", "가스켓", "SWG", "SPIRAL"],
"INSTRUMENT": ["GAUGE", "TRANSMITTER", "SENSOR", "THERMOMETER", "계기", "게이지", "트랜스미터", "센서"],
"SUPPORT": ["URETHANE BLOCK", "URETHANE", "BLOCK SHOE", "CLAMP", "SUPPORT", "HANGER", "SPRING", "우레탄", "블록", "클램프", "서포트", "행거", "스프링"]
"SUPPORT": ["URETHANE BLOCK", "URETHANE", "BLOCK SHOE", "CLAMP", "SUPPORT", "HANGER", "SPRING", "우레탄", "블록", "클램프", "서포트", "행거", "스프링"],
"PLATE": ["PLATE", "PL", "CHECKER PLATE", "판재", "철판"],
"STRUCTURAL": ["H-BEAM", "BEAM", "ANGLE", "CHANNEL", "H-SECTION", "I-BEAM", "형강", "앵글", "채널"]
}
# Level 2: 서브타입 키워드 (구체화)
@@ -171,6 +179,37 @@ def classify_material_integrated(description: str, main_nom: str = "",
# 긴 키워드부터 확인 (FLANGE BOLT가 FLANGE보다 먼저 매칭되도록)
sorted_keywords = sorted(keywords, key=len, reverse=True)
for keyword in sorted_keywords:
# [강화된 로직] 짧은 키워드나 중의적 키워드에 대한 엄격한 검사
is_strict_match = True
# 1. "PL" 키워드 검사 (PLATE)
if keyword == "PL":
# 단독 단어이거나 숫자 뒤에 붙는 경우만 허용 (예: 10PL, 10 PL)
# COUPLING, NIPPLE, PLUG 등에 포함된 PL은 제외
pl_pattern = r'(\b|\d)PL\b'
if not re.search(pl_pattern, desc_upper):
is_strict_match = False
# 2. "ANGLE" 키워드 검사 (STRUCTURAL)
elif keyword == "ANGLE" or keyword == "앵글":
# VALVE와 함께 쓰이면 제외 (ANGLE VALVE)
if "VALVE" in desc_upper or "밸브" in desc_upper:
is_strict_match = False
# 3. "UNION" 키워드 검사 (FITTING)
elif keyword == "UNION":
# 계장용인지 파이프용인지 구분은 fitting_classifier에서 하되,
# 여기서는 일단 FITTING으로 잡히도록 둠.
pass
# 4. "BEAM" 키워드 검사 (STRUCTURAL)
elif keyword == "BEAM":
# "BEAM CLAMP" 같은 경우 SUPPORT로 가야 함 (SUPPORT가 우선순위 높으므로 괜찮음)
pass
if not is_strict_match:
continue
# 전체 문자열에서 찾기
if keyword in desc_upper:
detected_types.append((material_type, keyword))