본 프로젝트는 Google Play Store 리뷰 텍스트를 기반으로 사용자 반응이 전반적으로 긍정적인지, 부정적인지 판단하는 감성분석 프로젝트이다.
학습 단계에서는 Sentiment140 데이터셋을 사용해 BERT 기반 분류 모델을 학습하고, 추론 단계에서는 Google Play 리뷰 데이터에 대해 긍·부정 비율을 산출한다.
- Sentiment140 Dataset (sample)
- 컬럼:
text,label - 이진 분류 (0: Negative, 1: Positive)
- Google Play Store 리뷰 데이터
- 라벨 없음
- 텍스트 컬럼만 사용하여 감성 비율 산출
- BERT (bert-base-uncased) 기반 문장 임베딩
- Pooler Output 사용
- Dropout + Fully Connected Layer
- 이진 분류 (Positive / Negative)
data/
├ sentiment140_sample.csv
└ google_play_store_reviews.csv
src/
├ dataset.py # 학습/평가용 Dataset
├ inferencedataset.py # 추론용 Dataset (label 없음)
├ model.py # BERT 기반 감성분석 모델
├ train.py # 학습 로직
├ evaluate.py # 평가 로직 (Accuracy, F1)
├ inference.py # Google Play 리뷰 추론
└ main.py # 전체 학습 파이프라인
본 프로젝트의 최종 목표는 Google Play Store 리뷰 전반의 감성 경향(긍·부정 비율)을 파악하는 것이다. 그러나 실제 Google Play 리뷰 데이터는 대부분 라벨이 존재하지 않기 때문에 직접적인 지도학습이 불가능하다.
이에 따라, 사전에 감성 라벨이 명확히 부여된 공개 데이터셋을 활용해 모델을 학습한 뒤, 해당 모델을 Google Play 리뷰에 적용하는 방식을 적용하였다. 데이터셋으로는 Sentiment140을 선택하였다.
Sentiment140은 트위터 문장을 기반으로 구성된 대규모 감성 분석 데이터셋으로, 짧은 비공식 텍스트에 대한 긍·부정 표현이 풍부하게 포함되어 있다. 이는 사용자 리뷰 텍스트와 언어적 특성이 유사하여, 리뷰 감성 분류 사전 학습 데이터로 적합하다고 판단하였다.
-
각 샘플은 하나의 문장과 감성 라벨로 구성됨
-
라벨 정의:
0: Negative1: Positive
-
본 프로젝트에서는 전체 데이터 중 일부를 샘플링하여 사용함
텍스트는 이모지, 축약어, 구어체 표현을 포함하고 있어, 실제 사용자 리뷰 환경과 유사한 분포를 가진다.
모델의 일반화 성능을 평가하기 위해 데이터를 다음과 같이 분할하였다.
- Train set: 80%
- Validation set: 10%
- Test set: 10%
긍·부정 클래스 비율이 한쪽으로 치우치는 것을 방지하기 위해, 모든 분할 과정에서 stratified split을 적용하였다. 이를 통해 학습·검증·테스트 데이터 모두 유사한 감성 분포를 유지하도록 하였다.
모든 텍스트 데이터는 BERT 모델 입력 형식에 맞게 전처리되었다.
- Tokenizer:
bert-base-uncased - 최대 토큰 길이: 64
- 길이가 짧은 문장은 padding 적용
- 길이가 긴 문장은 truncation 적용
- Attention mask 생성
본 프로젝트에서는 문장의 세부 구조보다는 전반적인 감성 신호를 포착하는 것이 목적이므로, 비교적 짧은 최대 길이를 사용하였다.
감성 분류 모델은 사전 학습된 BERT를 기반으로 구성하였다.
- BERT Encoder (
bert-base-uncased) - Pooler Output 사용 (CLS 토큰 기반 문장 표현)
- Dropout (0.3) 적용하여 과적합 방지
- Fully Connected Layer를 통해 이진 분류 수행
해당 구조는 문장의 전체적인 의미를 반영한 임베딩을 바탕으로, 긍·부정을 분류하는 데 초점을 둔다.
모델 학습은 다음과 같은 설정으로 진행되었다.
- Optimizer: AdamW
- Learning Rate: 3e-5
- Batch Size: 32
- Epochs: 3
- Loss Function: CrossEntropyLoss
Validation 성능을 기준으로 학습 과정을 모니터링하였으며, 과적합을 방지하기 위해 비교적 적은 epoch 수를 사용하였다.
학습 완료 후, Validation 및 Test 데이터에 대해 성능 평가를 수행하였다.
-
평가 지표:
- Accuracy
- F1-score
특히 클래스 불균형 가능성을 고려하여 F1-score를 주요 지표로 사용하였다. 평가 결과, Validation 기준 약 0.85 수준의 F1-score를 기록하였다.
이는 모델이 일반적인 긍·부정 표현을 구분하는 데 충분한 성능을 갖추었음을 의미한다.
학습이 완료된 모델 가중치는 저장 후, Google Play Store 리뷰 데이터에 대한 추론 단계에 사용되었다.
Google Play 리뷰 데이터는 라벨이 없으므로, 개별 예측의 정확도보다는 전체 리뷰 집합에 대한 감성 분포를 분석하는 데 초점을 두었다.
이를 통해 특정 앱에 대한 사용자 반응이 전반적으로 긍정적인지, 혹은 부정적인지에 대한 비율을 통한 정량적 지표를 도출할 수 있다.
본 프로젝트는 이러한 접근을 통해, 실제 서비스 환경에서 활용 가능한 리뷰 감성 모니터링 파이프라인의 예시를 제시한다.
본 프로젝트에서 사용한 학습 데이터(Sentiment140)와 추론 대상 데이터(Google Play 리뷰)는 동일한 도메인은 아니며, 다음과 같은 차이를 가진다.
- Sentiment140: 짧은 트위터 문장, 구어체·축약어 중심
- Google Play 리뷰: 상대적으로 긴 문장, 서비스 사용 경험 기반 서술
그럼에도 불구하고 두 데이터는 다음 공통점을 가진다.
- 사용자 자발적 작성 텍스트
- 감정 표현(불만, 만족, 추천, 비판 등)이 명확히 드러남
- 비정형 자연어 데이터
본 프로젝트는 이러한 공통점에 주목하여, 도메인 간 완전한 일치를 목표로 하기보다는 감성 표현의 일반적 패턴을 학습하는 방향을 채택하였다.
Google Play Store 리뷰 데이터에 대해 학습된 BERT 기반 감성분석 모델로 추론을 수행한 결과는 다음과 같다.
Positive 비율: 약 45%
Negative 비율: 약 55%
추론 결과, 긍정 리뷰 비율이 50%를 하회하여 부정 리뷰의 비중이 더 높게 나타났다.
본 결과는 특정 리뷰 하나하나의 정확한 감성 판단보다는, 리뷰 전체 집합을 기준으로 한 사용자 반응의 방향성을 보여준다. 긍·부정 비율 차이가 크지 않다는 점에서, 서비스에 대한 강한 불만이 누적된 상태라고 보기는 어렵지만, 전반적인 사용자 경험 측면에서 개선이 필요한 요소가 존재함을 시사한다. Negative 비율: 약 55%
본 프로젝트 구조는 다음과 같은 확장이 가능하다.
- Google Play 리뷰를 기간별로 분리하여 시계열 감성 변화 분석
- 별점 정보와 감성 예측 결과의 상관관계 분석
- 다중 클래스 감성 분류(긍정 / 중립 / 부정)로 확장
- 도메인 적응(Domain Adaptation)을 통한 성능 개선
이를 통해 단순 감성 분류를 넘어, 서비스 품질 분석 및 사용자 경험 개선을 위한 데이터 파이프라인으로 확장할 수 있다.