슬기로운 연구생활

4-1. TF-IDF + NB 본문

프로젝트 : 영화리뷰 분류

4-1. TF-IDF + NB

vhrehfdl 2019. 9. 10. 14:41

[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 

 

vhrehfdl/Blog_code

Contribute to vhrehfdl/Blog_code development by creating an account on GitHub.

github.com

 

[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
Comments