정보공간_1

[6기 신촌 김상훈] 텍스트 마이닝 #3 본문

IT 놀이터/Elite Member Tech & Talk

[6기 신촌 김상훈] 텍스트 마이닝 #3

알 수 없는 사용자 2014. 11. 10. 05:32

안녕하세요. 신촌멤버십 22-2기 김상훈입니다.

이번 포스팅에서는 Naive Bayes를 이용한 텍스트 마이닝에 대해 알아보겠습니다.



# 소개

 Naive Bayes는 확률 이론으로 데이터를 분류하는 방법으로 Bayes 정리 이론에 기반합니다. Naive Bayes에서 Naive는 이 확률 기법에서 종속성을 고려하지 않고 독립사건으로 가정하기 때문에 붙은 이름입니다. 텍스트 마이닝에서 자주 사용되며 대표적인 예가 스팸메일 필터와 감정 분석입니다.



# 조건부 확률

 Naive Bayes를 설명하기에 앞서 조건부 확률과 Bayes' rule에 대해 알아봅시다. 먼저 조건부 확률(Conditional probability)에 대해서 알아봅시다.

 위 그림처럼 보라색 통에는 1개의 빨간색 구슬과 3개의 파란색 구슬이 있고, 초록색 통에는 2개의 빨간색 구슬과 1개의 파란색 구슬이 있습니다. 이 때 어떤 한 통에서 구슬을 하나 꺼냈을 때 그 구슬이 빨간색일 확률을 얼마일까요? 이는 어떤 통에서 꺼내느냐에 따라 달라질 것이고, '보라색 통에서 꺼냈을 때 빨간색 구슬일 확률'과 '초록색 통에서 꺼냈을 때 빨간색 구슬일 확률' 이라고 정의할 수 있습니다. 이는 각각 P(Red|Violet)과 P(Red|Green)이라고 쓸 수 있습니다. 

 보라색 통에서 꺼낸다면 4개의 구슬 중 1개만이 빨간색이므로 1/4이고, 초록색 통에서 꺼낸다면 2/3입니다.

그렇다면 꺼낸 구슬이 빨간색일 때 구슬을 꺼낸 통이 보라색일 확률 P(Violet|Red)는 어떻게 구할까요? 이는 직관적으로 계산하기가 힘듭니다. 이 때 우리는 P(Red|Violet)을 알고 있기 때문에 Bayes' rule을 사용해서 P(Violet|Red)를 구할 수 있습니다.

 Bayes' rule을 적용한 식은 위와 같습니다. 우항의 값을 모두 알고 있기 때문에 좌항 P(Violet|Red)를 계산할 수 있습니다.



# Naive Bayes

 이번에는 Naive Bayes를 스펨 메일 분류기를 예로 들어 알아보겠습니다. 단어들로 이루어진 메일을 '스팸'과 '일반'으로 분류하는 상황을 생각해 봅시다. 메일에 들어 있는 단어들을 w1,w2,w3,...,wn이라고 한다면 메일이 스팸일 확률은 P(스팸|w1,w2,w3,...,wn) 이고, 일반 메일일 확률은 P(일반|w1,w2,w3,...,wn) 입니다. 직관적으로 헤아릴 수 없는 이 확률을 Bayes' rule을 이용하면 다음과 같이 나타낼 수 있습니다.

그리고 아래 표 상황을 예로 들어 확률을 계산해 봅시다.

먼저 두 확률의 공통 분모인 P(w1,w2,w3,...,wn)은 굳이 계산할 필요가 없고, P(스팸)과 P(일반) 각각 3/5와 2/5로 알고 있기 때문에 우리는 P(w1,w2,w3,...,wn|스팸)와 P(w1,w2,w3,...,wn|일반)만 알면 됩니다. 그러나 P(w1,w2,w3,...,wn|스팸) 역시 직관적으로 헤아리기에는 어렵습니다. 그러나 단어 w가 서로 독립적이라는 가정을 통해 다음과 같이 쓸 수 있습니다.

P(w1,w2,w3,...,wn|스팸) = P(w1|스팸)*P(w2|스팸)*P(w3|스팸)* ... *P(wn|스팸)

그리고 P(w|스팸)의 계산은 스팸 메일의 총 단어수가 11이기 때문에 다음과 같습니다.

P(w1|스팸) = 4/11, P(w2|스팸) = 2/11, P(w3|스팸) = 0, P(w4|스팸) = 2/11, P(w5|스팸) = 3/11

이렇게 확률을 계산할 수 있으며 P(w1,w2,w3,...,wn|스팸)*P(스팸)과 P(w1,w2,w3,...,wn|일반)*P(일반)을 비교하여 더 높은 값을 갖는 카테고리로 메일을 분류할 수 있습니다.



# 확률 보정

 위에서 설명한 플로우에서 발생할 수 있는 몇 가지 상황과 그에 따른 확률 보정에 대해 추가적으로 알아보겠습니다.

 P(w|스팸)의 값이 하나라도 0이면 P(w1,w2,w3,...,wn|스팸)이 0이 되기 때문에 문제가 됩니다. 때문에 각 확률이 0이 나오지 않도록 보정을 해야만 합니다. 분자와 분모의 각각 a,b값을 설정해서 더하는 방식으로 보정을 합니다.

보정된 P(w1|스팸) = (w1의 개수 + a) / (w전체 개수 + b)

a,b 모두 1로 설정하면 확률은 다음과 같습니다.

P(w1|스팸) = 5/12, P(w2|스팸) = 3/12, P(w3|스팸) = 1/12, P(w4|스팸) = 3/12, P(w5|스팸) = 4/12


 또한 작은 수를 계속 곱하면 0에 가까워지는 문제가 발생하기 때문에 자연로그를 사용해서 이를 해결합니다.

ln( P(w1,w2,w3,...,wn|스팸) )

= ln( P(w1|스팸)*P(w2|스팸)*P(w3|스팸)* ... *P(wn|스팸) )

= ln( P(w1|스팸) ) + ln( P(w2|스팸) ) + ln( P(w3|스팸) ) + ... +ln( P(wn|스팸) )

이렇게 해서 0이 나오지 않도록 확률을 보정할 수 있습니다.



다음 포스팅에서는 SVM을 이용한 텍스트 마이닝에 대해 알아보겠습니다.