인공지능/머신러닝

베르누이 나이브베이즈

해피밀세트 2020. 5. 14. 18:55

 

 

 

베르누이 나이브베이즈

  • 데이터의 특징이 0또는 1 표현하는 경우 사용된다.

 

1. 단어 정제 안함

 

# 필요한 라이브러리 불러오기

import pandas as pd
import numpy as np
from collections import Counter
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
 
# 데이터 불러오기 / 구조 확인

data = pd.read_csv("C:/data/bulletin_board.txt",header=None,                   encoding="CP949")

data.info()

# 컬럼 이름 바꾸기

data.columns = ['text','class']
data.info()

# 파이썬의 베르누이 나이브베이즈는 숫자로만 써야한다.
# 긍정'=1,'부정'=0 으로 바꾸기

data['label'] = data['class'].map({'긍정':1},{'부정':0}) # NaN값나옴

data['class'].str.len() # 길이가 3. 공백문자가 들어감

data['class'] = data['class'].str.strip()

data['label'] = data['class'].map({'긍정':1, '부정':0})

data['label']

# 문장안에 단어를 모두 컬럼으로 만들어야함
# CountVectorizer() : DocumentTermMatrix의 역할을 대신 해줌
# 인스턴스 만들기

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()

# cv.fit_transform : 단어가 있으면 1 없으면 0

x_train = cv.fit_transform(data['text'])
x_train 
# 내용을 보기위해 배열 형식으로 바꿈

encode_input = x_train.toarray()
encode_input
# cv.inverse_transform() : 0,1 중에서 1인 애들만 단어로 보여줌

cv.inverse_transform(encode_input)
# cv.get_feature_names() : 전체문장에서 단어들만 추출해서 열로 만든다.

cv.get_feature_names()

# 각 문장에 명사들만 컬럼으로 만들기

from sklearn.naive_bayes import BernoulliNB

nb = BernoulliNB()

nb.fit(x_train,data['label'])

# 테스트 데이터 만들기

test1 = [{'text':'홍길동은 재미없다'}]
x_test1 = cv.transform(pd.DataFrame(test1))
nb.predict(x_test1)

 


 

2. 단어 정제함

 

# 필요한 라이브러리 불러오기

import pandas as pd 
import numpy as np 
from collections import Counter 
from sklearn.model_selection import train_test_split 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.metrics import accuracy_score, classification_report
 
# 데이터 불러오기 / 구조 확인

data = pd.read_csv("C:/data/bulletin_board.txt",header=None,                   encoding="CP949")

data.info()

# 컬럼 이름 변경

data.columns = ['text','class']
data.info()

# 긍정'=1,'부정'=0 으로 바꾸기

data['class'] = data['class'].str.strip()

data['label'] = data['class'].map({'긍정':1, '부정':0})

data['label']

# 텍스트 정제작업

from konlpy.tag import Okt

okt = Okt()

x = []

stopword = ['','','','','','','이야','','에서','낸다','난다']

for i in data['text']:

    a = okt.morphs(i)

    b = [j for j in a if j not in stopword]

    x.append(" ".join(b))

data['text'] = Series(x)

data

# 단어만 추출

from sklearn.feature_extraction.text import CountVectorizer

# 인스턴스 만들기

cv = CountVectorizer()

# cv.fit_transform : 단어가 있으면 1 없으면 0

x_train = cv.fit_transform(data['text'])

encode_input = x_train.toarray()

cv.inverse_transform(encode_input)

cv.get_feature_names()

# 각 문장에 명사들만 컬럼으로 만들기

from sklearn.naive_bayes import BernoulliNB

nb = BernoulliNB()

nb.fit(x_train,data['label'])

# 테스트 데이터 만들기

test1 = [{'text':'지하철은 재미없고 짜증난다'}]

x_test1 = cv.transform(pd.DataFrame(test1))

nb.predict(x_test1)

 

반응형