블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.11.29 12:54

[ Perl ] 협조 필터링(Collaborative Filtering) 에 대해서... - SUGGEST

 협조 필터링이라는 것에 대해서 자세한 연구는 해보지 않았습니다. 몇가지 논문도 있는 데, 제대로 읽어보지 않고 그냥 대충 이런 거다 라는 느낌으로만 알고 있다고 할까요.
 흔히 쇼핑 사이트에서 사용됩니다. 어떻게 사용되느냐? 갑이라는 사람이 "A 라는 상품을 구입할 때, 같이 구입하는 상품 B 는 A 와의 관련성이 있다" 라고 해석합니다. 그리고 갑뿐만이 아니라 다른 사람도 A 라는 상품을 구입할 때 B 를 산다고 하면, A 와 B 의 관련성은 더 깊어지게 되겠죠?
 그럼 국내 쇼핑사이트에서는 어떻게 이용되느냐 살펴보겠습니다.
 "주제 사라마구"의 <눈먼 자들의 도시> 라는 상품 페이지에서 YES24, 알라딘이 어떻게 표시하고 있는 가는 다음과 같습니다.

YES24 의 관련 상품 표시


Aladdin 의 관련상품 표시


  "눈먼 자들의 도시"를 구입할 때 같은 저자의 "눈뜬 자들의 도시"도 같이 구입하는 사람들이 그만큼 많다는 뜻이겠죠?

 그렇다면 구입데이터를 취합해서 어떻게 이런 상관관계를 명확하게 하느냐 하는 것인데요.
 기존에 제가 관리하던 어느 쇼핑몰에선 암암리에 그 쇼핑몰에서 관리하고 있는 상품을 타사의 상품과 매치시켜서 타사의 관련상품을 긁어오는 범죄(?)를 저지르기도 했습니다. ;;;

 그랬을 때 발견한 것이 Suggest 라는 Recommendation Engine 인데요. 이것은 Statistics::Suggest 라는 CPAN 모듈로 사용할 수 있습니다.
 이 모듈 사용을 위해서는 suggest 라는 라이브러리를 설치합니다. 이것은 아래의 URL 에서 다운로드 할 수 있습니다.

  - http://glaros.dtc.umn.edu/gkhome/suggest/download

 그리고 CPAN 모듈 설치시에 Library 를 지정해주면 무사히 설치가 종료됩니다. 아래의 CPAN 모듈 페이지를 참고하세요.

  - http://search.cpan.org/~ihara/Statistics-Suggest-0.01/lib/Statistics/Suggest.pm

  1. use Statistics::Suggest;
  2.  
  3.   ## initialize SUGGEST with $data
  4.   my $data = [
  5.     # array of [$user_id, $item_id], ...
  6.     [1, 1], [1, 2], [1, 4], [1, 5]
  7.     [2, 1], [2, 2], [2, 4],
  8.     [3, 3], [3, 4],
  9.     [4, 3], [4, 4], [4, 5],
  10.     ...
  11.   ];
  12.  
  13.   my $s = new Statistics::Suggest(
  14.     RType => 2,
  15.     NNbr => 40,
  16.     Alpha => 0.3,
  17.   );
  18.   $s->load_trans($data);
  19.   $s->init;
  20.  
  21.   ## make top 10 recommendations for $selected_item_ids
  22.   my $rcmds;
  23.   my $selected_item_ids = [1, 2];
  24.   $s->top_n($selected_item_ids, 10, \$rcmds)
  25.  
  26.   print "recommendations: " . join(',', @$rcmds);

 Statistics::Suggest 의 예제소스입니다. Statistics::Suggest 의 생성자에 날리는 RType, NNbr, Alpha 에 대해서는 이게 뭔지 자세하게 알아보지 못했습니다. 심히 접근방식이 잘못되었지만;; 일단 사용해보고 나서 알아보자 라는 생각으로 다음으로 미뤘습니다.
 소스코드의 주석만으로 어떻게 작동되는 지는 간단하게 살펴보실 수 있으실 겁니다.

 이것을 기반으로 제가 관리하는 쇼핑 사이트의 구입이력에서 user_id 와 item_id 를 뽑아 데이터를 만들어봤습니다.
 이때 주의할 점은 user_id, item_id 는 32bit 정수형값만 사용할 수 있습니다. 그렇지 않을 경우는 "Segmentation Fault" 에러가 나서 작업을 진행할 수 없습니다.

 저 같은 경우는 user_id 는 문자열, item_id 는 32bit 정수값을 넘는 정수라서 이것을 32bit 정수형에 맞게 임시 id 를 발행하도록 했습니다. 그리고 그 id 에 맞는 데이터 셋을 만들고, item_id 는 따로 리스트를 만들어 둡니다.
이건 각 item_id 마다의 관련상품을 조사하기 위해서지요. 이것만 주의하면 되기때문에, 별도의 소스코드는 제시하지 않겠습니다.

 아무튼 결과는 어느정도 만족할 만큼 나왔습니다. 다른 사이트를 매번 긁으러 갈 필요도 없고, 괜한 죄책감을 느낄 필요도 없어졌습니다.

  Amazon 은 이 Collaborative Filtering 기술에 있어서 가장 앞서있지 않나 싶습니다. 구입이력 뿐 아니라 사용가능한 어떤 이력이든지 뽑아내어서 고객에게 보다 관련성이 높은 상품을 제시해서, 편안한 이용과 더불어 매출의 증대를 노리고 있으니까요.
  Netflix 라는 미국의 DVD 대여업체의 이벤트도 흥미롭습니다. 자신이 빌려본 DVD 를 본 다른 사람들의 성향등을 파악해서, 그 사람에게 맞는 DVD 를 추천하는 기술이 있는데... 여기에서 이 정밀도를 10% 향상시킨다면 100만달러를 지급하겠다는 그런 이벤트를 냈죠. 아마 지금도 하고 있지 않나 합니다. 예전에 봤을 때 이미 10%를 넘긴 듯 싶었는데... 오래된 컬럼이지만 이것을 참고하세요.

  - Netflix 컬럼 관련링크 : http://imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=32617

 아무튼 이런 기술들은 완전한 완성이라는 것은 없는 것 같습니다. SUGGEST 라는 엔진이 가지고 있는 알고리즘을 사용해서 간단하게 구현하는 것일 뿐이지.. 실제로 그 알고리즘이 어떻다는 얘기는 완전 생략하고 얘기했으니, 겉핥기에 지나지 않습니다. 뭐, 생색내기일지도 모르죠. 그리고 저도 저 결과를 이용해서 어떻게 보완해나가느냐 계속 궁리해봐야 겠구요. 이상입니다.
신고
TOTAL 473,858 TODAY 36

티스토리 툴바