64 lines
2.7 KiB
Python
64 lines
2.7 KiB
Python
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)}")
|