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


얼마전 미국에서 30년 만에 영화 탑건의 속편이 개봉되어 화제가 되었습니다. 미국에서는 5월 27일에 개봉하여 이미 1달이 지났지만 우리나라에서는 한참 뒤인 6월 22일 개봉 예정되어 있어 아직 대중들에게 크게 주목 받고 있지는 못한듯 싶습니다. 하지만 많은 사람들에게 80년대 개봉되었던 '탑건'의 1편은 많은 추억으로 자리잡고 있을 것입니다. 물론 저는 90년대생이기 때문에 한참이 지나서야 OTT를 통해 영화를 접하게 되었는데 아직도 정말 매력적인 영화로 기억되고 있습니다. 특히 주연배우인 톰크루즈의 전성기 시절 모습과 영화의 OST로 사용된  Berlin의 'Take my breath away'는 이 영화의 아이코닉한 장면이라 해도 과언이 아닌 듯 합니다.

어쩌다 보니 영화에 대한 수다로 빠질 뻔했는데 잠시 영화에 대한 이야기는 여기서 접어두고 본론으로 들어가 보겠습니다. 최근 텍스트 분석을 공부하면서 감성분석(Sentimental Analysis)에 대해 살펴본 적이 있습니다. 감성분석은 텍스트에 담겨 있는 의견이나 감성, 평가, 태도 등을 머신러닝, 딥러닝을 통해 분석하는 방법인데. 자연어 처리 분야에서 꽤 오랜 기간 연구된 분야라고 합니다. 저는 항상 새로운 모델이나 알고리즘을 공부하게 되면 실무에 적용해볼 수 있는 방안들을 고민해보는 편입니다. 그래서 감성 분석을 공부하면서 어디서 감성분석을 활용해볼 수 있을지 생각을 해보았고 앞서 말씀 드렸던 영화 '탑건'이 떠오르게 되었습니다. 아마 이미 많은 현장에서 감성 분석을 이용해 리뷰를 분석하는 모델들이 많이 상용화되고 있을 것입니다. 그래도 이를 한번 직접 제 스스로 구현해보고 두 눈으로 확인해보면 좋지 않을까 해서 영화 리뷰를 분석하는 토이 프로젝트를 진행해보았습니다. 아직 머신러닝, 텍스트 분석 분야에 이제 막 걸음마를 떼고 있는 수준이라 프로젝트의 퀄리티는 다소 미흡한 부분이 많습니다. 하지만 누군가에게는 또 다른 영감이 될 수 있다는 생각을 가지고 프로젝트를 소개하고자 합니다. 이 프로젝트에서 뭔가 심오한 내용을 얻어가시기 힘들 것 같고 그냥 귀엽게 봐주셨으면 좋겠습니다.


STEP 1. 로튼 토마토 사이트 감성 분석

(1) 아이디어 구상

우선, 어떤 식으로 프로젝트를 진행할지 정리해보겠습니다. brief하게 말씀드리면 영화 사이트에서 해당 영화에 대한 리뷰를 가져와 감성분석을 진행하고 이를 Good/Bad 두가지로 출력합니다. 그리고 영화의 전반적인 평가와 선호도를 Good/Bad의 상대적 비율로서 계산하여 산출하는 것입니다. 리뷰를 가져올 영화 사이트는 로튼 토마토입니다. 로튼 토마토는 제가 영화를 검색할 때 많이 이용하는 사이트이기도 하고 영화의 평점을 토마토의 신선도에 비유해 표현하는 매우 재미있는 사이트입니다. reviewer는 서술식으로 리뷰를 남기고 'Fresh', 'Rotten' 이 두가지로 영화를 평가하게 됩니다. 그러면 전체적인 평가를 통계 내어 아래와 같은 표식(mark)가 만들어집니다. 여하튼, 로튼 토마토 사이트의 리뷰를 토대로 프로젝트를 진행하도록 하겠습니다. 다만, 아래 보시는 바와 같이 리뷰는 크게 전문가 리뷰(Tomatometer)와 관객 리뷰(Audience Score)로 구분되는데 저는 전문가 리뷰만 이용하겠습니다. 관객 리뷰는 분석하기에 데이터양이 너무 많기 때문입니다.

'신선한(Fresh)'과 '썩은(Rotten)'의 차이


(2) 적용할 기법 선택

사실 프로젝트를 진행할 때 사용할 모델, 기법 등은 저의 능력과 한계에 의해 정해지는 편입니다. 더 정확하고 최신의 기법들을 사용하고 싶지만 잘 알지 못하기 때문에 그냥 제가 할 수 있는 범위 내에서 프로젝트를 진행하는 편이긴 합니다. 이번 프로젝트도 어쩔 수 없는 제 능력의 한계로 제한적인 상황 속에서 진행하였습니다. 

우선 리뷰를 가져오는 것은 웹스크래핑을 통해 진행하겠습니다. 웹스크래핑은 Selenium을 적용할 텐데 Selenium은 웹브라우저를 조작해가며 스크래핑할 수 있는 장점을 가지고 있습니다. 아래 사진과 같이 400여 개의 리뷰 모두를 가져오기 위해서 계속 next 버튼을 누르며 다음 리뷰들을 가져와야 합니다. 따라서, BeautifulSoup을 사용하기에는 제한이 되며 Selenium의 webdriver 객체를 생성해 url을 불러와 웹사이트의 next 버튼을 누를 수 있도록 하겠습니다.

감성분석에 사용될 방법은 Lexicon 기반의 접근법(Lexicon-based)입니다. 그 중에서도 감성사전(Dictionary-based)을 이용해서 분석을 진행하겠습니다. 특별한 이유 때문에 해당 방법론을 적용하는 것은 아닙니다. 단지 제가 최근에 공부한 방법이기도 하고 아직 머신러닝 기반이나 Transformer, BERT와 같은 인공신경망 기법들을 적용하기에는 아직 실력이 부족하기 때문입니다. 아래 사진과 같이 감성분석(Sentiment Analysis)에는 정말 많은 방법론들이 있습니다. 상황에 따라 다른 방식들을 적용해볼 수 있기에 제 프로젝트는 수많은 방법 중 하나로만 참고 해주시면 감사하겠습니다.

출처:yngie-c.github.io


(3) 프로젝트 플로우 차트(Flow Chart)

대략적인 그림은 그려 보았으니 한번 큰 흐름을 정리해보도록 하겠습니다. 플로우 차트라고 하기 거창하지만 간단한 다이어그램으로 한눈에 살펴보겠습니다. 

+ Recent posts