* 노란 글씨 : 이해 못 함
읽은 논문
성민·김동성·김종우(2021, 6월). <온라인 리뷰에 대한 특성 기반 감성 분석을 활용한 영화 흥행 조기 예측>. 대한산업공학회 춘계공동학술대회 논문집. 제주: 국제컨벤션센터.
* 일반적으로 보던 논문이 아니라 ppt로 되어 있던데, 아무리 찾아도 같은 제목으로 글로 쓰인 논문은 찾을 수가 없어서 ppt로 봤다. 읽어야 할 논문이 미리 정해져 있었기 때문에 새 논문을 찾을 수는 없음. 아니 근데 진짜 발표용으로 이미 정리된 내용이라 자세히 설명된 게 별로 없고 내가 해야 할 도식화와 요약이 다 되어 있어서 원저작자의 설명을 안 듣고 이걸 어떻게 공부해야 할지 모르겠다.
22.06.14 화 - 정독하고 단어 찾아보기
* 기관명, 고유명사 등은 필요하다고 판단되지 않을 경우 따로 찾아보지 않음
BeautifulSoup : HTML 및 XML 파일에서 데이터를 가져오기 위한 Python 라이브러리. 즐겨 찾는 파서(your favorite parser)와 함께 작동하여 구문 분석 트리를 탐색, 검색 및 수정하는 관용적 방법을 제공합니다. a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree.(출처 Beautiful Soup Documentation)
Selenium : 셀레늄(Selenium)은 웹 애플리케이션 테스트를 위한 포터블 프레임워크이다. 셀레늄은 테스트 스크립트 언어를 학습할 필요 없이 기능 테스트를 만들기 위한 플레이백 도구를 제공한다.(출처 위키백과)
- 플레이백 : 영상 편집에서 사용하는 용어로, 영상 소스 또는 편집이 완료된 영상을 재생하는 것을 말한다고 한다. 이때 재생하는 영상의 화질을 낮춰도 최종 결과물에는 영향이 없다고 한다. 위의 셀레늄 정의에서는, 맥락을 고려하건대 셀레늄으로 만든 기능을 재현성 있게 테스트할 수 있도록 한다는 뜻으로 쓰인 것 같다.
웹크롤링 : 웹 크롤러(web crawler)는 조직적, 자동화된 방법으로 월드 와이드 웹을 탐색하는 컴퓨터 프로그램이고, 웹 크롤러가 하는 작업을 ‘웹 크롤링’(web crawling) 혹은 ‘스파이더링’(spidering)이라 부른다. 웹 크롤러는 대체로 방문한 사이트의 모든 페이지의 복사본을 생성하는 데 사용되며, 검색 엔진은 이렇게 생성된 페이지를 보다 빠른 검색을 위해 인덱싱한다. 또한 크롤러는 링크 체크나 HTML 코드 검증과 같은 웹 사이트의 자동 유지 관리 작업을 위해 사용되기도 하며, 자동 이메일 수집과 같은 웹 페이지의 특정 형태의 정보를 수집하는 데도 사용된다. 웹 크롤러는 봇이나 소프트웨어 에이전트의 한 형태이다. 웹 크롤러는 대개 시드(seeds)라고 불리는 URL 리스트에서부터 시작하는데, 페이지의 모든 하이퍼링크를 인식하여 URL 리스트를 갱신한다. 갱신된 URL 리스트는 재귀적으로 다시 방문한다.(출처 위키백과)
한 블로그에 따르면 웹 크롤링은 인터넷에 검색하면 수두룩하게 나오는 것처럼 간단히 웹페이지 CSS의 특정 태그만을 긁어다 내놓는 게 아니라 www라는 월드 와이드 웹을 DFS나 BFS 방식으로 하나하나 방문하며 탐색하는 것이라고 한다.
- robots.txt : 웹 페이지를 아무 데나 다 긁으면 안 된다고 한다. 웹 페이지의 루트 도메인마다 이 페이지에서 뭘 해도 되고 뭘 하면 안 되는지 알려주는 robots.txt라는 페이지가 있다고 한다. 웹 크롤러를 만들 때는 적어도 robots.txt에 적힌 내용을 따르는 것이 윤리적이며, 크롤링하여 얻은 데이터를 이익을 위해 사용하면 문제가 될 수 있다. 이 내용 이외에도 어떤 회사의 크롤러가 robots.txt를 잘 지키는지, 어디서는 어떻게 이 규칙을 지키는지 등을 원본 블로그에서 소개하고 있다.
Big 6 Distributor : 논문의 맥락상 영화계의 특정 거대 배급사 여부를 데이터로 사용했다는 것 같은데, 인터넷 검색을 해봤더니 전혀 상관없는 내용만 잔뜩 나와서 정확히 무슨 의미로 사용된 말인지는 못찾았다.
Random Forest : [기계학습] 랜덤 포레스트는 분류, 회귀 분석 등에 사용되는 앙상블 학습 방법의 일종으로, 훈련 과정에서 구성한 다수의 결정 트리로부터 부류(분류) 또는 평균 예측치(회귀 분석)를 출력함으로써 동작한다.(출처 위키백과)
- 앙상블 학습 방법 : [통계학, 기계학습] 앙상블 학습법(ensemble learning method)은 학습 알고리즘(learning algorithm)들을 따로 쓰는 경우에 비해 더 좋은 예측 성능을 얻기위해 다수의 학습 알고리즘을 사용하는 방법이다.(출처 위키백과)
XG-Boost : XGBoost(eXtreme Gradient Boosting)는 C++, Java, Python, R, Julia, Perl 및 Scala 용 정규화 그래디언트 부스팅 프레임워크를 제공하는 오픈 소스 소프트웨어 라이브러리 입니다. Linux, Windows 및 macOS에서 작동합니다.(출처 위키피디아 - 번역됨)
22.06.17 금 - 논문 요약, 도식화, 재서술
요약
- 서론 : 한 자료에 따르면 2019년 전세계 박스오피스 매출액이 420억에 달한다. 이만한 규모의 산업에서 영화의 흥행을 조기 예측하는 것은 여러 모로 도움이 된다.
- 관련 연구 : 생략
- 연구 설계 : 이 연구의 목표는 개봉 n주 후 티켓 판매량을 예측하는 것이다. 영화의 내재적 정보와 외재적 정보를 함께 고려하여 머신러닝 모델에 학습시킨다. 데이터는 전세계 영화 리뷰를 모아 놓은 사이트 IMDb에서 영화의 기본 정보를, 웹크롤링을 이용하여 기타 영화 정보를 수집했다. 수집한 테이터는 각각의 특성에 맞게 원 핫 인코딩, 최대-최소 정규화, boolean 타입, 비율 환산 등의 전처리를 했다. 리뷰 데이터는 개봉 후 몇 주 후에 몇 개나 나왔는지, 그리고 해당 기간의 평점 평균을 산출해 이용했다. 이 리뷰 데이터는 이후 주차별 모델 성능을 평가하는 데 사용한다. 데이터셋 구성은 학습셋이 전체의 80%, 6317개의 영화로 이루어지고, 테스트셋이 전체의 20%, 1580개의 영화로 이루어졌다. 활용한 모델은 선형 회귀, 랜덤 포레스트, XGBoost, DNN이다.
- 연구결과 : 총 티켓 판매 수를 예측하는 모델 중 MAE 기준으로 랜덤 포레스트가 가장 성능이 좋았고, RMSE 기준으로는 XGBoost가 가장 성능이 좋았다. 랜덤 포레스트 모델을 학습시킬 때 리뷰 수와 평균 평점을 데이터에 추가하거나, 리뷰 수만 데이터에 추가하거나, 평균 평점만 데이터에 추가하는 방법 중 리뷰 수만 데이터에 추가했을 때 가장 높은 성능을 냈다. RMSE 기준으로 가장 좋은 성능을 냈던 XGBoost 모델 또한 랜덤포레스트와 마찬가지로 리뷰 수를 추가했을 때 가장 좋은 성능을 냈다.
- 결론 및 향후 연구 방향 : 이 연구에서는 여러 가지 머신 러닝 모델을 통해 영화의 흥행을 예측할 수 있었다. 특히 랜덤 포레스트와 XGBoost가 가장 좋은 성능을 보였다. 그리고 온라인 리뷰어들의 리뷰 수를 데이터에 추가했을 때 총 티켓 판매 수를 예측하는 데 도움이 된다는 것을 확인했다. 그러니 이 연구는 정량적 정보만을 활용했을 뿐 리뷰의 정성적 요소는 활용하지 못했다. 향후 영화 리뷰의 aspect(양상, 측면)를 기반으로 감성 분석을 진행하여 리뷰어들의 영화의 aspect에 대한 평가를 정량적으로 산출하는 연구가 필요하다.
- 참고 문헌 : 내가 참고한 게 아니니까 생략.
도식화, 재서술
- 목표 : 영화의 흥행을 예측하자.
- 사용할(수집할) 데이터 : 영화 등급, 장르, 제작사 등의 내재적 정보와 온라인 리뷰 수, 티켓 판매량, 리뷰 평점 등의 외재적 정보.
- 전처리 : 원 핫 인코딩, 최대-최소 정규화, boolean 타입으로만 사용하기, 비율 환산 등
- 데이터셋 분할 : 학습셋과 테스트셋 8:2 비율, 분할 기준에 대한 언급 없으므로 랜덤 샘플링으로 분할한 것으로 예상됨.
- 모델 구분 : 개봉 후 1주차 예측, 2주차 예측 등 개봉 이후 주차별로 예측
- 사용한 모델 : 선형 회귀, 랜덤 포레스트, XGBoost, DNN
- 결과 : MAE 기준 랜덤 포레스트, RMSE 기준 XGBoost가 성능이 가장 좋았다. 또한 리뷰 수를 데이터에 추가했을 때 성능이 향상됨을 확인했다.
- 결론 : 여러 가지 머신 러닝 모델을 통해 영화의 흥행을 예측할 수 있었으며 랜덤 포레스트와 XGBoost가 가장 성능이 좋았다. 또한 리뷰 수를 데이터에 추가하면 도움이 되었다. 이 연구는 정성적 요소를 평가에 포함하지 않았으므로 추후 이 요소를 이용하는 연구가 필요하다.
평가 의견(내 의견) : 이 연구에서는 2000년부터 2019년까지 상영된 영화의 정보를 수집하여 사용했다고 한다. 그러면 이 데이터는 개봉 일자 기준으로 시계열 데이터로 사용할 수도 있지 않았을까? 학습셋과 테스트셋을 분할할 때에도 비교적 과거의 영화를 학습셋으로 사용하고 최근의 영화를 테스트셋으로 사용했다면 시간의 흐름을 모델의 학습에 반영할 수 있을 테고, 이런 방식으로 시대의 변화에 따른 유행의 흐름도 학습 요소로 포함할 수 있을지도 모른다. 그러니까 이 연구에는 정말 정량적 요소만이 포함되었을 뿐 시대의 변화, 유행의 흐름 등은 고려되지 못했다는 말이다.
논문에 첨부된 이미지를 보면 mae가 80만이 넘게 나오던데, 최댓값이 정해진 r2 score(최대 1.0)를 평가 지표로 사용하지 않아서 확신할 수는 없지만 이 연구에서 완성한 모델은 실제로 사용하기엔 성능이 별로 좋지 못할 것 같다는 생각이 든다. 내가 지금까지 만들어본 선형 회귀 모델은 데이터에 따라 r2 score가 0.8~0.9 정도 나올 때 mae는 크게는 만 단위에서 작게는 10 미만까지 나왔다. RMSE도 r2 score가 0.8~0.9 정도 나올 때 만 단위에서 그쳤다. 데이터셋이 어떤 것이냐에 따라 큰 영향을 받긴 하지만 mae, RMSE, r2 score 모두 선형 회귀 모델의 평가 지표라는 공통점을 감안하면 mae가 80만이 넘는 건 꽤 큰 수치라고 본다. 왠지 이 논문이 연구의 부실한 점을 감추고 잘 된 부분만 보여주고 있다는 느낌이 든다. 내가 아직 논문을 써본 적이 없어서 그렇게 생각하는 것일 수도 있지.
배운 점, 계획 : 나는 게임의 흥행을 예측하는 연구를 해야 한다. 어떤 데이터를 수집하고, 어떻게 가공하는지 좋은 참고가 되었으며 시계열 데이터로 활용한다는 아이디어도 얻었다. 리뷰 텍스트를 감성분석하여 사용하는 것은 나도 고민해봐야겠다. 내가 항상 기억하고 의식해야 할 점은 난 학부생이지 석박사가 아니라는 점이다.. 감당할 수 있는 일을 하자.
텍스트 감성 분석은 아무래도 하나의 모델이 감성도 분석하고, 그 데이터를 또 스스로 예측 모델에까지 이용하게 만들기는 힘들 것 같으니 감성 분석 모델 따로, 예측 모델 따로 만들어야 할 것 같다. 감성 분석 데이터와 수치/범주형 데이터를 별도의 데이터프레임으로 사용하게 될테니 기준이 될 인덱스도 필요한데, 그건 게임 이름으로 하면 될까? 그렇게 되면 문제가 생기는데, 게임의 내재적/외재적 정보는 한 게임 당 한세트씩만 나온다. 그러나 리뷰는 한 게임 당 수백 수천개가 나올 수 있다. 이걸 게임 이름을 기준으로 매치시킨다? 과연 가능할까? 역시 추가 연구가 필요하다고 한 이유가 있는 거였다. 그러면 리뷰 전체의 감성을 평균내는 건 어떨까? 마침 스팀은 사용자도 볼 수 있게 리뷰의 추천과 비추천 비율을 계산해 ‘압도적으로 긍정적’, ‘긍정적’, ‘복합적’, ‘부정적’, ‘압도적으로 부정적(아직까지 한번도 못봤음)’ 등으로 나누어 표시해준다. 이게 각 리뷰의 감성을 온전히 반영하기는 어렵지만 대안으로 사용할 수는 있을 것 같다.
스팀 리뷰는 ‘추천’, ‘비추천’ 두 가지 선택만을 제공하지만 간혹 ‘비추천’이지만 이런 부분은 좋았다, 라든가 ‘추천’이지만 이건 별로였다 등 추천 여부와 실제 사용자의 감정이 온전히 일치하지 않는 경우가 있다. 실제로 나도 그런 리뷰를 쓴 적이 있다. 그러니 이 점을 이용해 ‘추천’, ‘비추천’과 ‘사용자가 긍정적으로 서술’, ‘사용자가 부정적으로 서술’ 이 두 가지 기준을 조건부확률처럼 조합해서 쓰는 건 어떨까? ‘추천-긍정서술’, ‘추천-부정서술’, ‘비추천-긍정서술’, ‘비추천-부정서술’ 이렇게 네 가지로 리뷰의 분류가 자세해진다. 여기에 중립까지 끼우면 종류가 더 많아지고 자세해질 수 있겠지만, 일단은 생각하지 않기로 하자. 내가 할 수 있는 일에는 한계가 있고 중립까지 고려하는 건 과한 것 같다. 이게 팀플이면 생각해볼만 하지만 개인 프로젝트거든요.. 혼자서 모든 일을 다 해야 한다는 점이 예산에 포함됩니다.
아까까지 리뷰의 감정을 총 네 가지로 나눴다. 그렇다고 해도 역시 하나의 게임에 수많은 리뷰 감정이 대응된다는 점은 여전하다. 나는 이걸 일대일 대응으로 만들고 싶다. 스팀에서 제공하는 ‘압도적으로 긍정적’ ~ ‘압도적으로 부정적’ 지표에 더해 ‘리뷰 감정’이라는 항목으로 내가 분류한 네 가지 상태를 추가하는 건 어떨까? 스팀에서 하는 방법대로 평균을 낸다든가 최빈값을 사용한다든가 해서 하나의 값을 고르는 것이다.
잠깐 스팀의 리뷰 지표 계산 기준을 알아보고 왔다. 리뷰의 추천/비추천 비율과 총 리뷰 수에 따라 출력되는 문구가 다르다고 한다. 이 기준을 비슷하게 따르면 될 것 같다. 정리하자면 스팀에서 제공하는 ‘긍정적’ 정도를 하나의 속성으로 데이터에 포함하고, 내가 따로 텍스트 감정분석을 해서 만들어낸 ‘추천-서술’ 지표를 스팀의 계산 방식대로 계산해 별개의 속성으로 추가한다는 계획이다. 실현할수만 있으면 참 괜찮겠네.
추가 의견 : 아까 지인과 게임의 흥행 요소에 대해 잠깐 말해봤는데, 영화도 물론 비슷하겠지만, 요즘 게임은 게임 자체에 더해 제작사와 배급사의 운영과 이미지도 큰 비중을 차지해서 게임의 외재적 정보에 이런 맥락까지 같이 포함할 방법을 고민해봐야 할 것 같다. 데이터셋 구성을 좀 많이 고민해봐야겠다. 게임의 이름은 각 게임의 식별을 위해 필요하고, 제작사/배급사도 당연히 같이 수집해야 한다. 그리고 게임은 영화와 다르게 출시 이후에도 업데이트가 되고 새로운 컨텐츠가 추가되는 등 지속적인 관찰을 필요로 하니까 최근 일정 기간 이내 업데이트 여부도 같이 수집하는 게 좋을 것 같다.
스팀 내에서 수집 가능한 정보 : 게임 이름, 제작사, 배급사, 이용 연령가, 장르, 태그, 영어 지원 여부, 지원 언어의 수, 출시 일자, 최근 공지 업데이트 일자(오늘로부터 얼마나 이전인지), 스팀에서 제공하는 최근 평가 긍정성과 모든 평가 긍정성, 리뷰 수, 스팀 어워드 수상 여부 및 수상 횟수, “지금 유행하는 게임” 체크 여부, 메타크리틱 점수, ‘앞서 해보기’ 여부, 권장 사양, 해당 게임을 평가한 큐레이터의 수, 싱글/멀티/컨트롤러 지원/스팀 클라우드 등 각종 지원 사항, 최근 1개월 내 커뮤니티 게시물 업데이트 수, 타사 EULA 동의 필요 여부, 시리즈/DLC 여부와 수, 리뷰에 나타나는 플레이타임으로부터 평균 플레이타임(가능할지 안될지 모름), 지원하는 운영체제 종류, 도전과제의 수, 전체 플레이어의 각 도전과제 달성 비율(→ 평균 도전과제 달성률)
스팀 외부에서 수집 가능한 정보 : 게임과 제작사 관련 뉴스 기사, ‘논란’ 키워드 여부, 관련 기사의 긍정/부정 여부, 스팀 이외 플랫폼 지원 여부
스팀 DB에서 수집 가능한 정보 : 각 게임의 국가별 최고 할인율, 실시간 플레이 중인 유저 수, 최근 24시간 내 최다 플레이 수, 최근 2년 이내 최다 플레이 수, 총 리뷰 수와 ‘추천’ 리뷰 비율, 최근 업데이트 일자(오늘로부터 얼마나 이전인지), 해당 게임을 팔로우한 사람 수, 최근 2주간 플레이타임 중간값, 총 플레이타임 중간값, 최근 2주간 평균 플레이타임, 총 평균 플레이타임, 추정 게임 소유자 수, 커뮤니티/워크샵 활성화 여부, 기본 장르(메인 장르), 스토어 장르(상점 페이지에 뜨는 장르), 지원 언어의 수와 목록, 리뷰 점수, 리뷰 비율, 스팀덱 호환성
추가 사항 : 스팀 DB API 사용 가능, 그러나 어떤 기능을 할 수 있는지 모름. 코드 봤는데 내가 잠깐 공부해서 써먹을 수 있을만한 물건은 아님.
아 좀 아득한데.. 너무 많은데.. 저걸 어떻게 내가 쓸 수 있는 만큼만 골라내..
일단 예측하는 게 목적이니까 게임이 출시되자마자 알 수 있는 정보가 기본적으로 데이터셋에 포함되어야 하고, 그걸 바탕으로 게임이 플레이된 이후에 알 수 있는 정보를 예측해야 한다. 흥행 여부의 기준도 정해야 한다. 일단 다음 주 논문 하나 더 읽고 생각하자.