플레이스토어 Review 데이터의 리뷰 감정에 따른 토픽별 요약 모델
팀명 : 연어들
팀원 : 김종민, 김한빈, 송규원, 엄소은, 전재현, 차혜준
Presentation PDF
Presentation Youtube
1. 개요
- Background:
- 로드맵 설정은 PM의 큰 고민
- 리뷰를 통해 인사이트를 얻을 수 있으나 그 수가 너무 많음
- 기획 내용
- 리뷰를 감정별-토픽별로 계층화하여 분리
- 이후 각 토픽별로 요약하여 인사이트를 한줄로 표현함
- 해결 방법
- Playstore Review Data를 확보
- 전처리 진행 (문장 분리 / stop word 설정 / pos 기준 설정 등)
- KoBERT fine-tuning을 활용하여 감정 분류
- BERTopic을 활용하여 토픽 분류
- KoBART-summarization를 활용하여 리뷰 요약
- 평점별로 최종 분류
2. 리뷰 데이터 확보
- 플레이스토어 '수면' 키워드를 가진 앱을 기준으로 리뷰 데이터 확보
- 총 20개 어플에서 19,833개의 리뷰 수집
- 각 리뷰별로 user id, rating, date, review 데이터 확보
- 자세한 코드는
data/crawling
폴더 확인 - inference 상황에서도 동일한 crawling을 진행 -
crawler.py
확인
3. 데이터 전처리
- 추후 감정 분류 모델에서 발생 가능한 데이터 불균형을 해소하고자 리뷰 데이터 분포 조절
- 리뷰 데이터 특성 상, 한 리뷰 내에 긍/부정 감정이 함께 들어있음을 확인 -> 리뷰를 문장 단위로 분리
- 품사 수가 부족한 문장을 제거하도록 하여 의미가 크지 않은 문장을 제외
- 자세한 코드는
data/preprocess
폴더 확인 - inference 상황에서도 동일한 preprocess를 진행 -
preprocess.py
4. 감정 분류
- 전처리된 리뷰 문장을 4가지 감정 클래스로 라벨링 - 부정, 긍정, 개선, 일반
- 개선 : 긍정에도 부정에도 속하지 않는 개선 내용을 담는 문장에 대한 클래스
- 일반 : 개인적인 이야기, 의미없는 이야기 등 기타 문장에 대한 클래스
- 라벨링 결과 :
data/labeling_total.xlsx
- pre-trained KoBERT를 활용하여 4가지 클래스로 분류하는 classification fine-tuning 진행
- 자세한 코드는
model/kobert_finetune/Train_Test_Accuracy.ipynb
파일 확인 - inference 상황에서 학습된 모델 활용 -
kobert_classifier.py
- 모델 성능 향상 과정 (10 epoch 기준)
- 기존 : test 기준 73%
- 부정, 개선 클래스 분류 기준 모호 -> 부정, 개선 클래스 합쳐 3가지 클래스로 분류하도록 : test 기준 85%
- 외부 데이터 함께 활용 : 비슷한 특성의 데이터셋인 Naver 영화 리뷰 데이터셋 : test 기준 87%
- 일반 클래스 데이터 부족하여 데이터 증강 (5에서 이어짐)
5. 리뷰 데이터 증강
- 일반 클래스 리뷰 데이터가 부족하여 이에 대해 데이터 증강 -> 1201개의 일반 문장 확보
- Easy Data Augmentation (EDA) 방식을 활용
- SR, RI, RD, RS를 stochastic하게 적용
model/review_data_augmentation_EDA/Text_Augmentation.ipynb
파일 확인
- 모델 성능은 오히려 감소
- 증강 전 데이터 자체가 부족, 일반 문장 간의 공통점이 적기 때문인 것으로 판단
model/kobert_finetune/Augemantation_Train_Test.ipynb
파일 확인
6. 토픽 모델링
- BERTopic 활용 : 토픽 모델링 기법으로서, BERT 기반의 embedding + class-based TF-IDF 활용
- 각 감정 클래스 내에서 BERTopic 수행
- 보다 좋은 토픽 추출을 위해 각 문장에서 명사만 남기고 BERTopic 수행
7. 리뷰 요약
- pre-trained KoBART를 summarization task에 fine-tuning한 KoBART-summarization을 활용
- BART : Transformer의 Bidirectional Encoder, Auto-Regressive Decoder를 합쳐서 pre-train한 모델 (denoising autoencoder)
- 같은 토픽으로 분류된 문장끼리 모아 한 문단으로 묶은 후 KoBART-summarization 수행
- 자세한 코드는
model/topic_summary/review_topic_summarization.ipynb
파일 확인 - inference 상황에서도 동일한 topic modeling & summarization 진행 -
topic_summary.py
위 Overview에서 설명한 전체 과정을 한꺼번에 inference할 수 있는 end-to-end pipeline code를 구성
- Python 3.9
- PyTorch 1.12.1
- dependencies in requirements.txt
- Clone this repository.
git clone https://github.com/jeochris/App-Review-Sentiment-Summarization.git
cd App-Review-Sentiment-Summarization
- Install pytorch and other dependencies.
pip install -r requirements.txt
- Download our fine-tuned KoBERT model.
https://drive.google.com/file/d/10N0RprpvGZwnpguET_KL35Db11owD10O/view?usp=sharing
- Run code with your option. - For example,
python main.py --app_name=미라클나잇 --rating=5 --sentiment=negative
app_name
- App you want to find out
rating
- If you want to find out reviews only with certain rating, add this option.
- Can be omitted.
sentiment
- Sentiment you want to find out.
- Three options {negative, positive, personal}
'Sleep Cycle' 앱의 부정 리뷰 기준으로 결과 확인 - python main.py --app_name=슬립사이클 --sentiment=negative
1. Crawling, Preprocess, Sentiment Analysis
- Result : result/sentiment/predicted_reviews_슬립사이클.xlsx
2. Topic Modeling
- Result : result/topic/review_nouns_topic_슬립사이클_None_negative.xlsx
3. Summary
- Result : result/summary/topic_and_summary_슬립사이클_None_negative.xlsx
'Sleep Cycle' 앱의 1점, 5점 리뷰 내 부정 리뷰 문장 기준으로 결과 확인 및 분석 - --rating
옵션 추가
(1점 리뷰 : 이탈 예정 유저, 5점 리뷰 : 충성 유저로 간주)
main.py
: 전체 end-to-end pipeline 수행crawler.py
: 입력된 어플을 플레이스토어에 검색 후, 연속적인 스크롤을 통해 전체 리뷰를 크롤링하여 dictionary 형식으로 저장preprocess.py
: 각 리뷰에 대해 문장 단위 분할, tokenization을 통한 전처리, 일정 수준 이상 짧은 문장 제외 등의 총체적인 text preprocess 수행kobert_classifier.py
: 학습한 fine-tuned KoBERT 모델을 바탕으로 preprocess된 문장들에 대해 sentiment classification task 수행 및 결과 저장topic_summary.py
retrive_topic
: 입력된 sentiment로 분류된 리뷰 문장들에 대해 BERTopic을 바탕으로 토픽 모델링 수행summary
: 앞서 같은 토픽으로 분류된 리뷰 문장을 concat한 이후 KoBART-summarization을 바탕으로 요약 수행
- crawling
PlaystoreReviewCrawling_first.ipynb
: playstore 리뷰데이터를 크롤링하는 코드 (초안)PlaystoreReviewCrawling_final.ipynb
: 구글 플레이스토어의 리뷰 창을 열어 리뷰를 크롤링하는 코드. 너무 많은 리뷰가 있는 경우를 고려해 스크롤은 8분으로 제한. json 형태로 저장한 뒤 샘플링 진행
- preprocess
Preprocessing_with_TextRank_KoBERT_KeyBert.ipynb
: 문장 분리 / 품사 개수 기준 / 불용어 제거 등의 전처리 및 전처리 데이터셋을 기반으로 진행한 Text-Rank / KoBERT / KeyBERT
labeling_total.xlsx
: 라벨링 결과 excel sheet
- kobert_finetune
Train_Test_Accruacy.ipynb
: 라벨링 데이터로 KoBERT를 fine tuning 진행 및 train test accuracy 계산Augemantation_Train_Test.ipynb
: 일반 클래스를 증강하여 다시 fine tuning 진행 및 train test accuracy 계산sentiment_analysis_experiment.ipynb
: nlp 감성분석에 많이 사용하는 네이버 영화 리뷰 데이터를 통한 어플리케이션 리뷰 라벨링
- topic_summary
review_topic_summarization.ipynb
: 감성이 label 된 문장들을 단어 단위로 쪼갠 후, 명사들만 사용하여 토픽 모델링(BERTopic)을 수행. 나누어진 토픽들을 한 문단으로 합친 후 요약모델(KoBART-summarization)을 사용하여 한 문장으로 요약.
- review_data_augmentation_EDA
Text_Augmentation.ipynb
: KorEDA / textattack 라이브러리를 사용한 Text Data Augmentation
- review_similarity (추가 task)
review_similarity_by_app.ipynb
: 긍정 리뷰일수록 비슷한 리뷰가 많을 것이라는 가정하에 진행한 과정. 전처리 과정을 거쳐 라벨링한 어플리케이션 리뷰 데이터에 대한 감정별 유사도 측정review_similarity_by_sentiment.ipynb
: App별 유사한 리뷰가 얼마나 많은가를 확인하기 위한 과정. 전처리 하지 않은 리뷰를 전처리 후 App별 전체 리뷰 중 유사 리뷰 비율 확인
- sentiment : 텍스트 전처리 후 각 문장별 감정 분류 수행 결과
- topic : 각 문장과 그에 따른 토픽 결과
- summary : 각 토픽별 요약 문장 결과
- Crawling
- Preprocessing
- KoBERT
- https://github.com/SKTBrain/KoBERT
- https://velog.io/@seolini43/KOBERT%EB%A1%9C-%EB%8B%A4%EC%A4%91-%EB%B6%84%EB%A5%98-%EB%AA%A8%EB%8D%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%ACColab
- https://yeong-jin-data-blog.tistory.com/entry/BERT%EB%A1%9C-%ED%95%9C%EA%B8%80-%EC%98%81%ED%99%94-%EB%A6%AC%EB%B7%B0-%EA%B0%90%EC%84%B1%EB%B6%84%EC%84%9D-%ED%95%98%EA%B8%B0
- https://inistory.tistory.com/20
- BERTopic
- KoBART-summarization
- Data Augmentation