스마트폰 어플 중에서 '왓챠'라는 어플이 있다. 이것은 내가 이제까지 봤던 영화들 - 최소 20개 정도- 의 별점을 5점 만점으로 매겨놓으면, 향후 내 취향대로 영화를 추천해주는 기능을 가지고 있다. 이 알고리즘은 어떻게 만들었을까? 그냥 궁금해서 실제 어떤지 찾아보기 전에 생각해봤다.

 

(1) 가장 간단한 방법은 내가 별점을 많이 준 거랑 같은 별점을 준 사람들의 다른 걸 추천해주면 되는 것이다. 예를 들어 내가 5개를 준 영화가 있는데, 다른 사람도 5개를 주었다면, 그 사람이 추천한 다른 영화를 나에게도 추천해주면 된다. 그런데 영화를 종합적으로 평가해서 별점이라는 형태로 나타나긴 했지만, 이 별점에 반영되는 평가기준이 여러개여서 일관성이 없는 것처럼 보일수도 있다. 같은 영화를 두고 같은 별점을 주었지만, 다른 영화를 두고도 같은 별점을 줄 지 안줄지는 모르는 것이다.

 

(2) 그렇다면 나랑 조금 더 상관관계가 높은 사람을 찾는 방법은? 사람들 사이에 별점 차이를 구해서 그 차이가 작은 사람들 순서대로 세우면 된다. A,B,C,D라는 영화에 갑이 준 별점은 5,3,1,2 점, 을이 준 별점은 4,5,0,4 점일때 이 차이의 제곱은 1,4,1,4 이고, 이걸 평균내면 10/4=2.5 이다. 이 차이가 낮을수록 영화 별점 주는 취향이 비슷한 사람일 것이다. 그 취향이 비슷한 사람이 추천한 영화를 추천해주면 된다. (이게 바로 잔차의 제곱의 합을 최소화하는 OLS!)

 

(3) 더 정확한 방법은 사람들 사이의 거리를 구하는 것이 아니라, 영화들 사이의 거리를 구하는 것이다. A,B라는 영화에 갑, 을, 병, 정이 준 점수의 차이의 제곱을 구해서, 영화들 사이의 별점 차이가 가장 낮은 애들을 추천해 주면 된다.

 

그냥 직관적으로 생각해보기에 (2), (3) 방법이 가장 프로그램의 길이를 짧게 할 것 같은데, 이왕 생각한 거 몇 자 더 적어보면.... (2), (3) 번 방법은 사람들 수가 많아질수록, 영화 수가 많아질수록 상관관계를 구하는 조합이 너무 많이 늘어난다. 그래서 좀 더 원론적인? 방법을 생각해보면,

 

(4) 사람들 사이의 관계도로 DB를 만드는 것이 아니라, 영화들의 별점을 매겨놓은 DB를 만드는 것이다. 사람마다 영화에 별점을 부과하는 기준이 다르므로, 이게 절대적인 점수가 부여된 DB가 되면 안된다. 그래서 상대적으로 위치가 주어지게 만들기 위해서 별점 배치도 DB를 만드는 것이다.

 

사람별로 영화에 별점을 매기는 기준이 다르니, 여러가지가 고려되어야 한다.  우선 문제를 단순화시키기 위해서 가정을 하면, (i) 별점 평가를 2차원에서 한다고 가정한다. (ii) 2차원 공간은 장르별로 존재한다. 장르별로 별점을 평가하는 이유는 사람마다 좋아하는 장르에 더 많은 가중치를 주기 때문이다. 우선 그 요소를 배제하기 위함이다. (사실 2차원 공간+장르=3차원 공간이 되지만 문제를 간단히 하기 위해 무시)

 

별점 평가를 2차원에서 한다면, 어떤 기준을 축으로 삼을 것인지 문제가 된다. 이것은 나중에 보면 뭐가 되어도 문제가 되지 않지만, 일단은 영화의 완성도-완성도를 뭐로 평가하느냐에 따라 다를 수 있지만, 여기서는 스토리텔링이 얼마나 강한지에 대한 것을 X축으로 잡는다.(별 내용 없는데 이상하게 괜찮은 영화들이 스토리텔링의 힘이다.), 그리고 Y축은 로맨스영화의 경우 영화가 얼마나 달달한지로 한다.

 

