본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python | 분석 | 감성분석(전처리 및 RNN) - 쇼핑몰 후기 감성분석

728x90
반응형

 

1. 데이터 불러오기

df1 = pd.read_table('C:/Users/*****/Documents/shopping_ratings_total.txt', names = ['ratings', 'reviews'])

 

 

Y 가공(긍정: 1, 부정: 0)

 

 

학습 데이터 선택

 

 

 

2. 전처리

1) 불용어 및 조사 사전 생성

 

2) 추가 불용어 처리

  - 빈도수가 1인 단어 목록 불용어 사전 추가

 

3) 토큰화 + 일반화

 

 

 

3. RNN 전처리(RNN에 필요한 형태로 전처리)

 

STEP 1) 정수 인코딩(벡터화)   -  지난 나이브 베이즈 게시글에서는 countvectorizer 사용

  1) 단어별 매핑 정보 생성

 

 

2) 정수 변환

 

 

3) 패딩(padding) - 길이가 다른 학습 데이터의 길이를 맞추어 주는 작업(zero - padding: 부족한 자리를 0으로 채움)

 

DTM을 만들어야 하는데, 지난 게시물에서의 countvectorizer는 DTM을 단어별로, 가나다 순으로 나열하여 가방이 0, 신발이 1, 학교가 13 등 이런 식으로 나열하여, 각각의 첫 번째 컬럼이 가방이었다면 가방이 몇 개가 포함되는지 들어간다.

즉, 모든 단어의 정보를 펼쳐 그 개수만큼 만드므로 문장마다 길이가 달라질 수 없다. 

정리하면, 원래 문장들의 길이는 다르지만, 변환된 과정에서 전체 문장을 학습하여 발생 가능한 모든 단어를 컬럼화하여 그 사이사이에 포함된 단어만 확인하였다. 그래서 countvectorizer는 각각의 문장들마다 길이를 맞추어주는 작업이 필요 없다.

 

우리가 가진 문장의 길이를 그대로 가지고 있으면 학습이 되지 않는다. 규격화가 필요한데, 서로 다른 길이로 벡터화된 데이터를 같은 길이로 바꾸는 작업을 패딩(padding)이라고 한다. 

위에서 말한 것처럼 countvectorizer는 규격이 다 맞추어지므로 패딩 과정이 필요 없다. 

그러나 원핫인코딩은 단어들마다 숫자만 부과되므로 벡터화 하는 작업이 필요하다. 뒤의 공간을 채울 때 보통 0을 넣는데, 이를 제로 패딩이라고 하며 이 제로 패딩 작업을 통하여 뒤의 길이를 맞추어주는 작업을 하므로, 기계가 인지하는 작업은 +1이 되어야 한다(가장 긴 길이 +1).

 

 

STEP 1) 데이터별 길이 확인 및 시각화 (문장의 길이를 맞추는 작업이 필요하므로)

 

 

STEP 2) 히스토그램 시각화

 

 

max len을 맞추는 작업을 진행할 때, 함수로 너무 많은 데이터가 손실되면 위험하다. 중요한 단어가 뒤에 있을 수도 있기 때문이다. 장점이라면 차원이 낮아져서 학습이 빨라진다.

max len이 작으면 학습 속도가 빨라지는 장점이 있으나 정보 손실이 발생하여 예측 정확도가 떨어질 수 있다. 반대로 max len이 크면 학습 속도는 느려지지만 정보 손실이 발생하지 않는다.

 

 

STEP 3) 패딩 작업 진행(max len 을 35로 설정함)

 

 

패딩 전, 후 데이터 비교

 

 

 

728x90

 

 

 

4. 데이터 분리

 

 

 

5. 모델링

seed값 고정하게 되면, 초기 값만 고정되고 학습하면서 랜덤하게 보폭에 따라 학습하므로 모델이 달라지기는 하나, 크게 달라지는 것을 방지해줄수는 있다.

 

 

임베딩

보다 dense하게 저차원으로 변환하는 기법이 임베딩이다.

임베딩 차원을 결정하여야 하는데, 너무 많은 데이터가 2차원에 임베딩 되면 저차원 공간에 2000여개나 되는 데이터를 만들어내는 과정에 있어 계산량에 문제가 될 수 있다. 그래서 적절한 차원으로 만들어야 한다.

대체적으로 임베딩 차원의 경우 100, 200, 400 이런 식으로 2의 배수 형태로 결정을 많이 하는 편이다.

hidden unit도 12, 32, 64, 128 이런 식으로 많이 쓴다. 경험적인 결정을 하여야 한다.

 

 

임베딩 차원 및 hidden unit 수 결정

 

 

모델 생성

 

model.add(Embedding(word_cnt, embedding_dim))  → Embedding(모델이 학습하여야 할 단어 수, 임베딩 차원)

model.add(SimpleRNN(hidden_unit, return_sequences = True))  → SimpleRNN = 바닐라 RNN.  RNN 층을 생성하는 작업이며, return_sequences  = True의 경우 1만개 테스트 할 때 추가하였다.

model.add(SimpleRNN(256)) → 1만개 테스트 할 때 RNN 층 하나 더 추가. 이 층을 추가 하므로써 위에 return_sequences = True를 설정한 것이다. sequences를 뱉도록 하여야 하기 때문.

model.add(Densce(2, activation = 'sigmoid')) → 출력층 생성 작업. 여기서는 왜 Conv2D를 하지 않는가? 이는 flatten을 왜 하지 않았는가에 대한 질문인데, 텍스트가 3차원이기는 하지만 패딩을 거쳐 같은 공간에 만들어서 2차원이 되었기 때문이다.

그리고 sigmoid가 효과적인지, softmax가 효과적인지는 테스트 해보아야 한다. 2개니까 softmax가 가능하다.

 

 

모델 compile

 

 

정지 규칙 생성

 

 

학습

 

 

 

학습 결과 확인

 

 

 

반응형

 

 

6. 평가

 

 

 

RNN 실습 끝

728x90
반응형