Data/ML

8. 감정분석

뚱요 2021. 6. 15. 00:00
반응형

8. 감정분석

자연어 처리(Natural Language Processing, NLP) :컴퓨터에서 대량의 자연어 데이터 처리하고 분석하도록 프로그래밍

의견분석(Opinoion mining) or 감성 분석(sentiment analysis)

- 정서적 상태(감정)와 주관적인 정보(의견)를 체계적으로 식별, 추출, 정량화 및 연구하기 위해 자연어 처리, 텍스트 분석, 전산 언어학 및 생체 인식을 사용
- 특정 주제에 글쓴이의 성향에 따라 텍스트를 극성(감성,의견) 분류하는 방법

응용 :사용자 추천시스템 (의견 ,선호도 기반 )

• 텍스트 데이터의 정제와 준비 : BOW model: 특성 벡터 인코딩, tf-idf사용 적합성 기준 단어 빈도에 가중치 부여
• 텍스트 문서로부터 특성 벡터 구축
• 로지스틱 회귀 분류기 :영화 리뷰를 긍정 또는 부정으로 분류러닝 모델을 훈련 
 외부 메모리 학습(out-of-core learning)을 사용하여 대용량 텍스트 데이터셋 다루기
•LDA-  토픽 모델링 :문서를 카테고리로 묶기 위해 문서의 토픽(topic) 추론

1. 텍스트 데이터의 정제와 준비

데이터셋: IMDb(Internet Movie Database)의 영화 리뷰 5만 개각 리뷰가 긍정(positive)인지 부정(negative)인지 구별하는 예측기
긍정 :별 5개 이상
부정:별 5개 이하
* 이진 분류기인 경우 중립은 threshold (별 5개 근처) 인경우, 다중 분류기인 경우 긍정,부정,중립 or scailing system( -10 ...+10)

압축풀기
datafranmme 형태로 바꾸기

실습

IMDB 영화 데이터셋 압축파일 :  http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz

불러오는 중입니다...

CSV파일들을 하나로 합친 후 데이터프레임 형태로 변환

긍정=1, 부정=0 으로 클랫스 레이블하여 데이터프레임의 sentiment행에 추가

 

#압축데이터 다운로드 
!wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
!pip install pyprind

import os
import tarfile

if not os.path.isdir('aclImdb'):

    with tarfile.open('aclImdb_v1.tar.gz', 'r:gz') as tar:
        tar.extractall()

# 데이터 전처리 (CSV >> Pd.dataframe형태)
import pyprind
import pandas as pd
import os

# `basepath`를 압축 해제된 영화 리뷰 데이터셋이 있는 디렉토리로 바꾸세요

basepath = 'aclImdb'

labels = {'pos': 1, 'neg': 0}
pbar = pyprind.ProgBar(50000)
df = pd.DataFrame()
for s in ('test', 'train'):
    for l in ('pos', 'neg'):
        path = os.path.join(basepath, s, l)
        for file in sorted(os.listdir(path)):
            with open(os.path.join(path, file), 
                      'r', encoding='utf-8') as infile:
                txt = infile.read()
            df = df.append([[txt, labels[l]]], 
                           ignore_index=True)
            pbar.update()
df.columns = ['review', 'sentiment']

#np.random모듈의 permutation 함수 이용 데이터 프래임의 행 순서 섞기
import numpy as np
np.random.seed(0)
df = df.reindex(np.random.permutation(df.index))

BoW(Bag-of-Word)모델: 가방속 단어를 섞어서 빈도수에 따라서 끄냄

범주형 데이터를 머신 러닝 알고리즘에 주입하기 전에 텍스트를 수치 특성 벡터로 변환

1. 전체 문서에 대해 고유한 토큰(token), 예를 들어 단어로 이루어진 어휘 사전(vocabulary)을 만듭니다.

2. 특정 문서에 각 단어가 얼마나 자주 등장하는지 헤아려 문서의 특성 벡터를 만듭니다.(대부분 0)-> 희소(Sparse)


각 문서에 있는 고유한 단어는 BoW 어휘 사전에 있는 모든 단어의 일부분에 지나지 않으므로 특성 벡터는 대부분이 0으로 채워집니다. 
특성 벡터는 희소(sparse)하다