그러면 이제 20개의 DB를 만들 차례이다. 내가 어떤 로맨스 영화를 완성도도 높고, 달달함도 높다고 생각해서 4사분면 중에서 1사분면 - 2차원 그래프에서 오른쪽 위에 위치하도록 5점의 별점을 주었다고 치자. 반면 맘에 안드는 영화에 별1개를 주었다면 왼쪽 아래(3사분면)에 위치하게 될 것이다. 반면, 완성도가 높지만 덜 달달하다거나, 완성도가 낮아도 달콤해서(혹은 주인공이 좋아서) 3점 정도 주었다면 2,4 사분면에 위치하게 된다. 여기서 문제는 2,4 사분면의 위치는 점수는 같지만, 어느 사분면에 어떤 영화를 배치할 것인지의 문제가 남는데, 이걸 사후적으로 배치하는 것이 베이지안 업데이트 문제인 것 같다. 그러니까 결과를 봤더니 사실 이런 거였구나 하면서 배치하는 것이다.

 

이렇게 20개의 샘플로 DB가 완성되면, 이제 영화를 추천할 수 있다. 내가 높은 별점을 준 영화의 위치 옆에 있는 영화들을 추천해 주면 된다. 이 때 참고하는 것은 다른 사람의 DB가 아니라 영화 전체의 DB이다. 사실 3사분면에 있는 것들이 내가 1점밖에 주지 않은 영화일지라도 어떤 사람은 5점을 준 영화일 수도 있다. 그러니까 이 DB에서 상대적으로 영화 거리가 가까운 애들 추천해주면 된다. 그러니까 이 방법도 사실 (3)번 방법과 마찬가지로, 영화의 거리만 구해서 가까운 애를 알려주긴 하는 방법이지만, 차이점은 일단 절대적 배치를 해놓고 상대적 거리를 알려주는 것이다. 이 방법이 더 확장성이 있을 것 같은데, 이 이상 생각이 안나므로 이건 여기서 그만.

 

추가로, 이걸 내가 뭘 먹고 싶은지 알아내주는 맛집 추천 어플 알고리즘에 넣을 수 있는지도 생각해봤다. 그니까 오늘 점심 뭐먹을까? 하고 입력하면, 오늘은 이거 어때? 하고 결정해주는 그런 어플. 근데 생각해보니, 맛집은 너무 '제약조건'이 많다. 날씨가 흐리면 부침개가 먹고 싶을 수도 있고, 좀 추우면 따뜻한 게 먹고 싶을 수도 있고, 어떤 날은 현금이 없는데, 현금만 받는 집들도 있고, 어떤 날은 좋은 레스토랑에서도 먹어보고 싶고. 제약조건이 많은데 이걸 다 한번에 만족시킬 수는 없는 법(애로우의 불가능성의 정리!). 반면, 영화는 선호만을 반영해 추천하는 것이므로 특별한 제약조건이 없다. 날씨가 흐리든 아니든 실내이고, 영화가격은 특별한 상영조건을 제외하고는 같은 편이다. 그래서 맛집 어플은 거리나 가격 같은 조건문을 입력해서 선택하는 방식-이미 나와있는 어플들의 추천방식-이 아닌 이상 나오기 힘들 것 같다.

 

 

* 사족/메모.

+  IMDB 사이트의 별점평가 방식에서는 10명의 사람이 평가한 영화와 1000명의 사람이 평가한 영화의 차별을 위해, 영화에 똑같이 일정 점수를 주고 시작한다고 한다. 그래서 10명의 사람이 평가한 영화에 각 사람의 가중치가 낮아지도록 하는 것이다.

+ 왓챠 어플 알고리즘 검색하면 나올 것 같은데 아직 안해봤다.