주제 분류 (ex) 논문 주제 분류 - 컴퓨터(AI, 데이터베이스, 그래픽, 암호학, etc...))
이메일 스팸 분류
감성 분류 (ex) 영화 리뷰, 제품 리뷰, 정치 리뷰, 예측(선거 결과))
여러 측면이 있을 수 있지만 간단한 작업에 집중
감정적, 태도적, 성격적 측면
주어진 텍스트가 긍정적 태도를 보이고 있는지, 부정적 태도를 보이고 있는지.
언어 분류 (영어? 한국어? 프랑스어?)
문서 분류 방법
규칙 기반 모델
단어들 조합을 사용한 규칙들 사용
ex) spam : black-list-address OR ("dollars" AND "you have been selected")
Precision(정확도)은 높지만 recall(예외적 상황 커버 힘듦)이 낮음
Snorkel (규칙 기반 모델 + 머신러닝 모델)
각각 규칙을 'labeling function'으로 간주
Graphical model 일종인 factor graph를 사용해 확률적 목표값을 생성하는 generative model
프로젝트 초기 labeled data가 부족하거나 클래스 정의 자체가 애매한 경우(하지만 규칙을 생성하는 것은 쉽다 가정)에 매우 유용한 방법
확률적 목표값이 생성된 후 딥모델 등 다양한 모델 사용 가능
지도학습
Input
a document - d
a fixed set of classes - C={c_1, c_2, ..., c_J}
A trasining set of m hand-labeled documents - (d_1, c_1), ...., (d_m, c_m)
Output
a learned classifier - γ : d -> c
다양한 모델 사용 가능
Naive Bayes
Naive Bayes 가정과 Bag of Words 표현에 기반한 간단한 모델
Bag of Words - 가방 안에 단어를 담고 섞는다!
순서를 고려하지 않은 단어들의 집합 (단어의 빈도수만 고려)
Naive Bayes 분류기
수식화
P(c|d) = P(d|c)P(c) / P(d)
분모는 최적의 클래스를 찾는데 상관이 없는 부분이라 빼도 된다.
위 문제를 해결하기 위하여 다음과 같은 2가지 가정을 사용한다.
Bag of Words 가정 : 위치는 확률에 영향을 주지 않는다.
조건부 독립(Conditional independence) 가정 : 클래스가 주어지면 속성들은 독립적이다.
가정들을 적용시킨 후의 수식
Naive Bayes 분류기는 입력값에 관한 선형 모델이다.
학습
MLE (Maximum Likelihood Estimation)
N_doc = 학습 데이터에 들어 있는 모든 문서의 수
Zero 확률문제(단어가 한 번도 나오지 않았을 시 나타나는 문제)를 개선하기 위한 Leplacel(add-1) smoothing
모든 단어들의 최소 빈도를 1로 설정하는 굉장히 간단한 방법.
알고리즘
function TRAIN NAIVE BAYES(D, C) return log P(c) and log P(w|c)
for each class c∈C #Calculate P(c) terms
N_doc = number of documents in D
N_c = number of documents from D in class c
logprior[c] <- log(N_c / N_doc)
V <- vocabulary of D
bigdoc[c] <- append(d) for d∈D with class c
for each word w in V # Calculate P(w|c) terms
count(w,c) <- of occurrences of w in bigdoc[c]
loglikelihood[w, c] <- log(count(w, c) + 1 / sigma_w'(count(w',c)+1))
return logprior, loglikelihood, V
function TEST NAIVE BAYES(testdoc, logprior, loglikelihood, C, V) return best c
for each class c∈C
sum[c] <- logprior[c]
for each position i in testdoc
word <- testdoc[i]
if word ∈ V
sum[c] <- sum[c]+loglikelihood[word, c]
return logprior, loglikelihood, V