주제 분류 (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
띄어쓰기가 잘 지켜지지 않고 띄어쓰기가 제대로 되어도 한 어절은 하나 이상의 의미 단위들이 있을 수 있다.
형태소(morpheme) : 뜻을 가진 가장 작은 말의 단위
자립형태소 : 명사, 대명사, 부사 등
의존형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사 등
단어보다 작은 단위(subword)로 토큰화가 필요하다.
Subword Tokenization
만약 학습데이터에서 보지 못한 새로운 단어가 나타나면
학습데이터 : low, new, newer
테스트 데이터 : lower
-er, -est 등과 같은 형태소를 분리할 수 있으면 좋을 것
Subword tokenization algorithms
Byte-Pair Encoding (BPE)
WordPiece : 위와 유사한데 좀 더 확률적 개념을 활용해 향상시킨 모델
Unigram language modeling : 완전 확률을 기반한 모델
두 가지 구성요소
Token learner : 말뭉치에서 vocabulary (token들 집합)을 만들어 냄
Token segmenter : 새로운 문장을 토큰화함.
Byte Pair Encoding(BPE)
알고리즘 과정
Vocabulary를 단일 문자들 집합으로 초기화한다.
다음을 반복
말뭉치에서 연속적으로 가장 많이 발생하는 두 개 기호들(vocabulary 내 원소들)을 찾음
두 기호들을 병합해 새로운 기호로 vocabulary에 추가
말뭉치에서 그 두 기호들을 병합된 기호로 모두 교체
위 과정을 k번 병합이 일어날 때까지 반복
기호병합은 단어 안에서만 이뤄짐. 이것을 위해 단어끝을 나타내는 특수기호 '_'을 단어 뒤에 추가함. 그리고 각 단어를 문자 단위로 쪼갠다.
ex corpus ) low low low low low lowest lowest newer newer newer newer newer newer wider wider wider new new
corpus 5 l o w _ 2 l o w e s t _ 6 n e w e r _ 3 w i d e r _ 2 n e w _
vocabulary _, d, e, i, l, n, o, r, s, t, w
e r을 er로 병합 corpus 5 l o w _ 2 l o w e s t _ 6 n e w er _ 3 w i d er _ 2 n e w _
vocabulary _, d, e, i, l, n, o, r, s, t, w, er
er _을 er_로 병합 corpus 5 l o w _ 2 l o w e s t _ 6 n e w er_ 3 w i d er_ 2 n e w _
vocabulary _, d, e, i, l, n, o, r, s, t, w, er, er_
n e을 ne로 병합 corpus 5 l o w _ 2 l o w e s t _ 6 ne w er_ 3 w i d er_ 2 ne w _
vocabulary _, d, e, i, l, n, o, r, s, t, w, er, er_, ne
다음과 같은 병합들이 일어남 MergeCurrent Vocabulary (ne, w) _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new (l, o) _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo (lo, w) _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low (new, er_) _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low, newer_ (low, er_) _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low, newer_, low_
Token segmenter
새로운 단어가 주어졌을 때 어떻게 토큰화할 것인지?
Greedy한 적용 : 병합 학습한 순서대로 적용 ("e r" => "er")
자주 나타나는 단어는 하나의 토큰으로 병합됨
드문 단어는 subword 토큰들로 분할됨
하나의 단어 "n e w e r _"은 하나의 토큰 "newer_"로 토큰화됨
하나의 단어 "l o w e r _"은 두 개 토큰들 "low er_"로 토큰화됨
WordPiece
기호들의 쌍을찾을 때 빈도수(BPE) 대신 likelihood를 최대화시키는 쌍을 찾음
ex) Corpus C
5 l o w _ 2 l o w e s t _ 6 n e w e r _ 3 w i d e r _ 2 n e w _
Corpus C_1
5 l o w _ 2 l o w e s t _ 6 n e w er _ 3 w i d er _ 2 n e w _
Corpus C_2
5 lo w _ 2 lo w e s t _ 6 n e w e r _ 3 w i d e r _ 2 n e w _
P(C_1) > P(C_2)이면 "er" 생성
Unigram
확률모델(언어모델)을 사용
학습데이터 내 문장을 관측(observed) 확률변수로 정의
Tokenization을 잠재(latent) 확률변수로 정의
연속적(Sequential) 변수
데이터 주변 우도(marginal likelihood)를 최대화시키는 tokenization을 구함