한글 영화평 (Neg, Pos 분류) - KoNLPy
한글로 된 영화평을 긍정, 부정으로 분류하는 학습모델을 만들고 정확도까지 확인해보는 프로젝트를 해보자.
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를 넣고 정확도 산출