베이즈의 정리를 통해 텍스트 구분하기
2018. 5. 19. 04:01ㆍPython-이론/python-인공지능
베이즈의 정리를 통해 텍스트 구분하기
베이즈의 정리는 우리가 고등학생 때 배웠던 통계공식이다.
P(A|B) = P(B|A) X P(B) = P(AnB)/P(B)
이런 식으로 표현할 수 있다. 하지만 우린 베이즈의 정리를 뛰어 넘어서 나이브 베이즈의 정리를 사용하려고합니다. 나이브 베이즈의 정리는 자기가 이메일을 받고 (A) 이것이 스팸인지 판단 해주는 것을 (B)라고 합시다. 우선은 텍스트내부에서의 단어 출현 비율을 조사합니다. 그리고 이를 기반으로 어떤 카테고리로 분류할지 판단합니다. 실제로 판정할 때 여러 카테고리 중 어떤 카테고리의 확률이 제일 클지 판단하여 출려합니다. 그래서 우리는 이 공식을
P(B|A) = P(B) X P(A|B)
우리는 여기서 P(A|B)를 생각해봅시다
P(A|B)는 B라는 카테고리일 때 A의 단어가 나올 확률이 얼마나 되는지를 의미합니다.
그래서 우리는 식을
N개의 단어
P(A|B) = P(a1|B) * P(a2|B) * P(a3|B) ~P(an|B)
결굴 저거는 B라는 카테고리이면서 A라는 단어의 출현횟수를 의미한다.
단순한 출현율 = A단어 출현횟수 / 카테고리 전체 단어 수
file2
import os, sys, math from konlpy.tag import Twitter class BayesFilter: def __init__(self): self.words = set() self.word_dic = {} self.category_dic = {} def fit(self, text, category): self.incWord(text,category) self.incCategory(category) def incWord(self, text,category): twitter = Twitter() malist = twitter.pos(text,norm=True) if category not in self.word_dic: self.word_dic[category] = {} for word in malist: if word[1] not in ["Josa","Eomi","Punctuation"]: if word not in self.word_dic[category]: self.word_dic[category][word[0]] = 0 self.word_dic[category][word[0]]+=1 self.words.add(word[0]) def incCategory(self,category): if category not in self.category_dic: self.category_dic[category] = 0 self.category_dic[category]+=1 def word_prob(self, word,category): if word not in self.word_dic[category]: n = 0 else: n = self.word_dic[category][word] return math.log(n+1 / (len(self.words)+sum(self.word_dic[category].values()))) def category_prob(self, category): return math.log(self.category_dic[category] /sum(self.category_dic.values())) def predict(self, text): maxScore = -sys.maxsize for category in self.category_dic.keys(): score = 0 categoryScore = self.category_prob(category) score += categoryScore twitter = Twitter() malist = twitter.pos(text,norm = True) for word in malist: score += self.word_prob(word[0], category) if maxScore < score: bestCategory = category maxScore = score return bestCategory
File2
from vayse import BayesFilter vy = BayesFilter() vy.fit("파격 세일 오늘까지만 30%세일","광고") vy.fit("쿠폰 선물 & 무료 배송","광고") vy.fit("현대 백화점 세일","광고") vy.fit("봄과 함께 찾아온 따뜻한 신제품 소식","광고") vy.fit("인기 제품 기간 한정 세일","광고") vy.fit("오늘 일정 확인","중요") vy.fit("프로젝트 진행 상황 보고","중요") vy.fit("계약 잘 부탁 드립니다","중요") vy.fit("회의 일정이 등록되었습니다.","중요") vy.fit("오늘 일정이 없습니다.","중요") result = vy.predict("현재 프로젝트 진행 정보를 메일로 보내주세요") print(result)
'Python-이론 > python-인공지능' 카테고리의 다른 글
레벤슈타인 거리를 이용해서 두 문장 비교하기 (0) | 2018.05.20 |
---|---|
다중 퍼셉트론을 이용해서 텍스트 분류하기 (0) | 2018.05.20 |
word2vec 사용해서 한 단어와 연관된 단어들 찾아보기 (0) | 2018.05.17 |
한국어 분석(형태소 분석) (0) | 2018.05.17 |
pandas와 numpy 다루기 (0) | 2018.05.11 |