일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 구글 앱 엔진
- Bidirectional Associative Memory
- 증강현실
- SSM
- Python
- 가상화
- 빅데이터
- 하이퍼바이저
- 패턴인식
- 동아리
- Google App Engine
- hopfield network
- 삼성
- Friendship
- 갤럭시탭S8울트라
- BAM
- 신경회로망
- NarwalFreo
- 물걸레자동세척로봇청소기
- 삼성전자 소프트웨어멤버십 SSM
- 패턴 인식
- 고려대학교
- 나르왈프레오
- 삼성소프트웨어멤버십
- Neural Network
- 인공지능
- 신경망
- 파이썬
- 물걸레로봇청소기추천
- 멤버십
- Today
- Total
정보공간_1
[6기 신촌 김상훈] 텍스트 마이닝 #3 본문
안녕하세요. 신촌멤버십 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을 이용한 텍스트 마이닝에 대해 알아보겠습니다.
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[6기 신촌 류보원] 체감형 게임 - GUI #1 (0) | 2014.11.11 |
---|---|
[6기 강남 김현호] 온라인 문자인식 with SVM #4 (0) | 2014.11.10 |
[6기 신촌 김상훈] 텍스트 마이닝 #2 (0) | 2014.11.10 |
[6기 부산 박천경] mixare(증강현실) opensource 분석 #2 (0) | 2014.11.09 |
[6기 강북 홍진우] 64비트 멀티코어 OS#5 - Boot Loader(2) (0) | 2014.11.09 |