나이브 베이즈(Naive Bayes) 실습(3) - EDA, 영화 리뷰 긍정/부정 분류

2022. 2. 1. 00:00AI/ML

이 포스트는 허민석님의 유튜브 머신러닝 내용을 정리한 글입니다. 실습 코드는 도서 나의 첫 머신러닝/딥러닝에서 발췌해왔습니다. 실습 코드와 자료는 링크의 Github에서 볼 수 있습니다

나이브 베이즈 마지막 실습 포스트입니다. 이번에는 영화 리뷰의 긍정과 부정을 분류해볼 것이며, 분류기로는 나이브 베이즈의 다항분포 나이브 베이즈 모델(Multinomial Naive Bayes)을 사용하겠습니다. 영화 리뷰 긍정/부정 분석 실습은 실제 네이버 영화, 카카오맵 리뷰와 관련된 것으로, 데이터 시각화 과정 및 데이터 전처리 과정에 중점을 두고 보는 것이 좋습니다. 이번 실습에서도 10개의 리뷰에 대해서만 학습할 것이므로 실제 네이버 영화 리뷰 데이터 EDAkaggle, bag of words meets bags of popcorn EDA을 보겠습니다. 먼저 네이버 영화 리뷰 EDA입니다. 데이터는 링크의 Naver sentiment movie corpus v1.0에 있습니다. 데이터 분석 과정입니다. 리뷰는 .txt 파일에 저장되어 있으며, 전체 데이터(ratings)를 학습 데이터(ratings_train)과 테스트 데이터(ratings_test)로 분리되어 있습니다. 파일 크기를 확인해보니, 학습 데이터만 해도 14.63MB로 굉장히 큰 사이즈입니다. 다음으로 학습 데이터의 개수를 보니 15만개로, 실제 모델 학습 시에는 이와 비슷한 혹은 이보다도 많은 데이터들이 필요합니다.  

학습 데이터의 리뷰 길이를 토대로 히스토 그램을 그려 확인해보겠습니다. 히스토그램 그래프를 봤을 때 리뷰 길이는 최대 160 미만으로, 20글자 근처에 많이 분포되어 있습니다. 실제 최대, 최소, 평균, 표준편차 등을 구하여 박스플롯을 그려보면 조금 더 자세히 알 수 있습니다.

WordCloud를 적용해 그래프를 그려보면 빈도가 높은 단어가 큰 글자로 보입니다. 영화, 정말, 너무, 진짜, 그냥 등의 단어가 리뷰에 자주 사용되었음을 알 수 있습니다. 한 가지 주의할 점으로 한글 텍스트에 대해서는 기본적으로 지원하지 않기 때문에, 폰트를 다운받아 폰트 설정을 따로 해줘야합니다. 이후 학습 데이터에서 긍정과 부정의 리뷰 개수와 비율을 확인해보면, 74827개와 75173개로 반반씩 분포되어 있음을 알 수 있습니다.

 

이제 각 리뷰의 단어 개수로 히스토그램을 그린 다음, 마지막으로 리뷰에서 특수문자의 비율을 확인해보겠습니다. 이번 EDA 과정으로 우리는 리뷰의 긍정 부정 분포 비율, 리뷰 길이에 대한 평균, 표준편차 값, 리뷰 당 단어 개수 분포 및 특수 문자의 비율 등 다양한 정보를 얻을 수 있었습니다.

그렇다면 데이터 전처리 과정을 간단히 살펴보고, 오늘의 실습을 진행하겠습니다. 우리는 리뷰 텍스트에 대해 한글이 아닌 특수문자, 숫자 등을 제거한 다음 리뷰를 형태소 단위로 나누어(Okt) 불용어를 제거하는 작업을 진행하겠습니다. 불용어는 갖고 있는 데이터에서 유의미한 단어 토큰만을 선별하기 위해 큰 의미가 없는 단어로, 학습에 방해가 될 수 있는 단어를 일컫습니다. 불용어는 불용어를 담은 리스트를 정의해 사용할 수 있습니다.

이제 keras의 Tokenizer()를 사용해 데이터를 인덱스 벡터로 학습 데이터와 평가 데이터를 변환합니다. 이전 포스트의 스팸 메일 구분에서 CounterVectorizer()를 사용한 것과 동일한 맥락입니다. 이때까지 실제 네이버 영화 리뷰 데이터를 분석하고 전처리하는 과정을 함께 진행해봤습니다. 이제는 다항분포 나이브 베이즈를 활용해 영화 리뷰를 분류하는 작업을 진행해보겠습니다.

다항분포 나이브 베이즈 모델을 활용한 영화 리뷰 분석 과정은 이전 포스트에서 다뤘던 베르누이 나이브 베이즈 모델과 동일합니다. 실습에 사용하는 데이터는 그 수도 적을 뿐더러 위의 경우에서처럼 특수문자를 제거하는 등의 전처리 과정을 모두 거친 데이터로, 별도의 데이터 전처리 과정을 필요로 하지 않습니다. 다만 베르누이 나이브 베이즈 모델이 등장 여부에 초점을 맞춰 중복된 단어에도 1으로 표시했다면, 다항분포 나이브 베이즈 모델에서는 중복된 단어는 그 빈도 수만큼 표시합니다. 예를 들어 한 리뷰가 "이런 점은 싫지만 전체적으로 좋다. 그리고 이번 영화는 차기작이 기대된다는 점에서 좋다"라고 했다면, 긍정적인 리뷰로 봐야합니다. 이를 위해 싫다, 좋다의 실제 빈도 수가 중요한데, 베르누이 모델을 사용한다면 좋다와 싫다 모두에 1로만 치환되어 있어 분류에 힘이 듭니다. 따라서 이때는 싫다 1번, 좋다 2번으로 좋다의 비율의 더 높은 것을 토대로 긍정적인 리뷰로 분류할 수 있는 다항분포 나이브 베이즈 모델이 더 적절하다고 볼 수 있습니다. 코드에 대한 설명은 이전 포스트와 동일하므로, 한번 쭉 훑어보면 되겠습니다.