import re class LogScorer: """로그 텍스트의 시맨틱 가치를 판별하여 점수화하는 모듈 (SWVW)""" # 업무 가치 범주별 가중치 정의 # 1.0: 핵심 의사결정/계약, 0.7: 지능형/권한관리, 0.4: 일반관리, 0.1: 단순활동 WEIGHT_MAP = { "CORE": 1.0, # 설계변경, 실정보고, 계약, 정산 등 (추후 확장 대비) "INTELLIGENT": 0.7, # AI요약, PDF변환, 분석 등 "AUTH": 0.6, # 권한 추가, 보안 설정 등 "MGMT": 0.4, # 업로드, 수정, 이름 변경 등 "SIMPLE": 0.2, # 다운로드, 삭제, 생성 등 "AUTO": 0.0 # 자동 삭제, 시스템 로그 등 } # 범주별 키워드 정의 (실무 문맥 반영) KEYWORDS = { "CORE": ["보고", "계약", "정산", "설계", "검토", "승인", "공문", "통보"], "INTELLIGENT": ["AI", "요약", "변환", "PDF"], "AUTH": ["권한", "참여자", "관리자", "보안"], "MGMT": ["업로드", "수정", "변경", "첨부", "추가"], "SIMPLE": ["다운로드", "생성", "이동", "삭제"], "AUTO": ["자동", "시스템"] } @classmethod def get_score(cls, log_text): """로그 텍스트를 분석하여 0.0 ~ 1.0 사이의 가치 점수를 반환""" if not log_text or log_text == "데이터 없음": return 0.0 # 날짜 부분 제거 (예: "2024.03.01, " 제거) clean_log = re.sub(r'^\d{2,4}\.\d{2}\.\d{2},\s*', '', log_text) # 1. 특정 키워드 매칭을 통한 기본 범주 판별 for category, keywords in cls.KEYWORDS.items(): if any(k in clean_log for k in keywords): # '자동 삭제'는 별도 처리 if category == "SIMPLE" and "자동" in clean_log: return cls.WEIGHT_MAP["AUTO"] return cls.WEIGHT_MAP[category] return 0.3 # 기본값 (분류되지 않은 활동) @classmethod def calculate_work_density(cls, logs): """로그 목록을 받아 평균 업무 밀도 산출""" if not logs: return 0.0 scores = [cls.get_score(log) for log in logs] return sum(scores) / len(scores) # 테스트 코드 if __name__ == "__main__": test_logs = [ "2026.03.30, 하도급 계약 통보서 검토", "2026.03.25, AI요약 완료", "2026.03.20, 부관리자 권한 추가", "2026.03.15, 파일 업로드", "2026.03.10, 폴더 자동 삭제" ] for log in test_logs: print(f"Log: {log} => Score: {LogScorer.get_score(log)}")