파이썬 빅데이터 분석 Day 16

2023. 10. 26. 15:57·데이터분석실습/데이터 과학 기반의 파이썬 빅데이터 분석

16. 데이터 분석하기영화 리뷰 분석(22.07.26)

[감성분석 + 토픽 모델링]

목표: 영화 리뷰 데이터에 감성 분석 모델을 구축하여 새로운 데이터의 감성을 분석

 

텍스트마이닝이란?: 비정형 텍스트 데이터로부터 패턴을 찾아내어 의미있는 정보를 추출하는 분석 기법 ->데이터마이닝 + 자연어 처리

 

과정: 텍스트 전처리->특성 벡터화->머신러닝 모델 구축 및 학습/평가 프로세스 수행

특성 벡터화란?: 텍스트를 구성하는 단어 기반의 특성 추출을 하고, 이를 숫자형 값인  벡터값을 표현하는 것

  • >> 내용이 많아 따로 정리하였음.

감성분석이란?: 텍스트에서 사용자의 주관적인 의견이나, 감성,태도를 분석하는 텍스트 마이닝의 핵심 분석 기법중 하나.

텍스트에서 감성을 나타내는 단어를 기반으로 긍정/부정의 감성을 결정, 감성단어에 대한 사전을 가진 상태에서 단어를 검색하여 점수계산.

토픽모델링이란?: 문서를 구성하는 키워드를 기반으로 토픽을 추출하고, 추출한 토픽을 기준으로 문서를 분류 및 분석하는 기법. 문서에서 다루는 토픽을 도출하여 동향을 파악하고, 새로운 문서의 토픽을 예측하는 분석에 사용

 

LDA란?: 대표적인 머신러닝 기반 토픽모델링 방법.

디리클레분포를 이용하여 주어진 문서에 잠재되어있는 토픽을 추론하는 확률 모델 알고리즘 사용.

LDA는 특정 주제에 특정 단어가 나타날 확률과 문서에 대한 주제 분포 비율을 나타내며, 각 문서를 주제별로 나타날 확률 분포에 대해 벡터화하기 때문에 문서 임베딩 기법으로 간주할 수 있다.

LDA는 토픽의 개수K가 토픽분석의 성능을 결정짓는 중요한 요소로 사용자가 정해주어야 하는 하이퍼파라미터이다.

1. 데이터 수집

깃허브에 공개된 네이버 영화 리뷰 데이터셋 이용.

 

GitHub - e9t/nsmc: Naver sentiment movie corpus

Naver sentiment movie corpus. Contribute to e9t/nsmc development by creating an account on GitHub.

github.com

깃허브 -> ratngs.txt, ratingstest.txt, ratingstrain.txt 다운

2.데이터 준비 및 탐색

train데이터부터 데이터 전처리를 해볼 것이다.

train_df=pd.read_csv('../data/Movie/ratings_train.txt',encoding='utf-8',sep='\t',engine='python')
train_df.head()
train_df.info()

데이터의 정보를 봤을 때, document에 결측치가 5개 존재하는 것을 볼 수있다.

train_df=train_df[train_df['document'].notnull()]
train_df.info()

[01행]: document가 notnull인 행만 train_df에 저장

train_df['label'].value_counts()

trian_data의 분류결과를 보면 부정감성이 75170개 긍정감성이 74825개 있는 것을 볼 수 있다.

import re
train_df['documnet']=train_df['document'].apply(lambda x: re.sub(r'[^ ㄱ-ㅣ가-힣]+'," ",x))
train_df.head()

[01행]: 정규식을 사용하기 위해서 re모듈을 import 한다.

[02행]: 'ㄱ'으로 시작하거나, '가~힣'까지의 문자를 제외한 나머지는 공백으로 치환

같은 과정을 test데이터도 동일하게 진행해준다.

test_df=pd.read_csv('../data/Movie/ratings_test.txt',encoding='utf-8',sep='\t',engine='python')
test_df.head()
test_df.info()

test_df=test_df[test_df['document'].notnull()]
test_df.info()

train_df['label'].value_counts()

import re
test_df['documnet']=test_df['document'].apply(lambda x: re.sub(r'[^ ㄱ-ㅣ가-힣]+'," ",x))
test_df.head()

2.분석 모델 구축

from konlpy.tag import Okt
okt=Okt()

