베이즈 나이브를 직접 구현한 스팸 필터: 단어 빈도 기반

발행: (2026년 6월 18일 AM 12:40 GMT+9)
5 분 소요
원문: Dev.to

출처: Dev.to ![데브샨u 비스와스](https://media2.dev.to/dynamic/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev- to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3929385%2F75a3696c-143d-4252-ba59-6ed4083ca827.jpg) https://dev.to/dev48v

📨 인терактив 데모 (메시지 입력): https://dev48v.infy.uk/ml/day6-naive-bayes.html

나이브 베이스는 실제 스팸 필터를 수년 동안 사용해 왔으며, 그 훈련 과정은 단순히 단어 빈도를 세는 것뿐이며, 기울기 하강이나 반복과 같은 복잡한 연산을 필요로 하지 않는다. 단어 빈도를 세고, 베이지안 규칙을 적용하고, 곱한다.

이것은 MachineLearningFromZero의 Day 6 — 직접 구현한 알고리즘으로, 스카이-런치 없이.

  1. Bag of words — 순서가 중요하지 않다
    Naive Bayes treats a message as a set of words. “free cash now” and “now cash free” look identical to it. That throws away grammar, but for spam detection the words present matter far more than their order — and it makes the math tiny.

  2. 훈련 = 카운팅

for (const { text, label } of trainingData)
  for (const w of tokenize(text))
    counts[label][w]  = (counts[label][w] || 0)  + 1;

전면 전체 모드 진입
전면 전체 모드 종료

free and click flood spam; meeting and tomorrow live in ham. One pass over the data, done.

  1. 베이지안 규칙이 질문을 뒤집는다
P(spam | words) ∝ P(spam) × P(words | spam)

전면 전체 모드 진입
전면 전체 모드 종료

P(spam)prior(스팸이 얼마나 흔한지)를 의미하며, 증거는 단어의 가능성 확률에 의해 곱해진다.

  1. ‘Naive’ = 단어들이 독립이라고 가정한다
    빠르게 작동하는 핵심 트릭은 각 단어가 클래스 given 클래스 안에서 독립적이라고 가정하는 것이다. 따라서 가능성은 단순히 곱의 형태가 된다:
P(words | spam) = P(w1|spam) × P(w2|spam) × ... 

전면 전체 모드 진입
전면 전체 모드 종료

실제 단어는 독립적이지 않으며(“credit”와 “card”가 함께 나타나는 것처럼), 이는 naï브한 가정이지만 분류 결과는 놀랍게도 거의 정확하게 맞는다.

  1. 정규화 + 로그로 안정성 유지
    두 가지 실용적인 수정법이다. 모든 단어의 카운트에 1을 더해(라플라스 정규화) unseen 단어가 전체 곱을 영구히 0으로 만들지 않게 한다. 그리고 작은 확률을 직접 곱하는 대신 로그를 사용해 underflow가 발생하지 않도록 한다:
score[label] = Math.log(prior[label]);
for (const w of words)
  score[label] += Math.log((counts[label][w] + 1) / (totalWords[label] + V));

전면 전체 모드 진입
전면 전체 모드 종료

  1. 점수가 클수록 승리
return score.spam > score.ham ? "spam" : "ham";

전면 전체 모드 진입
전면 전체 모드 종료

두 점수를 Softmax 변환하면 확률이 되며, 데모에 표시된 바와 같다.

핵심 정리
단어 빈도를 세고 → 베이지안 규칙을 적용하고 → 로그를 사용해 곱한다 → 승자를 고른다. 이는 가장 간단한 분류기 중 하나이며, 작게 시작해도 충분히 동작하며, 텍스트 분류 작업에 대한 훌륭한 기본선으로 남아 있다. 실제 스팸 필터 체험해 보기 — 빨간 단어는 스팸을, 파란 단어는 햄을 가리킨다.

0 조회
Back to Blog

관련 글

더 보기 »