본문 바로가기

NPL with ML

한글 텍스트 처리 위한 KoNLPy를 이용한 네이버 영화 평점 감정 분석

반응형

일반적으로 한글 언어 처리는 영어 등의 라틴어 처리보다 어렵습니다. 그 주된 원인은 '띄어쓰기'와 '다양한 조사'때문입니다. 잘 알다시피 한글은 띄어쓰기를 잘못하면 의미가 왜곡되어 전달될 수 있습니다.

 

또 하나 한글 언어 처리의 어려움은 '조사'처리입니다. 조사는 주어나 목적어를 위해 추가되며, 워낙 경우의 수가 많기 때문에 어근 추출(Stemming/Lemmatization)등의 전처리시 제거하기가 까다롭습니다.

 

KoNLPy는 파이썬의 대표적인 한글 형태소 패키지입니다. 형태소의 사전적인 의미는 '단어로서 의미를 가지는 최소 단위'로 정의할 수 있습니다. 형태소 분석(Morphological Analysis)이란 말뭉치를 이러한 형태소 어근 단위로 쪼개고 각 형태소에 품사 태깅을 부탁하는 작업을 일반적으로 지칭합니다.

 

네이버 영화 평점 데이터 다운로드

하기 파일을 다운로드하고, 압축을 풉니다. ratings.txt, ratings_train.txt, ratings_test.txt로 구성되어 있습니다.

naver.7z
6.42MB

 

네이버 영화 평점 데이터 형태소 분석

train과 test파일을 Pandas로 로딩하고 데이터를 정리한다.

import pandas as pd
import re

train_df = pd.read_csv(r'C:\Users\HANA\PycharmProjects\HANATOUR\NLP\TEXT_Example\naver\ratings_train.txt', sep='\t')
# print(train_df.head())
print(train_df['label'].value_counts())
train_df = train_df.fillna(' ')
train_df['document'] = train_df['document'].apply(lambda x : re.sub(r"\d+"," ", x))

test_df = pd.read_csv(r'C:\Users\HANA\PycharmProjects\HANATOUR\NLP\TEXT_Example\naver\ratings_test.txt', sep='\t')
# print(test_df.head())
print(test_df['label'].value_counts())
test_df = test_df.fillna(' ')
test_df['document'] = test_df['document'].apply(lambda x : re.sub(r"\d+"," ", x))

 

TF-IDF방식으로 단어를 벡터화하기 위한 작업입니다. 한글 형태소 엔진은 SNS 분석에 적합한 Twitter클래스를 이용하겠습니다. Twitter객체의 morphs() 메서드를 이용하면 입력 인자로 들어온 문장을 형태소 단어 형태로 토큰화해 list객체로 반환합니다. 따로 함수로 만들고 TfidfVectorizer의 Tokenizer에 입력한다.

from konlpy.tag import Twitter
def tw_tokenizer(text):
        tokens_ko = Twitter().morphs(text)
        return tokens_ko

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
import Common_Module.CMNLP as CMNLP

tfidf_vect = TfidfVectorizer(tokenizer=CMNLP.tw_tokenizer, ngram_range=(1,2), min_df=3, max_df=0.9)
tfidf_vect.fit(train_df['document'])
tfidf_matrix_train = tfidf_vect.transform(train_df['document'])

 

Logistic Regression을 활용하여 분류 기반의 감성 분석을 수행합니다.

#LogisticRegression를 이용하여 감성 분석 분류 수행.
lg_clf = LogisticRegression(random_state=0)

params = {'C':[1,3.5,4.5,5.5,10]}
grid_cv = GridSearchCV(lg_clf, param_grid=params, cv=3, scoring='accuracy', verbose=1)
grid_cv.fit(tfidf_matrix_train, train_df['label'])
print(grid_cv.best_params_, grid_cv.best_score_)

 

최적의 C값이 도출되고 테스트 세트를 이용해 최종 감성 분석 예측을 수행하겠습니다. 테스트 세트를 이용해 예측할 때는 학습할 때 적용한 TfidfVectorizer를 그대로 사용해야 합니다. 그래야만 학습 시 설정된 TfidfVectorizer의 피처 개수와 테스트 데이터를 TfidfVectorizer로 변환할 피처 개수가 같아지게 됩니다.

from sklearn.metrics import accuracy_score

#학습 데이터를 적용한 TfidfVectorizer를 이용하여 테스트 데이터를 TF-IDF값으로 피처 변환함
tfidf_matrix_test = tfidf_vect.transform(test_df['document'])

#Classifier는 GridSearchCV에서 최적 파라미터로 학습된 Classifier를 그대로 이용
best_estimator = grid_cv.best_estimator_
preds = best_estimator.predict(tfidf_matrix_test)

print(accuracy_score(test_df['label'], preds))
반응형