베이즈의 정리를 통해 텍스트 구분하기

2018. 5. 19. 04:01Python-이론/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)