Warning) 아래 코드들은 Google Colab 환경에서 작성된 것이기에 거의 그럴 일은 없지만 다른 환경에서는 정상적으로 작동되지 않을 수도 있음을 알려드립니다. 또한, 형편없는 저의 실력으로 코드들이 다소 비효율적일 수 있음을 미리 말씀드립니다. 우연히 이 글을 보게 되신 분들은 참고해주시기 바랍니다. 


STEP 4. Lexicon 사전을 통해 Critic리뷰 감성 분석

STEP 4에서는 STEP 3에서 만든 2가지 함수를 통해 본격적으로 영화 '탑건'의 Critic 리뷰를 분석해보도록 하겠습니다. STEP 2에서 웹스크래핑한 결과인 movie_review_df에 각각 함수를 적용한 결과를 새로운 열로 추가하도록 하겠습니다. SentiWordNet 분석 결과는 ['Senti_swn']이라는 컬럼 이름으로 VADER 분석 결과는 ['Senti_vader']이라는 컬럼으로 생성하였습니다. 그리고 상위 10개만 출력해보도록 하겠습니다. (출력은 10개로 했지만 캡쳐가 잘려서 8개 결과 밖에 보이지 않습니다.)

# swn_polarity()를 이용하여 리뷰에 대한 감정분석 결과를 새로운 열로 추가
movie_review_df['Senti_swn'] = movie_review_df['Review'].apply(lambda x : swn_polarity(x))
# vader_polarity()를 이용하여 리뷰에 대한 감정분석 결과를 새로운 열로 추가
movie_review_df['Senti_vader'] = movie_review_df['Review'].apply(lambda x : vader_polarity(x))
movie_review_df[:10]

분석 결과를 새로운 열로 추가한 movie_review_df

분석 결과를 보면 swn기반과 vader 기반의 결과가 서로 다른 경우도 적지 않아 보입니다. 두 분석의 결과가 다른 것이 총 몇 개 정도 되는지 한번 알아보도록 하겠습니다. True는 두 분석 결과가 같은 경우이고 False는 분석 결과가 서로 다른 것을 나타냅니다. 총 409개의 리뷰 중 118개의 리뷰는 서로 다른 분석 결과를 보이고 있습니다. 

(movie_review_df['Senti_swn'] == movie_review_df['Senti_vader']).value_counts()

두 분석 결과가 다른 경우 확인

통상적으로 VADER 분석이 SentiWordNet 분석에 비해 정확도가 더 높은 것으로 알려져 있습니다. 실제로 몇몇 리뷰를 직접 확인해본 결과 VADER 분석이 더 우수한 분석 결과를 보인 것으로 확인 되었습니다. 따라서 VADER 분석 결과를 기준으로 하여 Good/Bad를 나누도록 하겠습니다. 분석 결과가 1이면 Good 출력, 0이면 Bad를 출력하는 good_bad_dc() 함수를 만들어서 활용하겠습니다. 

# 각 감정 분석 함수를 통해 구한 값을 비교하여 최종 Good/Bad 출력하는 함수
def good_bad_dc(review):
  if review['Senti_vader'] == 1:
    return 'Good'
  else:
    return 'Bad'

good_bad_dc()을 적용한 결과를 새로운 컬럼 ['Good/Bad']으로 하여 추가하도록 하겠습니다. 그리고 movie_review_df를 새로 출력해보겠습니다. 

good_bad_list = []
for i in range(movie_review_df.shape[0]):
  good_bad_list.append(good_bad_dc(movie_review_df.loc[i,:]))
movie_review_df['Good/Bad'] = good_bad_list
movie_review_df

Good/Bad 컬럼을 추가한 movie_review_df

여기서 잠깐 캡쳐한 사진 마지막 8번 리뷰를 한 번 살펴보겠습니다. 'The Jacobin'의 Eileen Jones씨가 남긴 리뷰인데 swn, vader 둘 다 해당 리뷰에 대해 Positive 평가를 내렸습니다. 그러나 실제로 리뷰 내용을 살펴보면 매우 부정적인 리뷰임을 알 수 있습니다. 로튼 토마토 사이트에서 직접 확인해본 결과 아래와 같이 'rotten(섞은)'이라는 마크를 남기며 혹평을 한 것으로 확인되었습니다. 아마도 맥락을 확인하지 않고 단어의 긍부정 여부만 가지고 판단하다보니 생긴 문제인 것 같습니다. 

총 409개의 리뷰 중 몇 개가 Good으로 분류되고 Bad로 분류되는지 확인해보도록 하겠습니다. 우선 개수를 파악해보고 비율로서의 결과도 출력해보겠습니다. 

movie_review_df['Good/Bad'].value_counts()

# 영화에 대한 Good/Bad 비율
movie_review_df['Good/Bad'].value_counts(normalize=True)*100

총 409개의 리뷰 중 74%인 305개가 긍정 리뷰로 평가되었고 25%인 104개의 리뷰가 부정 리뷰로 평가되었습니다. 로튼 토마토 사이트는 영화에 대한 평점을 전문가와 대중 평점으로 나누어 점수를 토마토의 신선도에 비유해 표현합니다. 신선도가 높을수록 좋은 평가를 받은 것이며 전문가와 대중은 각각 어떤 평가를 내렸는지 서로 비교해볼 수 있는 장점이 있습니다. 이번 프로젝트에서는 아쉽게도 대중평가는 살펴보지 못하고 전문가 리뷰만 살펴보았습니다. 그럼에도 감성 분석 알고리즘이 정확히 분석을 했는지 알아보기 위해 로튼 토마토 평점 지수를 가져와 비교해보도록 하겠습니다. 

영화 '탑건-메버릭'의 전문가 평점 지수는 무려 97%(프로젝트를 수행했던 당시)입니다. 정확히 어떤 방식으로 점수를 산정하는지는 모르겠지만 대략 97%의 전문가가 좋은 평가를 한 것이라고 유추해볼 수는 있습니다. 하지만 앞서의 분석 결과를 살펴보면 긍정 리뷰는 74%로 실제 평점 지수와 상당한 차이가 나타납니다. 차이가 발생한 이유에는 여러가지가 있겠지만 context를 고려한 분석이 된다면 더 좋은 결과를 산출할 수 있을 것으로 예상됩니다. 재미로 시작한 프로젝트이지만 정확도가 낮고 날카로운 분석이 되지 못한 점이 조금은 아쉬움이 남습니다. 다음에는 더 향상된 성능을 가진 분석 모델을 가져와 실험해보도록 하겠습니다. 이상으로 [로튼 토마토 리뷰 감성 분석] 미니 프로젝트를 마치도록 하겠습니다. 

+ Recent posts