한국어 KONLpy :kiwi? :( java

1.단어를 특성벡터로 변환(횟수 기반) 

문서/문장을 입력 받아 어휘사전 구축하여 특성벡터로 변환 -띄어쓰기 기반으로 

  • 1-gram or unigram: 어회 사전에 있는 각 아이템 또는 토큰이하나의 단어 표현
  • n-gram: NLP dptj 연속된 아이템(item seqeuence) 단어,문자,기호 의 시퀀스

예. ngram_range default :1-gram

  • 1-gram : "the" "sun" "is" "shining"
  • 2-gram : "the sun" "sun is" "is shininig"
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
# 문서/문장 입력 받아서 BoW모델 생성
count = CountVectorizer()
docs = np.array([
        'The sun is shining',
        'The weather is sweet',
        'The sun is shining, the weather is sweet, and one and one is two'])
#모델의 어휘사전 구축하고 문장을 특성벡터로 변환
bag = count.fit_transform(docs)
print(count.vocabulary_)

어휘사전은 고유단어와 정수 인덱스가 매핑되어있음

{'the': 6, 'sun': 4, 'is': 1, 'shining': 3, 'weather': 8, 'sweet': 5, 'and': 0, 'one': 2, 'two': 7}

특성 벡터의 각 인덱스는 CountVectorizer의 어휘 사전 딕셔너리에 저장된 정수 값에 해당됩니다.

예.

  • 인덱스 0 : 특성 ‘and’ 단어의 빈도(마지막 문장에 2번 나타남)
  • .인덱스 1:  특성 벡터의 두 번째 열) 단어 ‘is’는 세 문장에 모두 등장합니다.
  • 문서 d에 등장한 단어 t의 횟수를 tf (t,d)

[[0 1 0 1 1 0 1 0 0]  The sun is shining

[0 1 0 0 0 1 1 0 1] the wather is sweat 

[2 3 2 1 1 1 2 1 1]]

 

 

2. tf-idf 단어 적합성 평가 :비정화된 문서에서도 자주등장하는 단어 

가중치 -단어 빈도

예.is 높은 빈도수지만 의미가 없는 불용어 - >  가중치 낮춤
3.텍스트 데이터 정제 :정규표현식 이용 불필요한 단어 제거 *이모티콘은 유용


4.문서를 토큰으로 나누기 - 띄어 쓰기

Stemming 어간 추출

토큰 나눔

불용어: is, has, and 단어 빈도 이용 제거


5.공백문자 기준
6.어간 추출(Stemming): running=> run
7.불용어(stopwords) 제거 감정분석시 유용성 낮으므로 제거

8.3 문서 분류를 위한 로스지틱 회귀 모델 훈련

 

데이터 세트 훈련과 테스트로 나누기

5fold 계층별 교차검증 - 최적의 매개변수 조합 찾기

GridSearch 매개변수 조합의 개수 적절히 제한

 

8.4 대용량 데이터 처리: 온라인 알고리즘과 외부 메모리 학습( out-of-core learning)

외부 메모리 학습:  한 컴퓨터의 메인 메모리를 초과할만한 데이터 양을 처리하는 알고리즘으로 로컬하드 디스크나 웹 리포지터리와 같은 데이터 저장소로 가능,데이터셋을 작은 배치로 나누어 분류기를 점진적 학습

8.5 잠재 디리클레 할당( Latent Dirlchlet Allocation, LDA)을 사용한 토픽 모델링

토픽 모델링: 비지도학습으로 문서의 토픽을 추론

예. 많은 뉴스기사를 카테고리 분류

LDA사용 텍스트 문서 분해

LDA: 문서에서 자주 등장하는 단어의 그룹을 찾는 확률적 생성 모델

입력:BOW모델(행렬)

출력: 문서-토픽행렬& 단어-토픽 행렬 곱= 가장 작은 오차로 bOW입력 행렬 재구성

하이퍼 파라미터 : 토픽 개수, 최대 문서 빈도, 자주 등장하는 단어 갯수 제한

베이지안 추론(Beysian Inference)

기대값 최대화 (Expectation Maximizaion ,EM) -반복적 파라미터 추정값 업데이트

 

머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로 목차

 

머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로 목차

<머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로 Python Machine Learning By Example, 2/E : Implement machine learning algorithms and techniques to build intelligent systems(Paperback, 2nd Edition)..

potato-potahto.tistory.com

 

반응형