Spam filtering의 경우 spam 인지 또는 ham인지 예측 결과 자체가 중요합니다.
하지만 배달의 민족에서의 리뷰, 카카오T에서 택시 기사님에 대한 리뷰, Yelp 리뷰 등등은 사실 예측값이 필요하지 않습니다.
오히려 어떤 요소로 인해서 긍적정인 피드백이 나왔는지,
또는 반대로 어떤 요소로 인해서 부정적인 반응이 나왔는지 분석하는 것이 더 중요합니다.
yelp-dataset/yelp_academic_dataset_review.json : 리뷰글, rating, cool, funny, useful 등등의 점수 데이터
yelp_academic_dataset_user.json : 유저정보 (관계망 분석시 사용가능 - 본문에서는 사용 안함)
yelp-dataset/yelp_academic_dataset_checkin.json : checkin 에 대한 시계열 데이터 존재
yelp-dataset/yelp_academic_dataset_tip.json : Tip 코멘트 글, like갯수 데이터
Sentiment analysis model을 만들기 위해서 사용하는 데이터는 yelp_academic_dataset_business.json 파일
그리고 yelp_academic_dataset_review.json 데이터 입니다.
Embulk to transfer data to MariaDB
Business Data (JSON -> Pandas -> CSV -> MariaDB)
preprocessing이 필요해서 business.json 파일은 pandas로 먼저 불러낸후 -> csv로 변환했습니다.
CSV -> MariaDB 로 옮기기 위해서 seed_business.yml 파일을 다음과 같이 설정합니다.
Embulk 실행.
Review Data (JSON -> MariaDB)
Review 데이터의 경우 전처리에 많은 시간이 들어갑니다.
MariaDB에서 필요한 내용만 뽑을수 있도록 그냥 JSON파일을 통채로 MariaDB로 올려줍니다.
Preprocessing Data for Text Classification
Stop Words
먼저 the, a, at, of 같이 중요하지 않은 단어들을 삭제시키기 위해서 NLTK의 stopwords를 다운로드 받습니다.
Target Business (벨라지오)
예제로, 라스베가스에 있는 벨라지오 호텔을 사용해서 sentiment analysis model을 만듭니다.
벨라지오의 business_id=’na4Th5DrNauOv-c43QQFvA’ 이며 SQL Query를 통해서 가져옵니다.
Binary classification으로 만들어주기 위해서 1점 그리고 2점은 0으로 만들고,
3점은 제외시키고, 4, 5점은 1로 만듭니다.
class imbalance 문제가 있기 때문에 추후 데이터 전처리시 resampling이 필요합니다.
영어 이외의 review 제외
리뷰중에 간혹, 프랑스어, 태국어처럼 영어권이 아닌 리뷰가 혼합이 되어 있습니다.
필터링을 위해서 langdetect를 사용해서 영어로 쓰여진 데이터만 남도록 필터링 합니다.
Text Preprocessing
Special characters 모두 삭제 시키고, 스페이스도 한개로 줄임.
Stopwords 도 제거시킴
Cross Validation Dataset and Random Sampling
data_x: 전처리된 리뷰 문장들의 리스트
data_y: 0->Negative Rating, 1->Positive Rating
SMOTE를 적용시키려면, 텍스트 상태에서는 안되고, count vectorized 상태에서는 할 수 있음.
결국 KNN와 같은 feature space가 필요한데.. 여기서는 빠르게 적용하기 위해서 random sampling 적용함
Model
Bernoulli Naive Bayes Model
Extracting Important Words
model.feature_log_prob_을 사용해서 특정 단어에 대한 log probability를 계산할 수 있습니다.
log를 없애기 위해서 exponent를 한번 해주고, 서로의 차이를 구한뒤에 sort를 해주면
어떤 주요 단어에 의해서 negative feedback이 나왔는지 또는 positive feedback나왔는지 확인 할 수 있습니다.
여기서 더 나아가서, 다른 업체들에서 나오는 단어들의 비중을 따져서 unique한 단어만 뽑아볼수도 있습니다.
뭐 그런건 좀 짜치는 내용이고, 핵심은 Naive Bayes의 log probability를 사용해서 핵심 단어를 뽑아 내는 것입니다.