트랙 B: 게임 플랫폼 스타트업인 A사가 사용자에게 적합한 게임을 추천할 수 있는 아이디어 구현
우리 팀은 트랙 B를 선택하여 진행하였다. 기본적으로 추천 시스템은 인공지능을 도입하여 유의미한 성과를 얻고 있는 것으로 알고 있었고, 팀원 구성이 프론트 1명, 인공지능 3명이었기에 고민없이 선택하였다.
해커톤에서 참가자들에게 바라는 부분은 무엇일까?
나는 개인적으로 기존 방법과 다른 참신한 시도라고 생각하였다.
대부분의 회사에서 기본적인 추천 시스템을 도입하고, 또 그 성능도 우리가 단기간에 구현하는 것과는 비교도 안되게 좋을 것이 분명하였다.
따라서 우리는 기존 추천시스템과 차별화된 요소가 반드시 필요하다고 생각하였다.
그중에 내가 떠올린 아이디어는 각각의 게임마다 존재하는 수많은 리뷰 정보를 활용해보는 것이였다.
튜토리얼이 끝날 때 즈음이면 위와같이 리뷰 작성을 부탁하는 화면을 만나게 된다. 게임사들은 왜 이렇게 게임내 재화까지 소모해 가면서 리뷰를 남기고 싶어하는 것일까?
물론 feed back을 원해서기도 하겠지만, 더 중요한 이유는 이런 리뷰들이 잠재적 고객에게 더많은 정보를 제공하고, 더 나아가 게임을 해보게끔 만들기 때문이라고 생각한다.
실제로 필자도 어떤 게임을 할지 말지 고르는 기준은 게임성과, 장르 등등 다양한 부분이 있지만 최종적으로는 사용자들의 리뷰를 많이 보는 편이다.
이렇듯 리뷰는 기본적으로 게임을 아직 사용해 보지 않은 사용자에게 해당 게임을 추천하는 본질을 가지고 있다. 우리팀은 이런 리뷰의 성질에 초점을 맞추고, 리뷰기반 게임추천 시스템을 만들고자 하였다.
트랙 B는 카카오게임즈에서 제공한 아이디어였기에, 실제 카카오 게임즈가 유통하는 게임들에 대해서 Data를 수집하고자 하였다.
카카오 게임즈에서 게임의 목록들을 list up하고 google play store에서 해당 게임들에 대한 크롤링을 진행하였다.
총 91개의 게임들에 대하여 제목, 장르, 평점, 리뷰 개수등을 수집하였다.
또한 각각의 게임들에 대하여 500개 내외의 리뷰데이터를 크롤링하였다.
리뷰데이터를 적절히 가공하여 각각의 게임에 대한 숨겨진 feature를 추출하는 것이 관건이라고 생각하였다. 하여 각각의 게임을 대표할 수 있는 단어 10개를 리뷰데이터로 부터 뽑아내고자 하였다.
게임 하나당 500개가 넘는 리뷰들이 있고, 각각의 리뷰들은 서로 다른 사람이, 다른 관점에서, 다른 평가를 한 것이기에, 개별적으로 키워드를 추출해야 한다고 판단하였다.
Key word 추출에 사용한 모델은 한국어로 pretrained 된 skt/kobert-base-v1 을 사용하였고, KeyBERT() 함수를 사용하여 각각의 리뷰에 대한 Key word를 추출하였다.
위에서 열심히 구한 개별 리뷰 key word를 바탕으로 게임별 키워드를 추출하였다.
500개의 개별 리뷰에서 추출한 수많은 키워드와 해당 키워드 중요도의 누적합을 아래와 같이 Dict 형태로 저장하고
Keyword의 중요도와 함께, 나머지 90개의 게임내에서의 해당 단어의 빈도를 고려하기 위해 커스텀 TF-IDF를 직접 만들어서 게임당 10개의 키워드를 추출하였다.
평균 평점을 반영하기 전에 한번 추가적인 전처리 과정을 추가 했다. 이는 IMBD 영화 점수에서 적용한 방식인데, 우리 주제에도 적용하기에 타당하다고 판단하여 진행하였다.
리뷰수가 많으면, 그 수가 적은 것에 비해 점수에 이점을주는 방식이다.
def weight_rating(x, m=m, c=c):
v = x['review_num']
r = x['rating']
return (v / (v + m) * r) + (m / (v + m) * c)
이후 기존에 뽑아낸 각각의 keyword와, 기존에 추출한 genre 항목까지 모두 포함하여 코사인 유사도를 측정한다.
이렇게 하여 코사인 유사도가 높은것과, weight_rating을 고려하여 추천하도록 구현하였다.
React와 Fast API를 이용하여 실제로 웹 페이지에서 추천 시스템을 구현해 보았다.
메이플 스토리M, 미르M 은 roleplaying 게임이기에, 오딘, 아키에이지, v4같이 롤플레잉 게임이 기본적으로 많이 보인다.
이때 흥미로운 키워드가 있는데, 바로 '리니지' 라는 키워드이다. 해당 키워드는 '과금' 이라는 키워드와 같이 자주 등장한다(리니지는 과금을 빼놓을 수 없는 게임이기에 어찌보면 당연한 결과일지도...). 이러한 키워드들을 조합해서 생각해보면, '리니지와 비슷한, 과금을 필요로 하는 게임' 이라는 조금 더 사용자들이 평가하는 세부적인 카테고리로 분류하고, 이것을 기반으로 사용자들에게 추천이 가능하다는 점이다.
기본적으로 장르 또한 코사인 유사도의 feature로 들어갔기에, 유사한 장르의 게임들이 많이 추천 되지만, 장르가 다르더라도 유사한 key word들이 겹친다면 충분히 추천될 수 있다.
다운로드 목록은 모두 RolePlaying 게임이지만, 월드 플리러와 같이 action 장르의 게임이 추천되는 것을 확인할 수있다. 이는 우마무스메라는 게임에 운영, 일본, 가챠등 다양한 키워드들이 겹치기에, 장르를 넘어선 추천이 가능하다.
장장 30시간동안 잠도 못자고 깨어서 코딩만 죽어라고 한것 같다...
정말 힘든 경험이었지만 짧은 시간안에 아이디어 구상부터 데이터 크롤링, 모델 선정, 점수 환상방식 결정, 웹 구현까지 정말 밀도 있게 프로젝트를 진행하였고, 나름 결과도 만족스럽게 나온 것 같다.
사실 운이 좋았다고 생각한다. 비교적 우리팀은 빠르게 아이디어가 나와, 의견을 모을 수 있었고, 모두 큰 오류 없이 자신의 파트를 완성했다. 사실 알수 없는 이유로 중간에 막히는 경우가 코딩에서 얼마나 많은지를 생각해보면, 정말 운이 좋았다고 생각한다.
조금 아쉬운 부분은 살짝 발표가 미흡하지 않았나 하는 부분이다. 학교에서 진행하는 팀 프로젝트 처럼 구현 과정에 대해서 너무 많이 설명한 것같다. 사실상 심사위원 님들에게 우리 프로젝트의 장점을 실질적인 예시를 보여주면서 조금더 잘 설명했으면 더 좋은 결과를 받을 수 있지 않았을까 하는 아쉬움이 있다.
하지만 하루라는 시간동안 완전히 하나의 주제에 대해서 몰입해보는 경험은 값진 경험이었다고 생각한다!
기사 링크 : https://www.youthdaily.co.kr/news/article.html?no=134905