def okt_tokenizer(text):
	tokens=okt.morphs(text)
	return tokens

[01~02행] : 형태소 분석기에 사용할 konlpy패키지의 okt클래슬르 임포트하고, 객체생성

[03~05행]: 문장을 토큰화하기 위한 함수를 정의, okt.morphs()를 통해 형태소 단위로 토큰화 진행

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer(tokenizer = okt_tokenizer, ngram_range=(1,2), min_df=3, max_df=0.9)
tfidf.fit(train_df['document'])
train_tfidf = tfidf.transform(train_df['document'])

[01,02행]: 사이킷런의 tfidfvectorizer을 이용해서 TF-IDF벡터화에 사용될 객체 생성

  • >단어의 크기는 1~2, 최소출현빈도는 3, 최대출현빈도는 90%로 설정

[03,04행]: 벡터모델을 FIT하고 train_df의 document행을 변환

from sklearn.linear_model import LogisticRegression

SA_lr=LogisticRegression(random_state=0)
SA_lr.fit(train_tfidf,train_df['label'])

[01행]: 사이킷런의 로지스틱 객체 생성

[02행]: 독립변수를 위에서 생성한 train_tfidf로 하고, 종속변수를 label column으로 설정하여 fit

from sklearn.model_selection import GridSearchCV

params={'C':[1,3,3.5,4,4.5,5]}
SA_lr_grid_cv=GridSearchCV(SA_lr,param_grid=params,cv=3,scoring='accuracy',verbose=1)
SA_lr_grid_cv.fit(train_tfidf,train_df['label'])
print(SA_lr_grid_cv.bnest_params_,round(SA_lr_grid_cv.best_score_,4))
SA_lr_best=SA_lr_grid_cv.best_estimator_

이전 머신러닝 모델에서도 사용한 GridSearchCV를 통해서 최적의 하이퍼파라미터 값을 찾는다.

3. 분석 모델 평가

최적의 하이퍼 파라미터를 이용한 분류모델을 저장했으니, 이제 테스트셋으로 모델을 평가해보자.

from sklearn.metrics import accuracy_score

test_tfidf = tfidf.transform(test_df['document'])
test_predict = SA_lr_best.predict(test_tfidf)
print('감성 분석 정확도 : ', round(accuracy_score(test_df['label'], test_predict), 3))

test set에 대해 분류모델을 적용시켜본 결과 accuracy가 86.6이 나왔다. 어느정도 정확한 모델이 되었으므로 테스트셋말고 임의의 데이터에 적용시켜보자.

st = input('감성 분석할 문장입력 >> ')

st = re.compile(r'[ㄱ-ㅣ가-힣]+').findall(st)
st = [" ".join(st)]
st

st_tfidf = tfidf.transform(st)

st_predict = SA_lr_best.predict(st_tfidf)

if(st_predict== 0):
	print(st , "->> 부정 감성")
else :
	print(st , "->> 긍정 감성")

[01행]: 임의의 문장을 입력한다.

[02,03행]: 텍스트 전처리를 시행

[05,06행]: 만들어진 분류모델에 전처리된 데이터를 입력

[07,08행]: 분류결과에 따라 부정,긍정 판별

728x90

'데이터분석실습 > 데이터 과학 기반의 파이썬 빅데이터 분석' 카테고리의 다른 글

파이썬 빅데이터 분석 Day 17  (1) 2023.11.02
파이썬 빅데이터 분석 Day 15  (1) 2023.10.26
파이썬 빅데이터 분석 Day 14  (0) 2023.10.26
파이썬 빅데이터 분석 Day 13  (0) 2023.10.26
파이썬 빅데이터 분석 Day 12  (1) 2023.10.26
'데이터분석실습/데이터 과학 기반의 파이썬 빅데이터 분석' 카테고리의 다른 글
  • 파이썬 빅데이터 분석 Day 17
  • 파이썬 빅데이터 분석 Day 15
  • 파이썬 빅데이터 분석 Day 14
  • 파이썬 빅데이터 분석 Day 13
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (472)
      • 알쓸신잡 (80)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Blog

    • 🏠 Home

    ✏️글쓰기
    💻 관리

    Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이코테
    이것이취업을위한코딩테스트다
    파이썬
    이분탐색
    dp
    그리디
    DFS
    나동빈
    백준
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바