티스토리 뷰
안녕하세요. 은행 IT 운영부 이지성과장입니다.
오늘은 나이브 베이즈 분류 기법을 활용하여 스팸 sms를 필터링 하는 법에 대해 알아보겠습니다.
하루에도 몇 통씩 받게되는 스팸sms! 나이브 베이즈를 이용하면, 귀찮은 스팸 sms를 어느정도 자동으로 거를 수 있습니다.
먼저 나이브 베이즈 이론에 대해서 말씀을 드리겠습니다.
나이브 베이즈에서 가장 기본이 되는 이론은 바로 "조건부 확률" 입니다. 제 고등학교 시절 기억으론 수학의 정석 : 수학1 맨 마지막 단원이 "확률과 통계"로 기억하는데, 이 때 조건부 확률을 배웠던 기억이 납니다.
조건부 확률 P(A|B) 는 사건 B가 발생했을 때 A의 확률을 의미합니다.
P(A)가 A가 일어날 확률, P(B)P(B)가 B가 일어날 확률, P(B|A)가 A가 일어나고나서 B가 일어날 확률, P(A|B)가 B가 일어나고나서 A가 일어날 확률이라고 해봅시다.
이때 P(B|A)를 쉽게 구할 수 있는 상황이라면, 아래와 같은 식을 통해 P(A|B)를 구할 수 있습니다.
이 이론을 사용하면 스팸sms일 확률을 아래와 같이 표현할 수 있습니다.
즉, 스팸sms에 사용된 특정 단어들을 알고 있다면, 이것이 스팸sms인지 정상sms인지 알 수 있다는 것입니다.
P(정상 sms | sms내용) = sms내용이 정상일 확률
P(스팸 sms | sms내용) = sms내용이 스팸일 확률
공식을 조금더 변경하면...
P(정상 sms | sms내용) = P(sms내용 | 정상 sms) × P(정상 sms)
P(스팸 sms | sms내용) = P(sms내용 | 스팸 sms) × P(스팸 sms)
sms내용은 sms를 구성하고 있는 본문입니다. 그런데 메일의 본문을 어떻게 나이브 베이즈 분류기의 입력으로 사용할 수 있을까요? 메일의 본문에 있는 모든 단어를 토큰화 시켜서 이 단어들을 나이브 베이즈의 분류기의 입력으로 사용합니다. (단어의 토큰화에 대해서는 형태소분석기에 대한 내용을 다룬 이전 포스팅을 참고해주시기 바랍니다)
만약 sms의 본문에 있는 단어가 3개라고 가정해보겠습니다. sms의 본문에 있는 단어 3개를 w1, w2, w3라고 표현한다면 결국 나이브 베이즈 분류기의 정상 메일일 확률과 스팸 메일일 확률을 구하는 식은 아래와 같습니다.
P(정상 sms| sms내용) = P(w1 | 정상 sms) × P(w2 | 정상 sms) × P(w3 | 정상 메일) × P(정상 sms)
P(스팸 sms| sms내용) = P(w1 | 스팸 sms) × P(w2 | 스팸 sms) × P(w3 | 스팸 메일) × P(스팸 sms)
잉?? 무슨 소리인지 모르시겠다구요?
다시 말하면 "스팸sms에 사용된 특정 단어들이 많을 수록 스팸sms일 확률이 높다."가 기본 가정인 것입니다.
아래 샘플 데이터를 활용하여 조금 더 쉽게 설명을 드리겠습니다.
아래와 같은 훈련 데이터가 있다고 가정하겠습니다.
순번 | sms 내용 | 스팸/정상여부 |
1 | me free lottery | 스팸 |
2 | free get free you | 스팸 |
3 | you free scholarship | 정상 |
4 | free to contact me | 정상 |
5 | you won award | 정상 |
6 | you ticket lottery | 스팸 |
훈련데이터를 기반으로 "you free contact" 라고 전송된 sms에 대해서 스팸인지 정상인지 판별해보도록 하겠습니다.
P(정상 sms | sms내용) = P(you | 정상 sms ) × P(free | 정상 sms ) × P(contact | 정상 sms ) × P(정상 sms )
P(스팸 sms | sms내용) = P(you | 스팸 sms ) × P(free | 스팸 sms ) × P(contact | 스팸 sms ) × P(스팸 sms )
P(정상 sms) = P(스팸 sms) = 총 메일 6개 중 3개 = 0.5
위 예제에서는 P(정상 메일)과 P(스팸 메일)의 값은 같으므로, 두 식에서 두 개의 확률은 생략이 가능합니다.
P(정상 메일 | sms내용) = P(you | 정상 메일) × P(free | 정상 메일) × P(contact | 정상 메일)
P(스팸 메일 | sms내용) = P(you | 스팸 메일) × P(free | 스팸 메일) × P(contact | 스팸 메일)
P(you | 정상 sms)을 구하는 방법은 정상 메일에 등장한 모든 단어의 빈도 수의 총합을 분모로하고, 정상 메일에서 you가 총 등장한 빈도의 수를 분자로 하는 것입니다. 이 경우에는 2/10 = 0.2가 됩니다. 이와 같은 원리로 식을 전개하면 이와 같습니다.
P(정상 메일 | sms내용) = 2/10 × 2/10 × 1/10 = 0.004
P(스팸 메일 | sms내용) = 2/10 × 3/10 × 0/10 = 0
결과적으로 P(정상 sms | sms내용) > P(스팸 sms | sms내용)이므로 입력 테스트 you free contact는 정상 메일로 분류됩니다.
그런데 한가지 이상한 점은 contact란 단어가 스팸 sms에서 등장하지 않았다고 해서 전체 확률이 0이 되어버리는 건 좀 이상하죠...단, 하나의 단어라도 훈련 텍스트에 없었다면 확률 전체가 0이 되는 것은 지나친 일반화입니다. 이를 방지하기 위해서 나이브 베이즈 분류기에서는 각 단어에 대한 확률의 분모, 분자에 전부 숫자를 더해서 분자가 0이 되는 것을 방지하는 라플라스 스무딩을 사용하기도 합니다.
라플라스 스무딩에 대한 내용은 아래 링크를 참고하시기 바랍니다.
[링크] : meoyameoya.tistory.com/5
2020년의 끝을 향해 달려가고 있습니다. 올해는 코로나로 여러가지 장벽들이 많았는데,
하시고 싶으셨던 일들 모두 마무리가 잘 되는 남은 시간 되셨으면 합니다.
감사합니다.
'NLP' 카테고리의 다른 글
[chatGPT] 콘도 예약 챗봇 GPT 프롬프트로 구현 (0) | 2024.01.17 |
---|---|
Dialogflow를 활용한 챗봇 만들기 (0) | 2021.07.05 |
형태소 분석기 알아보기 (0) | 2020.10.08 |
TF-IDF 기법 이해하기 (0) | 2020.08.21 |
LDA (Latent Dirichlet Allocation) 알아보기 (0) | 2020.05.13 |
- Total
- Today
- Yesterday
- 추천시스템
- 정보관리기술사
- 정보관리
- wfastcgi
- 머신러닝
- 기술사학원
- 인조기프
- iso12207
- 로블록스
- lambda
- FLASK
- ISO 12207
- 밀키트요리
- 자기계발
- 12207
- 131회정보관리기술사
- 추천도서
- s3
- 밀키트
- 챗봇
- pytorch
- gpt3.5
- IIS
- 정보관리기술사합격
- 콘도챗봇
- hackerrank
- 정보관리기술사독학
- AWS
- 기술사
- r
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |