한글 NLP 처리의 어려움과 KoNLPy
- 한글은 한글의 조사, 띄어쓰기로 인해 라틴어 계열보다 NLP 처리가 어려움
- KoNLPy는 한글 형태소(단어로서 의미를 가지는 최소 단위) 패키지로 형태소를 어근 단위로 쪼개고 각 형태소에 품사 태깅(POS tagging)을 부착하는 작업을 수행
- KoNLPy 형태소 엔진으로는 꼬꼬마, 한나눔, Komoran, Mecab, Twitter 등이 있음
네이버 영화 평점 데이터를 이용한 감성 분석
1. 데이터 로딩
- rating_train. txt, rating_test.txt 의 DataFrame 생성
- 탭(\t)으로 칼럼이 분리되어있음, encoding 은 'UTF8'로 설정
import pandas as pd
train_df = pd.read_csv('ratings_train.txt', sep ='\t', encoding='UTF8')
train_df.head(3)
2. 사전 데이터 가공
- document 칼럼의 Null 값 처리
- 파이썬의 정규 표현식 모듈인 re를 사용하여 숫자를 공백으로 변환
- id 칼럼 삭제
import re
train_df = train_df.fillna(' ')
#정규 표현식을 이용해 숫자를 공백을 변경
train_df['document'] = train_df['document'].apply(lambda x : re.sub(r"\df", " ", x))
#테스트 데이터 세트를 로딩하고 동일하게 Null 및 숫자를 공백으로 반환
test_df = pd.read_csv('ratings_test.txt', sep = '\t', encoding = 'UTF8')
test_df = test_df.fillna(' ')
train_df['document'] = train_df['document'].apply(lambda x : re.sub(r"\df", " ", x))
#id 칼럼 삭제
train_df.drop('id', axis=1, inplace=True)
test_df.drop('id', axis=1, inplace=True)
3. 토큰화
- 문장을 한글 형태소 분석을 통해 형태소 단어로 토큰화
- 한글 형태소 엔진은 SNS 분석에 적합한 Okt 클래스 이용
- Okt 객체의 morphs() 메서드를 이용하면 문장을 형태소 단어로 토큰화해 list 객체 반환
- Tfidf 피처 벡터화의 tokenizer로 사용을 위해 토큰화 작업을 tw_tokenizer() 함수로 생성
from konlpy.tag import Okt
okt = Okt()
def tw_tokenizer(text):
#입력인자로 들어온 텍스트를 형태소 단어로 토큰화해 리스트 형태로 반환
tokens_ko = okt.morphs(text)
return tokens_ko
4. 피처벡터화
- 사이킷런의 TfidfVectorizer를 이용해 피처 모델 생성
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
#okt 객체의 morphs() 를 이용한 tokenizer 사용. ngram_range는 (1,2)
tfidf_vect = TfidfVectorizer(tokenizer=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'])
5. ML 모델 수립 및 학습/예측/평가
- 로지스틱 회귀 모델을 이용하여 감성분석 수행
- 모델의 하이퍼 파라미터 최적화를 위해 GridSearchCV 이용
- C가 3.5일 때 최고 0.8593의 정확도
#로지스틱 회귀를 이용해 감성 분석 분류 수행
lg_clf = LogisticRegression(random_state=0, solver='liblinear')
#파라미터 C 최적화를 위해 GridSearchCV를 이용
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_, round(grid_cv.best_score_, 4))
[output]
Fitting 3 folds for each of 5 candidates, totalling 15 fits
{'C': 3.5} 0.8629
- 테스트 세트를 이용해 최종 감성 분석 예측
from sklearn.metrics import accuracy_score
#학습 데이터를 적용한 TfidfVectorizer를 이용해 테스트 데이터를 TF-IDF 값으로 피처 변환
tfidf_matrix_test = tfidf_vect.transform(test_df['document'])
#classifiers는 GridSearchCV에서 최적 파라미터로 학습된 classifier를 그대로 이용
best_estimator = grid_cv.best_estimator_
preds = best_estimator.predict(tfidf_matrix_test)
print('Logistic Regression 정확도: ', accuracy_score(test_df['label'], preds))
[output]
Logistic Regression 정확도: 0.86534
'데이터 > 머신러닝' 카테고리의 다른 글
[RecSys] Chapter 9 | 장르 속성을 이용한 영화 콘텐츠 기반 필터링 (0) | 2023.02.12 |
---|---|
[NLP] Chapter 8 | 텍스트 분석 (비지도학습 기반 감성 분석) (0) | 2023.02.05 |
[NLP] Chapter 8 | 텍스트 분석 (지도학습 기반 감성 분석) (0) | 2023.02.04 |
[NLP] Chapter 8 | 텍스트 분석 (텍스트 분류) (1) | 2023.02.03 |
[NLP] Chapter 8 | 텍스트 분석 (소개 및 기반지식) (1) | 2023.02.02 |