"""Step 4 스모크 테스트: Kiwi user_dict 로 compound 토큰 보존 실측. 목적: 1) S/W, H/W, 2D, 3D 가 user_word 로 단일 토큰으로 잡히는가 2) 실제 corpus 문장에서 분절 없이 유지되는가 3) phrase canonical (결과혁신, 과정혁신, 디지털전환, 3D모델, 2D도면) 도 user_dict 에 넣으면 단일 NNG 로 유지되는가 본 Step 4 진행 여부를 결정하는 관찰용 테스트. 어떤 파일도 수정하지 않음. """ from kiwipiepy import Kiwi print("=" * 70) print("[Baseline] user_dict 없는 Kiwi") print("=" * 70) kiwi_base = Kiwi() BASELINE_TESTS = [ 'S/W 개발', '(S/W,H/W)와', '2D 도면', '3D 모델', '결과 혁신', '결과혁신', '디지털 전환', '디지털전환', ] for s in BASELINE_TESTS: toks = [(t.form, t.tag) for t in kiwi_base.tokenize(s)] print(f" {s:25s} → {toks}") print() print("=" * 70) print("[A-1 user_dict] S/W, H/W, 2D, 3D + phrase canonical 등록") print("=" * 70) kiwi = Kiwi() # compound (영문/기호 포함) kiwi.add_user_word('S/W', 'SL', 9.0) kiwi.add_user_word('H/W', 'SL', 9.0) kiwi.add_user_word('2D', 'SL', 9.0) kiwi.add_user_word('3D', 'SL', 9.0) # phrase canonical (한글) kiwi.add_user_word('결과혁신', 'NNG', 9.0) kiwi.add_user_word('과정혁신', 'NNG', 9.0) kiwi.add_user_word('디지털전환', 'NNG', 9.0) kiwi.add_user_word('필수조건', 'NNG', 9.0) kiwi.add_user_word('의사소통', 'NNG', 9.0) kiwi.add_user_word('시행착오', 'NNG', 9.0) # 혼합 token kiwi.add_user_word('3D모델', 'NNG', 9.0) kiwi.add_user_word('2D도면', 'NNG', 9.0) # AS-IS/TO-BE (실제 표기형 As-is / To-Be 등록) kiwi.add_user_word('As-is', 'SL', 9.0) kiwi.add_user_word('To-Be', 'SL', 9.0) # 실제 corpus 문장 (actual_text_nodes.yaml 에서 뽑은 진짜 예시) CORPUS_TESTS = [ # S/W '다양한 기술적도구(S/W,H/W)와 Process의 효과적인 통합', '다양한 형태의 Solution S/W 개발 역량 Programmer', 'Engn. S/W의 구성 과 특징', '디지털 전환(DX)은 S/W가 필수다.', # H/W 'H/W 적 요소', # 2D / 3D '평면적 2D 설계방식', '개념, 도서, 행정 절차 중심 2D 도면, 전문가, 규정', '3D 형상 기반 다양한 형태의 정보물로 공사관계자간 소통 강화', '3D 모델 중심 기존 성과품 유지', '2D 도면', '3D 모델', # phrase canonical (치환 후 형태) '결과혁신을 추구', '과정혁신과 결과혁신', '디지털전환의 기반', '3D모델 기반 설계', '2D도면 중심', # phrase variants (치환 전 형태 - user_dict 만으로 잡힐지) '결과 혁신', '결과의 혁신', 'Product의 변화', '과정 혁신', 'Process 혁신', '디지털 전환', '필수 요건', '의사 소통', '시행 착오', # AS-IS / TO-BE 'As-is [Analogue]', 'To-Be', 'To-be [Digital]', ] for s in CORPUS_TESTS: toks = [(t.form, t.tag) for t in kiwi.tokenize(s)] print(f" {s[:40]:40s} → {toks}") print() print("=" * 70) print("관전 포인트") print("=" * 70) print("1. 'S/W', 'H/W' 가 단일 SL 토큰으로 나오는가 (baseline 에서는 쪼개짐)") print("2. '2D', '3D' 가 단일 SL 토큰으로 나오는가") print("3. '결과혁신', '과정혁신' 붙여쓴 형태가 NNG 단일인가") print("4. '결과 혁신' (띄어쓴 형태) 는 여전히 [결과, 혁신] 분절인가") print(" → 그렇다면 pre-Kiwi phrase substitution 필수") print("5. '3D모델' (붙여쓴) vs '3D 모델' (띄어쓴) 분절 차이") print("6. 'As-is', 'To-Be' 가 단일 SL 로 유지되는가")