추천엔진이라는게 아시는분들은 잘 아시겠지만 자신이 구매한 물품을 기반으로 사용자 프로파일을 만들어서 그 프로파일과 비슷한 유저를 찾아 그 사람이 제일 많이 선호한 물품을 추천하는 알고리즘을 쓴다.(물론 상품 기반으로 계산할 수도 있다.)
물론 이 말은 굉장히 피상적인 내용이고, 실제 서비스에 적용하기 위해서 이런 작업은 검색 전에 인덱싱을 하는것처럼 pre processing 작업을 거쳐서 정제 후 나올 수 있는 비동기적인 서비스이다. (여기서 한가지 팁이 나오는데 Hadoop 같은 비동기적인 서비스를 위한 플랫폼이 이런 프로세싱에 잘 쓰일 수 있을 것이다. 그것도 한 부분만 )
검색과 연관시켜서 보면
1) 인덱싱 작업 – 사용자 프로파일 만들기
2) 검색 행위 – 현재 사용하는 유저와 비슷한 프로파일을 가지는 유저 찾고 그 사람이 구매하고 현 사용자가 구매하지 않은 물품 찾기
그래서 실시간으로 검색에 결과를 보여주는 형태로 바로 서비스 하기 위해서는 백그라운드 프로세싱이 필수고 게다가 검색의 복잡도를 줄일 수 있는 방법으로 유저 프로파일을 저장해둬야 한다.
위 책에서는 이런 검색 복잡도(유사한 유저를 찾기위한 검색)를 줄이기 위해 아마존 같은 곳에서 미리 비슷한 유저나 물품에 대한 목록을 미리 만들어 두고 물품을 추천할때 조회해서 올려주는 방법을 쓰고있다고 말하고 있다. (책에 나온 이야기는 몇 년전 초기 모델을 이야기 하는게 아닐까 한다.)
물론 바람직한 방법이나, 간단하게 별도의 구조화 작업 없이 할수 있는 방법이 있다. 게다가 가장 빠르다.
내가 추천엔진을 서비스하는것에 검색 서비스를 비유한것을 보고 느끼는게 없는지 묻고 싶은데…
이는 바로 검색엔진이 검색 복잡도를 줄이기 위해 역파일 구조를 쓰는 이유와 같다.
검색엔진이 문서의 벡터를 가장 효과적으로 검색하기 편하게 저장한건데, 입력이 문서라고 하면 이 문서 쿼리와 전체 문서간에 유사도를 측정해 가장 유사한 문서를 올려주는 엔진이다. (KNN algorithm)
계산된 사용자 프로파일을 term vector형식으로 역파일에 저장하고 입력된 사용자와 가장 유사한 사용자만을 뽑아와서 그 사용자가 구매한 물품을 추천하는 것이다.
검색엔진이 다분히 문서만 넣는다고 생각하는 고정 관념만 깨면 이렇게 훌륭한 최고로 빠른 term vector 유사도 계산기가 되는 것이다.
간단히 루씬(Lucene)에서 score 함수만 오버로딩/라이딩 해서 원하는 유사도 함수로 박아넣고 인덱스 빌딩해서 계산기로 쓰면 된다. ㅋㅋ
사실 이 팁은 an introduction to information retrieval 책의 KNN 알고리즘을 설명하는 챕터 에서 본건데, 본 다음날 회사분이 또 이 이야기를 해줬고, CI in Action 12챕터를 살펴보다가 이런 이야기가 없길래 써본 것이다.
정말 수년동안 검색엔진을 만져오면서 생긴 그 고정관념이 자유로운 사유를 얼마나 방해하는지 잘 느낄 수 있었던 계기가 되었다. 역파일이 왜 생겨났는지 그 이유와 문서가 벡터 형식으로 저장된다는 사실을 새삼 다시 벡터들을 만지면서 새롭게 느끼게 되었다.
CI in Action 12장 추천엔진에 대해서 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.