작성자 : 전우빈
작성일 : 2023-04-04
0. 활동목표
1) 학습데이터를 통해 자연어 처리 기술과 머신 러닝 알고리즘을 활용하여 감성 분석모델을 개발
2) 이 모델을 통해 테스트 데이터를 분석하여 sentiment가 긍정적인지 부정적인지 판단하여 결과를 예측
1. KAGGLE COMPETITION
1) 데이터 확인
학습데이터 -> 25000개의 긍정적인 리뷰와 25000개의 부정적인 리뷰로 구성
테스트 데이터 -> sentiment 칼럼이 존재하지 않아 긍정적인지 부정적인지 판단을 할 수 없음
(Andrew L. Maas, Raymond E. Daly, Peter T. Pham, Dan Huang, Andrew Y. Ng, and Christopher Potts. (2011). "Learning Word Vectors for Sentiment Analysis." 의 논문을 출처로 하는 IMDB데이터셋으로 Stanford AI Group에서 제공함.)
2) 프로젝트 수행 순서
- 데이터 로드: 주어진 학습 데이터와 테스트 데이터를 로드한다. pandas를 사용하여 CSV 파일을 읽어들이는 것이 좋다.
- 데이터 전처리: 영화 리뷰 텍스트를 전처리한다. 전처리 과정에는 HTML 태그 제거, 특수 문자 제거, 소문자 변환, 불용어 제거 등이 포함된다.
- 텍스트 표현: 전처리된 텍스트를 수치형 데이터로 변환한다. Bag of Words, TF-IDF, Word2Vec 등의 기법을 사용하여 텍스트를 벡터로 표현할 수 있다.
- 모델 선택 및 훈련: 알맞은 모델을 선택하고, 학습 데이터를 사용하여 모델을 훈련시킨다. 모델 선택은 문제에 따라 다르며, 일반적인 선택에는 로지스틱 회귀, 나이브 베이즈, SVM, 딥러닝 기반 모델(LSTM, GRU, BERT 등)이 있다.
- 모델 검증 및 튜닝: 검증 데이터셋을 사용하여 모델의 성능을 평가하고, 하이퍼파라미터 튜닝을 통해 최적의 모델 구성을 찾는다.
- 모델 평가: 테스트 데이터에 대해 최종 모델을 평가하고, 예측 결과를 생성한다.
- 결과 제출: 생성된 예측 결과를 대회에서 요구하는 형식에 맞게 제출한다.
위의 순서는 일반적인 프로젝트 수행 순서로, 필요에 따라 각 단계를 조정하거나 추가할 수 있다. 주요 목표는 주어진 텍스트 데이터를 이해하고, 효과적인 텍스트 표현 및 분류 방법을 찾아내는 것이다.
2. 데이터 전처리
1) 자연어 처리란?
자연어는 일상적으로 사람이 사용하는 언어를 뜻한다. 자연어는 일반적으로 컴퓨터와 같은 기계는 이해하기 힘들기 때문에 컴퓨터가 자연어를 이해하고 학습할 수 있게 해주는 것을 자연어 처리라고 한다. 이 과정에서 자연어으이 형태소 분석, 품사 부착, 구절 단위 분석 등이 이루어진다.
2) 자연어 처리의 용도
(1) 고객 감정: 항목 분석을 사용해 문서 및 채널에서 필드를 찾아 라벨을 지정하여 고객 의견을 보다 잘 이해하고 제품 및 UX 정보를 파악 할 수 있다.
(2) 영수증 및 인보이스 이해: 항목을 추출하여 영수증과 인보이스에서 날짜나 가격과 같은 일반적인 항목을 식별하면 요청과 결제의 관계를 이해할 수 있다.
(3) 문서 분석: 수동 분석에 시간과 비용을 쓰지 않고도 커스텀 항목 추출을 사용하여 문서에서 분야별 항목을 식별할 수 있다.
(4) 콘텐츠 분류: 공통 항목, 분야별 커스텀 항목 또는 700개 이상의 일반적인 카테고리 (예:스포츠 및 엔터테인먼트)를 기준으로 문서를 분류할 수 있다.
(5) 트렌드 추적: 마케팅 담당자가 온라인 뉴스, 기사, 기타 데이터 소스에서 브랜드와 관련된 콘텐츠를 추출할 수 있는 뉴스를 텍스트에서 집계할 수 있다.
(6) 의료: 임상 시도를 가속화할 수 있도록 향상된 임상 문서, 데이터 마이닝 연구, 자동화된 레지스트리 보고를 지원한다.
3) 텍스트 전처리
-데이터 설명
labeledTrainData와 tesdData 두 가지를 이용
labeledTrainData는 id-sentiment-review 3개의 칼럼으로 이루어져 있다. id는 글쓴이의 id, sentiment=1이면 긍정, 0이면 부정의 리뷰를 뜻한다. review는 글쓴이가 쓴 리뷰이다.
testData는 id-review 2개의 칼럼으로 이루어져 있다.
labeledTrainData를 기반으로 학습한 후 testData의 sentiment를 예측하는 방식으로 진행한다.
4) 자연어 처리
testData/labeledTrainData
(1) 특수문자 및 html 태그 제거
from bs4 import BeautifulSoup
BeautifulSoup(raw_review, "html.parser").get_text()
ex) train_data['review'][0][:700]
from bs4 import BeautifulSoup as bs
example1=bs(train['review'][0], "html.paraser")
print(train['review'][0][:700])
example1.get_text()[:700]
(2) 정규표현식을 이용해 알파벳을 제외한 모든 문자 제거
import re
letters_only = re.sub("[^a-zA-Z]", " ", review_text)
ex)
import re
print(example1.get_text()[:700])
letters_only=re.sub('[^a-zA-z]', ' ', example1.get_text())
print('\n', letters_only[:700])
(3) 토큰화
words = letters_only.lower().split()
ex)
words=letters_only.lower().split()
print(len(words))
words[:10]
(4) 불용어 처리
import nltk
nltk.download('punkt')
nltk.download('stopwords')
stops = set(stopwords.words("english"))
meaningful_words = [w for w in words if w not in stops]
ex)
stopwords에 어떤 단어들이 있는지 보여주기 위한 코드
import nltk
from nltk.corpus import stopwords
stopwords.words('english')[:10]
토큰화한 단어 중 stopwords에 없는 단어만 남기는 방식으로 불용어 처리
words=[w for w in word if not w in stopwords.words('english')]
print(len(words))
words[:10]
3. 텍스트 분석
1) embedding
자연어 처리에서의 embedding은 텍스트 데이터를 저차원 벡터로 변환하는 기술이다.
이렇게 하는 이유는 컴퓨터가 텍스트 데이터를 바로 이해할 수 없고 숫자 형태로 바꾸어야 이해가 가능하기 때문이다.
이러한 embedding 기술은 단어나 문장의 의미를 그대로 보존하면서 머신러닝모델에 사용할 수 있기 때문에 자연어 처리에서 매우 중요한 전처리 과정이라고 할 수 있다.
embedding을 하는 방식은 총 2가지가 있다.
첫번째 방법은, one-hot encoding으로 각 단어를 벡터화 시킬 때, 해당 단어의 인덱스에만 1을 두고 나머지 인덱스에는 0을 두는 방법이다. 하지만 이러한 방법은, 벡터의 차원이 매우 커지기 때문에 데이터의 희소성이 증가하며, 연산량이 증가하는 문제점이 존재한다.
두번째 방법은 Distributed Representation으로 각 단어를 고정된 차원의 벡터로 표현하는 것이 아니라, 임의의 차원의 벡터로 표현한다. 이러한 벡터는 단어의 의미를 나타낸다는 장점이 있다
2) BOW
BOW란 문서 내의 단어들을 모두 세어서, 단어의 빈도 수를 기반으로 벡터화하는 방법이다. 우선 문서 내의 모든 단어들을 모아서 하나의 단어장을 만든 후 각 문서를 단어장의 단어들로 이루어진 벡터로 표현한다. 이 때, 벡터의 각 차원은 해당 단어의 빈도수를 나타낸다.
예를 들어, I love NLP, NLP is so interesting이라는 문서가 존재하면 이 문서를 "I, love, NLP, is, so, interesting"라는 단어장으로 표현한 후 [1,1,2,1,1,1]이라는 벡터로 표현한다.
문서 내의 단어들을 숫자로 표현 할 수 있어 컴퓨터가 이해하기 쉬운 형태로 표현할 수 있다. 그러나 BOW기법은 문맥(context)정보를 고려하지 않는다는 단점이 있다.
3)Word2vec
word2vec는 Distributed Representation 방법을 사용하는 기법으로 CBOW(Counting Bag of Words)와 Skip-gram 두 가지 모델을 사용하여 단어를 임베딩한다.
CBOW모델에서는 중심 단어를 예측하는 방식으로 학습한다. 주변에 있는 단어들을 입력으로 사용하여 주변 단어들의 임베딩 벡터들을 더한 후, 이를 가지고 중심 단어를 예측하는 신경망을 학습한다.
예를 들어, The cat on the mat라는 문장이 있고 중심 단어를 sat이라 한다며느 sat 외의 단어들만을 입력으로 하여 중심 단어인 sat를 예측하는 신경망을 학습하는 것이다.
Skip-gram 모델에서는 반대로 중심단어 주변에 있는 단어들을 예측하는 방식으로 학습한다. 중심 단어만을 입력으로 받고 입력 받은 단어의 임베딩 벡터를 통해 주변 단어들을 예측하는 신경망을 학습한다.
Skip-gram 모델은 주변 단어들을 각각 독립적으로 예측하기 때문에 CBOW 모델보다 학습이 느리다는 단점이 있지만, 대규모 데이터에서 더욱 정확한 임베딩 벡터를 학습할 수 있다는 장점이 있다.
4. 딥러닝
1) RNN
RNN은 과거의 정보를 사용하여 현재 및 미래의 입력에 대한 신경망의 성능을 개선하는 딥러닝 신경망이다.
일반적으로 RNN은 시계열 데이터나 자연어 처리(NLP)와 같은 순차적인 데이터를 처리하는 데에 사용됩니다. 예를 들어, 문장을 입력으로 받아 다음 단어를 예측하는 작업에 사용할 수 있습니다.
RNN은 기본적으로 Hidden State라는 개념을 가지고 있습니다. Hidden State는 RNN이 각 단계에서 기억하고 있는 정보를 담은 벡터입니다. Hidden State는 이전 단계에서의 출력과 현재 단계에서의 입력으로 계산됩니다.
2) LSTM
LSTM은 일종의 RNN으로, RNN과 달리 긴 의존 기간을 필요로 하는 학습을 수행할 능력을 가진다.
실질적으로 간단한 RNN은 장기적인 의존관계를 학습하는 능력이 제한적이다. RNN은 일반적으로 역전파를 통해 훈련되며, 여기서 ‘소실’ 또는 ‘폭주’하는 기울기 문제에 직면할 수 있다. 이러한 문제로 인해 신경망의 가중치가 아주 작아지거나 아주 커지므로 신경망이 장기적인 관계를 훈련해야 하는 응용 분야에서 효율성이 떨어지게 된다.
이러한 문제를 극복하기 위해 LSTM 신경망은 부가적인 게이트를 사용하여 은닉 셀의 어느 정보를 출력과 다음 은닉 상태로 보낼지 제어한다. 부가적인 게이트를 통해 신경망은 데이터에 있는 장기적인 관계를 더욱 효과적으로 훈련할 수 있다. LSTM 신경망은 시간 격차에 대한 민감도가 낮으므로 단순한 RNN에 비해 순차 데이터를 분석하는 데 더욱 적합하다.
기존 RNN의 은닉 상태 이외에도 LSTM 블록의 아키텍처에는 일반적으로 아래에서 보이는 것과 같이 기억 셀, 입력 게이트, 출력 게이트, 망각 게이트 등이 있다.
-Memory Cell(기억셀): 과거의 정보 저장
-Input gate(입력 게이트): 현재 정보를 기억하기 위한 게이트. 직전 hidden state와 input을 받아 시그모이드를 취하고, 또 같은 입력으로 하이퍼볼릭탄젠트를 취해준 다음 Hadamard product 연산을 한 값이 바로 입력 게이트가 내보내는 값
-Forget gate(망각 게이트): 과거 정보를 잊기 위한 게이트. 직전 hidden state를 받아 시그모이드를 취해준 값이 바로 forget gate가 내보내는 값
Output gate(출력 게이트): 현재 상태에서 어떠한 정보를 출력할지 결정하는 게이트.
이러한 과정을 통해 LSTM은 이전의 입력값과 상태를 기억하고, 현재 입력값과 이전 상태를 기반으로 현재 출력을 계산한다. 이를 통해 장기 의존성 문제를 해결하고, 더욱 정확한 예측을 할 수 있게 된다.
3) LSTM 작동 방식
LSTM은 벡터화된 텍스트 데이터를 입력값으로 받아 분류 작업을 수행한다.
LSTM의 입력값은 시퀀스 형태로 주어진다. 이 시퀀스는 각각의 단어가 벡터화된 형태로 이루어져 있다. 예를 들어, 문장 "I love cats"는 [0.2, 0.8, 0.5], [0.4, 0.7, 0.1], [0.6, 0.3, 0.9], [0.3, 0.2, 0.4]와 같이 단어마다 벡터로 표현된다.
이렇게 벡터화된 시퀀스가 LSTM의 입력으로 주어지면, LSTM은 각각의 시점(time step)에서 입력값을 받는다. 즉, LSTM은 입력 시퀀스를 단어 단위로 하나씩 받아들인다.
LSTM은 각 시점에서 입력값을 받을 때, 현재의 입력값을 이전 시점의 출력값과 함께 처리한다. 이전 시점의 출력값은 LSTM의 hidden state로 저장되어 있으며, 입력값과 hidden state를 결합하여 현재 시점의 LSTM의 입력값을 생성한다. 이후, LSTM은 현재 시점의 입력값을 처리하고 현재 시점의 hidden state와 출력값을 생성한다. 이 출력값은 다음 시점의 입력값과 함께 다시 LSTM의 입력값으로 사용된다. 이런 방식으로 LSTM은 시퀀스의 각 단어마다 입력값을 받아들이고, 분류 작업을 수행한다.
LSTM은 입력값과 hidden state를 결합하여 현재 시점의 입력값을 생성하는 과정에서, 가중치 매개변수를 이용하여 입력값과 hidden state를 공간상에서 결합하게 된다. 이를 통해 LSTM은 이전 시점의 정보를 현재 시점에 전달하며, 시퀀스 데이터의 장기 의존성 문제를 해결할 수 있다.
4)LSTM과 BERT의 비교
이 대회에서 LSTM을 사용하면 텍스트 데이터의 시퀀스 특성을 더 잘 반영할 수 있으며, 이를 통해 보다 정확한 분류 결과를 얻을 수 있다. 하지만 LSTM은 복잡한 모델 구조를 갖고 있기 때문에 학습 속도가 느리고 하이퍼파라미터를 조절해야 할 수 있다. 따라서 적절한 하드웨어 환경과 충분한 컴퓨팅 자원이 필요하다.
반면, BERT(Bidirectional Encoder Representations from Transformers)는 딥 러닝 기반의 언어 모델 중 하나로, Google에서 개발한 모델이다. BERT는 자연어 처리 분야에서 현재 가장 인기 있는 모델 중 하나로, 다양한 자연어 처리 태스크에서 우수한 성능을 보인다.
BERT는 Transformer라는 아키텍처를 기반으로 한다. 이는 입력 시퀀스와 출력 시퀀스를 동시에 처리할 수 있는 Self-Attention 기반의 모델 구조를 갖고 있다. 이 구조를 활용하여 문맥 정보를 반영한 임베딩을 생성하고, 이를 이용하여 각종 자연어 처리 테스크를 수행한다.
BERT는 Pre-training과 Fine-tuning 두 단계로 구성된다. Pre-training 단계에서는 대량의 텍스트 데이터를 이용하여 모델의 파라미터를 학습시킨다. 이후 Fine-tuning 단계에서는 Pre-training된 모델을 다양한 자연어 처리 태스크에 맞게 Fine-tuning하여 해당 태스크를 수행하는 모델을 생성한다.
따라서, 이 대회에서 BERT를 사용하면 높은 성능을 얻을 수 있다. 하지만 BERT 모델은 매우 크고 복잡한 모델이기 때문에 학습 속도가 느리고, 많은 계산 자원이 필요하다. 또한 Fine-tuning 시에도 적절한 하이퍼파라미터를 설정해야 하며, 데이터 전처리도 중요한 역할을 한다.
'Study > Kaggle competition' 카테고리의 다른 글
Kaggle competiton #1 : Titanic survivor predictions (0) | 2023.04.12 |
---|---|
kaggle competition #3 (0) | 2023.04.03 |
Kaggle competition #2 (0) | 2023.04.03 |
Kaggle competition #5 : House Price prediction (0) | 2023.03.23 |