일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 품사태깅
- NLP
- Word2Vec
- naver movie review
- 대학원
- 우울증
- 수기
- 전처리
- 인공지능
- sentiment analysis
- CUDA
- Classification Task
- 석사
- word embedding
- 자연어처리
- pytorch
- Today
- Total
슬기로운 연구생활
4-1. TF-IDF + NB 본문
[0] 서론
- 이전에는 Bag of Words를 사용해서 Text를 Vector로 변환했었다.
이번에는 TF-IDF를 사용해서 Text를 Vector로 변환했다.
- TF-IDF를 사용하면 단어의 가중치를 부여해 줄 수 있다.
하지만 NB는 단어의 가중치를 사용하지 않고 단어의 빈도수를 사용하기 때문에 BoW를 사용하든 TF-IDF를 사용하든 결과는 같을 것이라 생각했다. ( 내 생각이 틀렸다. )
- 코드는 아래 github에 공개하였다.
https://github.com/vhrehfdl/Blog/blob/master/movie_review_classification/model/TF-IDF%2BNB.py
[1] 실험1
실험1은 basic한 TF-IDF를 사용했다.
[1-1] DataSet
Train Data ( train.csv )
- 긍정 리뷰 : 93,042 / 부정 리뷰 : 275,270
Test Data ( validation.csv )
- 긍정 리뷰 : 10,338 / 부정 리뷰 : 30,586
평점이 1점 ~ 3점인 영화리뷰를 부정 리뷰로 분류했고 10점인 리뷰를 긍정 리뷰로 분류했다.
[1-2] Text To Vector
텍스트 데이터를 Vector로 변환한다.
TF-IDF를 사용하였고 한 글자인 단어도 포함하여 Vector를 만들었다.
실험1 Vector 차원수 : 602,884
[1-3] Naive Bayes
NB는 단어의 확률을 이용하지 않고 단어의 빈도수를 사용하기 때문에 당연히 accuracy가 같을 것이라 생각했다.
그러나 결과는 달랐다.
BoW+NB 에서는 결과가 0.86이 나왔는데 여기서는 0.83이 나왔다.
sklearn에서 사용한 MultinomialNB 알고리즘의 계산식이 내가 알 던 것과 달라서 확률이 다르게 나온 것 같다.
[2] 실험2
실험2에서는 TF-IDF에 ngram_range=(2, 3)을 추가하여 테스트 했다.
[2-1] DataSet
실험1과 동일
[2-2] Text To Vector
ngram_range=(2, 3)을 추가했기 때문에 당연히 Vector 차원수는 증가한다.
ex) "와우 재미있는 영화다" -> "와우" / "재미있는" / "영화다"
사전에 "와우 재미있는" / "재미있는 영화다" / "와우 재미있는 영화다" 이렇게 추가되기 때문에 Vector의 차원수는 증가하게 된다.
실험1 Vector 차원수 : 602,884
실험2 Vector 차원수 : 4,190,077
[2-3] Naive Bayes
성능이 이전보다 좋아지지 않았다.
불필요하게 사전수가 증가해서 결과가 나빠지지 않았나 생각이 든다.
[3] 실험3
실험3에서는 TF-IDF에 ngram_range=(2, 3)을 추가하고 analyzer='char' 단위로 테스트 했다.
[3-1] DataSet
실험1과 동일
[3-2] Text To Vector
analyzer='char' 단위로 하였기 때문에 word로 한 것보다 Vector의 차원수가 작은 것을 알 수 있다.
실험1 Vector 차원수 : 602,884
실험2 Vector 차원수 : 4,190,077
실험3 Vector 차원수 : 1,234,434
[3-3] Naive Bayes
성능이 실험2보다 좋아졌지만 실험1은 능가하지 못했다.
이게 생각해보면 신기한게 그냥 문자단위로 잘랐는데 결과가 생각보다 좋게 나왔다.
추측하자면 한국어의 특성인 것 같기도 하다.
"재미있는 영화다" -> "재미" / "미있" / "있는" ...
이렇게 잘리면서 단어의 원형부분을 잘라서 사용했기 때문인 것 같다.
그냥 결과론적으로 보면 그렇게 나쁘지 않았다.
[4] 결론
BoW | TF-IDF ver.1 | TF-IDF ver.2 | TF-IDF ver.3 | |
NB | 0.86428 | 0.83464 | 0.76759 | 0.82746 |
SVM ver.1 | 0.57819 | |||
SVM ver.2 | 0.76549 | |||
Random Forest | 0.79105 | |||
XGBoosting | 0.77338 |
SVM ver.1 : 기본 SVM
SVM ver.2 : version1에 rbf 커널 추가 ( C=10, gamma = 0.1 )
TF-IDF ver.1 : word 단위의 단어별 가중치
TF-IDF ver.2 : ver.1에서 ngram = (2,3) 추가
TF-IDF ver.3 : char 단위의 단어별 가중치 + ngram=(2,3) 추가
- TF-IDF가 잘 먹히는 경우가 있다.
과거 경험을 생각해보면 사용 텍스트가 영어일 경우 TF-IDF ver.3가 잘 먹혔던 것 같다.
char 단위로 2,3글자를 사용했을 때 BoW보다 결과가 더 좋았다.
'프로젝트 : 영화리뷰 분류' 카테고리의 다른 글
3-5. BoW + XGBoosting (0) | 2019.07.25 |
---|---|
3-4. BoW + Random Forest Classifier (0) | 2019.07.25 |
3-3. BoW + SVM (0) | 2019.07.25 |
3-2. BoW + NB + Komoran (0) | 2019.07.25 |
3-1. BoW + NB (0) | 2019.07.24 |