데이터분석/데테_인공지능

한글 영화평 (Neg, Pos 분류) - KoNLPy

하연01 2021. 6. 20. 21:31

한글로 된 영화평을 긍정, 부정으로 분류하는 학습모델을 만들고 정확도까지 확인해보는 프로젝트를 해보자.

KoNLPy 

- 한국어 정보처리를 위한 패키지 

- 다양한 종류의 한글 형태소 분석기 지원

 

 

[ 필요한 패키지 로딩 ]

import konlpy
import pandas as pd
import numpy as np 

 

[ 트레이닝, 테스트 파일 불러오고 탭 기준으로 불러오고 결측치 제외 ]

df_train = pd.read_csv('/Users/Downloads/ratings_train.txt', 
                      delimiter = '\t', keep_default_na = False)
df_test = pd.read_csv('/Users/Downloads/ratings_test.txt',
                     delimiter = '\t', keep_default_na = False)

print(df_train.head(n=5), '\n')
print(df_test.head(n=5))

 

 

[ 영화평과 라벨로 분류하여 저장 / 영화평 개수, 긍정 부정 개수 출력 ]

text_train = df_train['document']
y_train = df_train['label']

text_test = df_test['document']
y_test = df_test['label']

print(len(text_train), np.bincount(y_train))
print(len(text_test), np.bincount(y_test))

 

 

 

 

 

 

[ 형태소 분석기 사용 ]

from konlpy.tag import Okt
twitter = Okt()

→ Okt : 형태소 분석기

print(twitter.morphs(u'단독입찰보다 복수입찰의 경우'))
print(twitter.nouns(u'유일하게 항공기 체계 종합개발 경험을 갖고 있는 KAI는'))
print(twitter.phrases(u'날카로운 분석과 신뢰감있는 분석으로'))

print(twitter.pos(u'이것도 되나욬ㅋㅋ'))
print(twitter.pos(u'이것도 되나욬ㅋㅋ', norm = 'True'))
print(twitter.pos(u'이것도 되나욬ㅋㅋ', norm = 'True', stem = 'True'))

≫ morphs : 단어 단위로 자르기 

nouns : 단어만 추출 

phrase : 구 

twitter.pos : 단어 형태를 붙여서 출력

norm = 'True' : 동사로 출력 

stem = 'True' : 어근으로 출력

 

 

[ tokenizer 함수 만들기 ]

Tokenizer : 문장으로 토큰으로 나누는 역할 

from konlpy.tag import Okt 
twitter_tag = Okt()

def twitter_tokenizer(text):
    return twitter_tag.morphs(text)

def twitter_tokenizer_filter(text):
    malist = twitter_tag.pos(text, norm = True, stem = True)
    r = []
    for word in malist:
        if not word[1] in ["Josa", "Eomi", "Punctuation", "KoreanParticle"]:
            r.append(word[0])
    return r

print(twitter_tokenizer(u'유일하게 항공기 체계 종합개발 경험을 갖고 있는 KAI는'))
print(twitter_tokenizer_filter(u'유일하게 항공기 체계 종합개발 경험을 갖고 있는 KAI는'))
print(twitter_tokenizer_filter(u'이것도 되나욬ㅋㅋ'))

≫ twitter_tokenizer : 단어 단위로 자르는 토크나이저

≫ twitter_tokenizer_filter

      : 동사를 기본형태로 변환하여 출력 / 조사, 어미, 구두점, 은/는/이/가 등등의 KoreanParticle 제외

 

 

 

[ Multinomial Naive Bayesian ]

import konlpy
import pandas as pd
import numpy as np

from sklearn.feature_extraction.text import CountVectorizer
from sklearn import metrics
from sklearn.naive_bayes import MultinomialNB

from konlpy.tag import Okt
twitter_tag = Okt()

def twitter_tokenizer(text):
    malist = twitter_tag.pos(text, norm = True, stem = True)
    r = []
    for word in malist:
        if not word[1] in ["Josa", "Eomi", "Punctuation", "KoreanParticle"]:
            r.append(word[0])
    return r

df_train = pd.read_csv('/Users/Downloads/ratings_train.txt', 
                      delimiter = '\t', keep_default_na = False)
df_test = pd.read_csv('/Users/Downloads/ratings_test.txt',
                     delimiter = '\t', keep_default_na = False)

어근동사형태로 추출 / 조사, 어미, 구두점, korean particle 제외하는 토크나이저 제작 

트레이닝, 테스트 데이터 따로 불러오고 탭 기준, 결측치 제거하여 파일 불러오기

 

 

 

 

Multinomial Naive Bayesian 사용

 

text_train = df_train['document']
y_train = df_train['label']

text_test = df_test['document']
y_test = df_test['label']

vect = CountVectorizer(tokenizer = twitter_tokenizer).fit(text_train)

X_train = vect.transform(text_train)
clf_mult = MultinomialNB().fit(X_train, y_train)

X_test = vect.transform(text_test)

pre = clf_mult.predict(X_test)

ac_score = metrics.accuracy_score(y_test, pre)
print("정답률 = ", ac_score)

≫ 영화평과 라벨을 따로 저장. 

 

코드 설명

vect : CountVectorize를 활용하여 twitter_tokenizer로 BOW 만들기 (단어를 담고있는 가방) 그 후 모델학습시킨다.

vect.transform(text_train) : 트레이닝 용 영화평 데이터를 카운트벡터라이저로 Bow 만든 후 모델학습.

fit() : 모델학습

MultinomialNB() : 문장에 나온 단어 횟수 카운트

clf_mult : MultinomialNB를 사용하여 모델학습. (트레이닝 데이터의 영화평과 정답인 라벨을 넣고 훈련) 

pre : 위에 훈련시킨 모델(clf_mult)를 가지고 영화평 테스트 데이터를 넣어서 예측해보자. 

ac_score : 원래 테스트 데이터의 정답(라벨)과 예측한 답인 pre를 넣고 정확도 산출