46  스팸 분류기 (Spam Classifier)

광고나 원치 않는 이메일을 필터링해 주는 스팸 분류기를 만들어 봅시다. 머신러닝 기술을 사용하여 이메일의 내용을 분석하고, 스팸인지 아닌지 자동으로 판별하는 것이 목표입니다.

이 프로젝트는 자연어 처리(NLP)와 텍스트 분류 알고리즘(Naive Bayes 등)의 작동 원리를 익히기에 아주 좋은 과제입니다. 특히 최근 대규모 언어 모델을 활용하여 더 정교하게 스팸을 필터링하는 독창적인 시스템을 직접 설계해 보세요.

46.1 주요 개발 포인트

  • 텍스트 데이터 전처리 (Preprocessing): 불용어(Stopwords) 제거, 토큰화(Tokenization), 스테밍(Stemming) 등을 통해 텍스트를 정제합니다.
  • 특징 추출 (Feature Extraction): TF-IDF나 CountVectorizer를 사용하여 텍스트 데이터를 숫자로 변환합니다.
  • 머신러닝 모델 선택 (Model Selection): Naive Bayes, Support Vector Machine(SVM), Logistic Regression 등 다양한 분류 모델을 테스트합니다.
  • 모델 훈련 및 성능 평가 (Evaluation): 정확도(Accuracy), 정밀도(Precision), 재현율(Recall) 등을 지표로 사용하여 모델의 성능을 측정합니다.
  • 사용자 인터페이스 (GUI): 이메일 본문을 입력하고 스팸 여부를 즉시 확인하는 UI를 구축합니다.

46.2 Python 구현 예시 (Naive Bayes 기반 간단한 스팸 분류 로직)

# 실제 구현 시 scikit-learn, nltk 등을 활용합니다.
# from sklearn.feature_extraction.text import CountVectorizer
# from sklearn.naive_bayes import MultinomialNB

class SpamClassifier:
    """
    이메일 내용을 분석하여 스팸(Spam) 또는 햄(Ham, 정상)으로 분류합니다.
    """
    def __init__(self):
        # self.vectorizer = CountVectorizer()
        # self.model = MultinomialNB()
        print("스팸 분류 엔진 초기화 완료.")

    def train_model(self, emails, labels):
        """
        제공된 데이터로 분류기 모델을 훈련시킵니다.
        """
        # X = self.vectorizer.fit_transform(emails)
        # self.model.fit(X, labels)
        print("모델 훈련이 완료되었습니다.")

    def predict_spam(self, email_text):
        """
        새로운 이메일이 스팸인지 예측합니다. (시뮬레이션)
        """
        print(f"분석 중: {email_text[:50]}...")
        
        # 간단한 키워드 기반 시뮬레이션
        spam_keywords = ["대출", "무료", "당첨", "축하", "광고"]
        is_spam = any(k in email_text for k in spam_keywords)
        
        result = "스팸" if is_spam else "정상"
        print(f"분류 결과: {result}")
        return result

if __name__ == "__main__":
    classifier = SpamClassifier()
    
    # 모델 훈련 (시나리오)
    train_emails = ["무료 당첨 기회를 놓치지 마세요!", "내일 회의 시간 변경 안내", "초저금리 대출 즉시 승인"]
    train_labels = ["스팸", "정상", "스팸"]
    classifier.train_model(train_emails, train_labels)
    
    # 예측 테스트
    classifier.predict_spam("안녕하세요, 지난번에 말씀하신 자료 보냅니다.")
    classifier.predict_spam("대출 광고: 지금 바로 신청하세요!")