텍스트 분석이란?
이전 내용
한글 NLP 처리의 어려움
한글 언어 처리는 '띄어쓰기'와 '다양한 조사'로 인해 라틴어 계열의 언어(영어 등) 보다 처리가 어렵다.
영어는 띄어쓰기를 잘못하면 잘못된 또는 없는 단어로 인식되는게 대부분이나,
한글은 띄어쓰기를 잘못하면 의미가 왜곡되어 전달될 수 있으며, 그 난이도가 영어에 비해 높은 편이다.
조사는 주어나 목적어를 위해 추가되며, 경우의 수가 많아 어근 추출 등의 전처리 시 제거하기가 까다롭다.
예) 집 이라는 어근 단어를 기준으로 집이, 집은, 집에, 집에서, 집으로 등 다양한 형태의 조사가 존재하며, '집은' 이라고 할 때, 은이 조사인지, 아니면 은(银) 인지 구분하기 어려우며, 만약 띄어쓰기까지 잘못되면 더욱 어려워진다.
KoNLPy
KoNLPy는 파이썬의 대표적인 한글 형태소 패키지이다.
- 형태소: 단어로서 의미를 가지는 최소 단위
- 형태소 분석(Morohological analysis): 말뭉치를 이러한 형태로 어근 단위로 쪼개고 각 형태소에 품사 태깅(POS tagging)을 부착하는 작업
KoNLPy 이전에는 파이썬 기반의 형태소 분석 프로그램이 거의 없었으며, 대부분의 형태소 분석은 C/C++과 Java 기반 패키지로 개발되었으며, KoNLPy는 기존의 잘 만들어진 이 한글 형태소 엔진을 파이썬 래퍼(Wrapper) 기반으로 재작성한 패키지이다.
기존의 엔진을 그대로 유지한 채 파이썬 기반에서 인터페이스를 제공하기 때문에 검증된 패키지의 안정성을 유지할 수 있으며, 꼬꼬마(Kkma), 한나눔(Hannanum), Komoran, 은전한닢 프로젝트(Mecab), Twitter (지금은 Okt) 와 같이 5개의 형태소 분석 모듈을 모두 사용할 수 있다.
※ 단, Mecab은 윈도우 환경에서는 구동되지 않음.
해당 패키지에 대한 자세한 사항은 KoNLPy 공식 사이트에가서 확인해 볼 수 있다. (하단 링크)
https://konlpy.org/ko/latest/index.html
[KoNLPy 설치 관련 글]
KoNLPy를 이용한 네이버 영화 평점 데이터 감성 분석
[데이터세트 다운 받기]
네이버 영화 평점 데이터는 깃허브(하단 링크)에서 내려 받을 수 있다.
링크에 접속하여 빨간색 네모 안에 있는 파일 세 개를 모두 다운 받는다.
[ratings_train.txt 파일 불러오기]
rating_train.txt 파일을 DataFrame으로 로딩하고 데이터를 살펴본다.
- ratings_train.txt 파일은 탭(\t)으로 칼럼이 분리돼 있으므로, sep 파라미터를 '\t' 로 생성
- 한글로 된 문서를 DataFrame 으로 로딩할 때 인코딩 이슈가 있으므로, encoding을 utf-8로 설정
import pandas as pd
train_df = pd.read_csv("C:/Users/niceq/Documents/DataScience/Python ML Guide/Data/08. ratings_train.txt", sep='\t', encoding='utf-8')
train_df.head()
학습 데이터 세트의 0과 1의 Label 값 비율을 살펴본다. (1-긍정 / 0-부정)
train_df['label'].value_counts()
▶ 0과 1이 균등한 분포를 나타내고 있다.
[데이터 전처리 수행]
- train_df의 경우 리뷰 텍스트를 가지는 'document' 칼럼에 Null 이 일부 존재하므로 이 값은 공백으로 변환한다.
- 문자가 아닌 숫자의 경우 단어적인 의미로 부족하므로 파이썬의 정규 표현식 모듈인 re를 이용해 공백으로 변환한다
- 테스트 데이터 세트 역시 파일을 로딩하고 동일한 데이터 가공을 수행한다.
import re
train_df = train_df.fillna(' ')
# 정규 표현식을 이용해 숫자를 공백으로 변경(\d 는 숫자를 의미)
train_df['document'] = train_df['document'].apply(lambda x : re.sub(r"\d+", " ", x))
# 테스트 데이터 세트 로딩하고 동일한 작업 수행
test_df = pd.read_csv("C:/Users/niceq/Documents/DataScience/Python ML Guide/Data/08. ratings_test.txt", sep='\t', encoding='utf-8')
test_df = test_df.fillna(' ')
test_df['document'] = test_df['document'].apply(lambda x : re.sub(r"\d+", " ", x))
# id 칼럼 삭제
train_df.drop('id', axis=1, inplace=True)
test_df.drop('id', axis=1, inplace=True)
- TF-IDF 방식으로 단어 벡터화: 각 문장을 한글 형태소 분석을 통해 형태소 단어로 토큰화 (Okt, 구. Twitter 엔진 이용)
- Okt 객체의 morphs() 메서드를 이용면 입력 인자로 들어온 문장을 형태소 단어 형태로 토큰화해 list 객체로 반환
- 문장을 형태소 단어 형태로 변환하는 별도의 tokenizer 함수 생성 (함수명: okt_tokenizer())
- 해당 함수는 TfidfVectorizer 클래스의 tokenizer로 사용
from konlpy.tag import Okt
okt = Okt()
def okt_tokenizer(text):
# 입력 인자로 들어온 텍스트를 형태소 단어로 토큰화해 리스트 형태로 반환
tokens_ko = okt.morphs(text)
return tokens_ko
[사이킷런의 TfidfVectorizer 를 이용해 TF-IDF 피처 모델 생성]
- tokenizer는 위에서 만든 okt_tokenizer() 함수 이용.
- ngram(1,2), min_df=3, max_df=0.9로 제한
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
# Okt 객체의 morphs() 객체를 이용한 tokenizer 사용
tfidf_vect = TfidfVectorizer(tokenizer=okt_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'])
# 로지스틱 회귀를 이용해 감성 분석 분류 수행
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))
▶ C가 3.5일 때 최고 0.8593의 정확도를 보인다.
[테스트 세트를 이용한 최종 감성 분석 예측]
테스트 세트를 이용해 예측할 때는 학습할 때 적용한 TfidfVectorizer 를 그대로 사용해야 하는데, 그래야만 학습 시 설정된 TfidfVectorizer의 피처 개수와 테스트 데이터를 TfidfVectorizer로 변환할 피처 개수가 같아진다.
학습 데이터에 사용된 TfidfVectorizer 객체 변수인 tfidf_vect를 이용해 transform()을 테스트 데이터의 document 칼럼에 수행한다.
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('Logistic Regression 정확도:', accuracy_score(test_df['label'], preds))
그 외에 다양한 한글 NLP 관련 프로젝트
[파이썬] 자연어 처리(NLP) - 여자친구 선물 고르기 : 2(재도전 - 성공)
[파이썬] 자연어 처리 (NLP) - 네이버 뉴스 텍스트 분석
[파이썬] 웹 스크래핑: 한남동, 이태원 맛집 분석 - 1
[파이썬] 네이버 뉴스 댓글 분석(feat.임영웅) - 1
[워드클라우드] 코로나 뉴스 기사 (feat.주사기 마스킹)
다음 내용
[출처]
파이썬 머신러닝 완벽 가이드
'[파이썬 Projects] > <파이썬 머신러닝>' 카테고리의 다른 글
[머신러닝] 추천시스템 (0) | 2024.11.01 |
---|---|
[머신러닝] 텍스트 분석 실습 - 캐글 Mercari (1) | 2024.11.01 |
[머신러닝] 텍스트 분석: 문서 유사도 (6) | 2024.10.31 |
[머신러닝] 텍스트 분석: 문서 군집화 (2) | 2024.10.31 |
[머신러닝] 텍스트 분석: 토픽 모델링 (4) | 2024.10.31 |