본문 바로가기

[Recoeve.net]

개인화 된 추천 시스템 (Personalized recommendation system)

728x90
반응형

모든것에 대한 개인화 된 추천과 개인화 된 정리함/보관함 (Personalized Recommendation for Everything, and Self-customized List Box)

만들어야지. Recommendation for you.

Posting History

  • 2014-09-15: 로그인 대충 구현.
  • 2014-06-21: First Posting?은 아니고 언제 처음 아이디어 내서 만들려고 계획했더라? =ㅇ=;; 좀 오래 되긴 했음. 대충 1~2년 전부터 고민했을듯.

앞으로 해야할 것들

  • AJAX로 페이지 일부분만 업데이트 가능하도록. socket.io로도 되는건가? 중복되는 데이터를 자꾸 주고받으면 서버에 부담. Browser 의 local storage API 좀 공부해봐야 할듯. Cookie 에 저장할수는 없음.
  • 데이터배이스 구상. 테이블 어떻게 짤 것인지.
  • Making connections. (단순 comment 보다는 어떤 글이나 강연을 보고 자신의 생각을 정리하고 덧붙여서 좋은 글이 탄생하는 경우도 많음. 이 경우 제 3자는 영감을 준 첫 글, 강연에 대한 평가와 재탄생 된 글 두가지를 다 보는 경우도 있음. 뭐 평가하는 사람이 넣고 싶은 sub category에 넣어서 자신의 리스트를 정리할수도 있겠지만, 두 글이 연관 (여기서는 arrow 관계?) 되어 있다는 것을 알려주면 좋을듯함.)

Table of Contents

Introducing

세상에 정보, 지식, 물건들은 너무나 많습니다. 다수가 추천하는 정보, 지식, 물건들이 나에게 꼭 맞는 것만은 아닙니다. 지구상에는 70억명이 넘는 사람들이 있습니다. 그 중 나랑 비슷한 사람은 어느정도 있기 마련이지만, 그런 사람을 찾는 것은 쉬운일이 아닙니다. 한 사람의 모든 부분이/취향이 나랑 비슷하기는 힘들지만, 특정 분야에서는 취향이 비슷한 사람은 꽤나 많을수도 있습니다. 사람 중심으로 이루어지는 SNS가 많이 있지만, 이 사람의 특정 분야 이야기만을 내가 팔로우 할수는 없습니다.
이것을 만드는 여러 이유들은 우선 집어치우고, 어떻게 동작하게 만들고 싶은지. 어떤 시스템/서비스를 생각하고 있는지를 바로 말하겠습니다. (자세한 수식이나 알고리즘 등은 따로 정리하고 있고, 같이 일을 시작하게 되면 공유하겠습니다.)
우선 트위터랑 비슷하게 글을 작성하는 시스템 입니다. 단 팔로잉이나 팔로워 개념은 없습니다. 추후에 고려해 볼수는 있겠으나, 기본적인 철학은 "비슷한 사람끼리 우리가 자동으로 연결해주고 당신이 좋아할만한 모든 것들을 추천해준다. 당신은 그냥 작성만 하고 평가만 해라." 입니다. 트윗 (이해를 위해 트위터 용어를 그냥 차용) 은 물건에 대한 이야기일수도 있고, 블로그나 기사 글 링크를 달고 해당 글에 대한 평가를 하는 경우도 있을 겁니다. 트위터와는 다르게 트윗에 추가로 1~7점의 평가를 남길 수 있습니다.
점수는 어떻게할지 심히 고민이긴 합니다. 사용자가 너무 골머리 썪지 않도록 10개의 선택지 이상은 안 줄 생각입니다. 무엇을 평가하는가에 따라 선택지 (혹은 점수에 대한 설명) 가 달라질수도 있습니다. 물건이라면 "엄청 관심간다 7점, 관심간다 6점, 적당히 관심간다 5점, ..., 젼혀 관심없다 이딴거 추천해주지 마라 1점", 써본 물건이라면 "엄청 좋다 7점, 좋다 6점, 적당히 좋다 5점, ..., 쓰레기다 1점", 기사나 블로그 글이라면 "이런 기사/글 엄청 흥미있다 7점, 흥미있다 6점, 적당히 시간 남을땐 보겠다 5점, ..., 전혀 관심없다 1점" 혹은 "이 기사/글 엄청 정성들여 썼고 질이 높다 7점, 잘 썼다 6점, 괜찮게 썼다 5점, ..., 쓰레기 글이다 1점" 등등등
사용자들이 이런 평가를 쌓아가면 우리는 이 트윗을 자동으로 분석해서 (Machine Learining) 비슷한 사용자를 묶어냅니다. 앞에서 설명드렸다싶이 전체를 봤을 때 비슷한 사람들, 분야별로 봤을때 비슷한 사람들을 추려야 합니다. 사용자에게 트윗을 쓸때마나, 혹은 평가를 할때마다 어느 분야에 속한 것인지 선택하라고 우리가 귀찮게 굴지는 않습니다. (귀찮게 하면 안됩니다.) 다만 자신이 평가한 것들을 잘 정리하고픈 사람은 일정비율 있을겁니다. 이런 분들을 위해 개인 페이지는 정리함 형태로 잘 구현해야 합니다. 드레그 엔 드랍으로도 카테고리별 (분야별) 정리가 되고, 카테고리 내에서는 내 평점 순, 내가 평가한 날짜 순, 컨텐츠가 처음 올라온 날짜 순, 해당 컨텐츠의 평균평점 순 등 다양하게 볼 수 있게 꾸며줘야 합니다. 해당 트윗을 분석해서 자동으로 분류하기도 하고, 일부 사용자들이 분류해놓은 것들을 분석해서 (Machine Learining) 대표 카테고리를 우리가 자동으로 정해주기도 합니다.
우리의 시스템은 사용자가 수억명이 되어도 잘 동작하는 알고리즘이어야 합니다. 수억명을 매번 비교해서는 안되고, 사용자의 computing resource를 어느정도 활용하기도 하고, 구상단계에서부터 해결하고 고민해야 하는 많은 것들이 있습니다. 어떻게 비슷한 사람들을 추려낼 것이고, 사생활은 어떻게 보호할 것이고 등등. 더 구체적인 사항들은 개인적으로 더 정리하고 있습니다. Abusing을 막는 것도 핵심입니다. 어떤 계정들이 실제 사용자들이고 어떤 계정들이 bot인지 혹은 악의적인 사람들인지도 Machine learning으로 구분해내어서 처리해주어야 할 것입니다.
트위터 / 페이스북 / Google+ / Pinterest 등의 plug-in들 widget들 비슷하게 해당 블로그/기사 글에서 바로 평가하고 글을 남길 수 있는 시스템도 필요할 겁니다. Daum View Widget과 비슷할 수 있지만, 더 좋아야 합니다. DISQUS / Facebook Reply Plug-in 과 비슷한 댓글 plug-in 서비스도 고려해볼만 합니다. 댓글들 중에서 추천을 많이 받은 댓글을 노출시켜주는 것이 아닌, 나랑 비슷한 사람들의 댓글을 보여준다면 소통이 더 잘 이어질 것입니다.
가끔은 나랑 반대되는 의견도 봐야 생각이 더 유연해지고, 지식이 풍요로워지고, 삶이 나아질 수 있습니다. 평가가 양 극으로 나뉘는 글들이 있다면 내 예상 평가가 낮다고 할지라도 조심스럽게 사용자에게 노출시켜줘서 다른 정보, 의견들이 있다는 것을 알려주면 좋을 것입니다.
이 외에도 고려하고 있는 것들은 많습니다. "Merging multiple groups of evaluations which indicates the same content", "Less weight on old evaluations" 등등등. 더 자세한 이야기는 직접 만나서 해드리겠습니다.

수익 모델은?

경제적인면을 미리 예측하기는 힘들수도 있습니다. 잘 만들고 여러가지 운과 실력이 좋아서 사용자가 엄청나게 늘어나면, 우리가 감당해야할 트레픽 비용 대비 얼마나 수익을 낼 수 있을지를 당연히 고민해봐야 지속 가능한 서비스를 제공 할 수 있을 것입니다. 보통은 개인화 된 추천광고로 대부분의 수입이 나올것이라고 예상하고는 있는데, 직접 부딪쳐봐야 알것 같습니다. 좋은 글, 영상, 지식 같은 것들은 직접 유통시켜서 컨텐츠 제작자에게도 수입을 주고, 일정부분 유통비용을 챙기는 수익모델도 있을 수 있습니다. 아예 커머스까지 확장하거나, 블로그 (더 신뢰가는 글을 작성할 수 있는 시스템을 같이 제공. docuK format 같은) 같은 유료 서비스도 같이 제공해서 수익을 낼 수 있을수도 있습니다. 하지만, 섣부르게 이런걸 먼저 생각하기 보단 치열하게 좋은 제품을 만드는데 우선 집중해야 한다고 봅니다. 저에겐 수익도 중요하지만, 좋은 시스템/생태계를 만드는것도 중요하기 때문입니다.

참고할만한 다른 서비스들 (Other Internet Services worth Refering)

Daum View Widget

다음 뷰 위젯 테스트. (2014-06에 폐지된다는듯. 다음도 개인화 된 추천 준비하는듯도). 개인적으로는 다음뷰로 송고하지 않아서 남의껄로 테스트 함 (남의 글 추천을 막 다른곳에도 붙여넣을 수 있구나 ㅡ,.ㅡ;;; 악용 안되나?ㅋ). 4가지 타입을 제공하는듯 함. 다음에 로그인하지 않고도 ip 분석으로(?) 추천이 되는듯. 하지만 이전 추천을 분석해서 개인화 된 글 추천을 해주는건 아닌거 같음. 전체 추천수가 많은 글들을 다음 첫화면에 노출시켜주거나 다음 뷰 페이지에서 추천해주거나 하는듯.
코드는 다음과 같이 삽입 됨.

			
			예전에 다음 블로그 쓸 때 기억하기로 다음뷰에 송고할 때, 분야를 글쓴이가 골라야 함. 불편한 점은 분야가 너무 많기도 했고, 딱 내가 송고하고자 하는 분야를 찾기도 힘들때가 있었음. Machine Learning (복잡하지 않은 알고리즘 + 시간이 오래걸리지 않는) 으로도 분야를 자동으로 분류해줄 수 있을텐데, 아직 구현 안한듯. 내용을 분석해서 분야를 알아낼수도 있고, 글쓴이가 선택한 분야, 글을 읽는 사람들이 선택한 분야 등의 데이터를 쌓아서 learning 하는 알고리즘도 가능할듯.
		

Feedly

Feedly라는 서비스가 있음. Google reader (지금은 서비스 중지) 처럼 rss (Really Simple Syndication, Rich Site Summary) 를 읽어서 블로그에 새로운 글이 뜨면 종합해서 알려주는 서비스. 이것도 본인이 팔로우 (feedly) 할 사이트들을 고르고 카테고리별로 정리해야함.
새로 나온 글들, featured 글들을 잘 정리해서 보여주긴 하는데, 팔로우하는 사이트가 많으면 여기서도 골라 읽어야 하고 귀찮은 점도 꽤 있는듯.

Twitter / Facebook / Google+ / Pinterest Widget

SNS 들이야 이것저것 많고 하지만 위의 4개 정도가 유명함. 추가로 tumblr 정도? 아무튼 이런 SNS의 특징들은 사람을 중심으로 이루어진다는 것으로 여러가지 단점들도 많이 보임. SNS 우울증이라던가, 팔로우 할 사람들 찾는게 일이라던가. 이미 구축된 관계망에 내가 (새로 유입된 사람이) 새로 끼어들기가 힘들다거나 하는 등. 이러한 이야기는 많이 했으니 우선 넘어가고.
이런 SNS에서는 자신의 이야기 뿐만 아니라 정보들도 공유를 함. 따라서 뉴스, 블로그 글들을 다른 사람에게 소개하는(?), 자신의 SNS에 올리는 widget or plug-in 들이 있음. One click으로 해결되는 facebook like 수가 압도적으로 많음. 그 뒤가 트위터 같은데... 트위터는 클릭하면 팝업이 뜨고, 140자 이내에 개인의 comment도 추가해서 tweet하는 식임. 팝업이 뜨는데 시간도 많이 걸리고, 추가적으로 클릭을 많이 필요로 하기 때문에 사용자 입장에서는 꽤나 귀찮은 작업.
Facebook like 수가 트위터 공유수보다 압도적으로 많은 이유가 이런것으로 설명 가능할듯. 뭐 페이스북 사용자가 트위터보다 많은것도 어느정도 이유가 될테고. 사용자 비율보다도 더 차이가 나는듯함.
따라서 우리 서비스도 공유하는 과정을 귀찮게 하면 안됨.

DISQUS / Facebook Comment Plug-in

DISQUS, Facebook 댓글 위젯 (Comment Widget) 도 존재함. 특히나 DISQUS widget이 UI (User Interface) 가 좋은듯. TechNeedle에서 구현해 놨어서 사용해보면서 알게 되었는데, 내 댓글에 댓글이 달려도 다른글의 댓글창에서도 알림이 뜨고, "TOP COMMENTERS ON TECHNEEDLE"라고 해서 댓글을 유도하기도 하고 (이건 없는편이 나은듯도, 쓸데없는 숫자경쟁이라), "TOP DISCUSSIONS ON TECHNEEDLE"라고 해서 댓글이 많은 글들도 보여줌. 새롭게 댓글이 달린 글들도 알려주는듯.
Edit, Comment, Share, vote up/down 등의 UI도 훌륭. 특히나 여러 서비스들, 홈페이지들, 블로그들이 많은데 매번 다른 계정으로 로그인해서 댓글달기도 귀찮고, 내 댓글에 댓글이 달려도 알림도 받기 쉽지 않고 한 점들을 해결해주는듯. DISQUS란 이름답게 토론이 되도록 하는듯한? 아무튼 Facebook처럼 과도한 개인정보를 노출하지 않으면서도 어디서나 댓글을 쉽게 달 수 있게 해주는 universal comment widget인듯.
DISQUS 와 Facebook Comment Plug-in 이 차이가 없을수도 있긴한데, 주로 지인들과의 네트워크로 쓰는 페이스북 특성상(?) 혼자 몰래 놀고 싶을 때 좋을듯? 그 외에도 디자인 (css, 글씨크기, width 등), TOP DISCUSSIONS, Recent comment alarm 등 DISQUS가 훨씬 좋아보임.
Facebook comment plug-in: https://developers.facebook.com/docs/plugins/comments; 뭔가 조금 엉망임. (최근에 버전업 2.0으로 되면서 약간 좋아진듯.)

Service Name? Domain Address?

Recoeve (Recommendation of Everything), PROE (Personalized Recommendation Of Everything), perev (Personalizing Everything), pereco (Personalized Recommendation), perecom (Personalized Recommendation) 등의 이름. 이름은 더 생각해봐야 할듯. 당장은 Recommendation for Everything 및 Record, Recover 란 뜻이 통하는 "Recoeve" 가 가장 맘에 들긴 함. 즉 아마도 http://www.reco-eve.com; and http://www.recoeve.com; and http://www.recove.com (이건 누가 쓰고 있네.)
이름도 중요한 문제이긴 한데, 내용이 더 중요하니 당장은 우선 적당히만 고민.

Similarity and Weighted Average, The Personalization

모든 것에 대한 개인화 된 추천 알고리즘은 어떻게 짤 수 있을까? category, subCategory, subsubCategory 등으로 나눠서 category 별로 A와 비슷한 평점을 준 사용자 (ordered by similarity) 를 추출/저장. 이 category에서 A가 점수를 메기지 않은 contents에 대해 weighted average를 구해 A의 예상평점을 구함.
Similarity between user$_i$ and user$_j$: $S\,(u_i,u_j)$=$S\,(u_j,u_i)$는 어찌 디자인 할까? 굳이 symmetric하게 만들 필요는 없을듯. Symmetric하면 한쪽 (user$_i$) 을 업데이트 할 때 user$_j$ 도 업데이트 할 수 있다는 장점은 있는데, recent evaluation 기준으로만 계산하는 경우 (less weight on old evaluations) asymmetric 하게 design 하는게 더 효율이 좋을듯. 속도와 less cost 도 중요한 요소라 적당히 정확성 있는 선에서 타협해야함.
Let valuation on content k by user$_i$ : 1~7 points (콘텐츠 k 에 대한 사용자 i의 평가: 1~7점) be v\,(c_k;u_i) .
Let similarity of user$_j$ from user$_i$ be S\,(u_j \text{ from } u_i) = S\,(u_j ; u_i) = \frac{\sum_{c_k \in\,R(u_i)} s\,(c_k;u_i,u_j)}{\sum_{c_k \in\,R(u_i)} 1} where $s\,(c_k;u_i,u_j)$ $\big($= $s\,(c_k;u_j,u_i)$$\big)$ is single-similarity function on content k between user i and user j. Simple candidates for single-similarity function are s\,(c_k;u_i,u_j) = \frac{a^2}{a^2+\big(v\,(c_k;u_i)-v\,(c_k;u_j)\big)^2} = \frac{1}{1+\Delta v^2/a^2} and s\,(c_k;u_i,u_j) = \exp \bigg( -\frac{\big(v\,(c_k;u_i)-v\,(c_k;u_j)\big)^2}{\sigma^2} \bigg) = \exp \Big( -\frac{\Delta v^2}{\sigma^2} \Big) . Here I defined \Delta v \equiv v\,(c_k;u_i)-v\,(c_k;u_j) .
Single-similarity function candidates. (Setting $a^2=1$, $\sigma^2=2$)
댓글 위젯(?)같은 경우, 혹은 자신의 보관함에서 자신과 비슷한 사람들의 의견을 보여주기도 하고, 정 반대 사람들의 의견을 보여주기도 하는 등. 자신의 댓글이 더 잘 공감받고 전달되고 소통되도록. 댓글에 대한 평가는 아주 간단하게 3점? 5점? 정도로 적게? 의견에 동의, 반대 개념으로 평가되게. Similarity에도 영향을 줄까? Random selecting 해서 비교 올리는 작업도 이걸 참조해서 하면 좋을듯. 내가 지금 평가한 content에서 최근 평가한 사람들을 추려내서 나와의 sim을 계산해서 나의 neighbor를 update 하는 식.
데이터가 무지막지하게 많아지면 모두와 나의 sim을 계산할수는 없음. 사용자의 컴퓨팅 리소스를 사용한다고 할지라도 이건 무리. 수억명과 매번 비교하고 업데이트 할수는 없을테니. 따라서 일부를 랜덤 픽 하고 sim 계산하고 해야함. 랜덤픽을 어떤 방식으로 할 것인가가 추천 정확도를 올리는데 중요할듯. 어뷰징에 내성이 강하게 설계하는 것도 중요할테고.

Similarity in Specific Category

심 계산식은 어떻게 할까나? 카테고리별로 심이 계산되어야 하겠고. 심 리스트를 사용자 데이터베이스에 저장해놔야 계산이 빨라짐. 디폴트 카테고리로만 우선 심들 계산? 아니면 내가 나눈 카테고리별로? 내가 평가 안한 컨텐츠들에 대한 예상 평점 및 에러정도를 보여주자. 가중치를 둔 평균, 분산을 계산.
정리함에 넣어놓은, 평가한 뉴스가 오보였을 경우 알려주기.
자신의 계정으로 댓글, 평가을 쓰되 익명기능이 가능하도록. 인캡슐레이션 및 암호화로 남들이 쉽게 개인 데이터를 못 뽑아내도록 보안에도 신경써야 할듯.

보통 평가를 하지 않는 이유는 평가를 해봤자 나에게 돌아오는게 별로 없기 때문. "수백명 평가중에 나하나 없다고 뭐 평가가 달라지겠어? 귀찮어. 이거 맘에 안드네 뒤로가기." 등으로 이어지는 행동패턴들 때문일듯. 나에게 오는 incentive가 확실해야 평가를 할텐데, 개인화 된 추천의 경우 "나에게 더 맞는 추천이 올 수 있다.", "나랑 비슷한 사람들에게 내가 처음으로 추천을 해줄 수 있다." 등이 인센티브가 될듯. 따라서 이런 효과들을 사용자에게 잘 보여주는것, 행동을 유도하는 것도 필요. "평가가 별로 없어서 정확하지 않을 수 있습니다.", "당신의 평가 및 댓글이 몇명의 사용자에게 보여졌습니다. 그리고 그 중 몇명이 링크를 클릭해서 해당 컨텐츠를 즐겼습니다." 등

"완전 공감한다"는 코멘트와 함께 7점을 줄 경우도 있고, "이 제품 너무 좋다"란 코멘트와 함께 7점을 줄 경우도, "너무 잘 설명해놨다"란 코멘트와 함께 7점인 경우도 있을것이다. 선택지를 고르게 하는것도 좋겠지만, 이건 사용자에게 두번, 세번의 클릭을 요구하는 일이다. 사용자는 귀찮으면 얻는게 그 배 이상 없는한 안쓴다. 되도록이면 클릭수가 줄어야 한다.

내용이 너무 전문적이라 5점 정도만, 비슷한 내용이지만 쉽게 쓴 글이 있으면 7점 줄듯.

How to update Similarity?

내가 새로운 content $c_k$ 를 평가한다. => $c_k$ 를 최근에 평가한 다른 user들 list 를 가져와서 내 neighbors 를 update.
\alpha \cdots

More weight on Recent evaluations, or equivalantly Less weight on Old evaluations

Self-customized List Box

기본적으로는 핫이슈인것들. 평가가 많은 것, 높은 것, 최근 것들을 보여줄 필요도 있어보임. 분포도랑. 5점 만점이라면 점수=-2점 해서 쭉 더한 총합이 높은것들이 베오베인 식임. 어뷰징 걸러내는거 잊으면 안되고. 사용자가 판단이 안되도록 본인 점수는 항상 들어가긴 하도록.
사용자가 자신이 봇으로 여겨지고 있는지 사람으로 여겨지고 있는지는 모르게 하는게 좋을듯? 어뷰징 막는 측면에서도 그렇고, 실수로 일정기간 봇처리 되었어도 기분 안나쁘게. 실제 사람의 계정이면 악성유저가 아닌 이상 반드시 사람계정으로 인식되게 하는 시스템이 중요.

Blocking and Filtering the Abusing

특정 이익단체/집단이 평점을 조작할 가능성은 언제나 열려 있음. 개인화 된 추천이라 할지라도, 전체 평점 분포도 보이는 구조이고 대량으로 abusing이 들어오면 개인화 된 추천도 잘못 작동할 위험이 있음. 따라서 user가 실제 사용자인지, 특정 단체가 만든 bot인지, 한 개인이 여러개의 id를 만들어서 활동하는 것인지, 일정기간만 대충 활동하다가 사라진 비활성 계정인지 등을 가려내서 처리해주는 것이 필요함. user별로 몇단계 등급 (미확인, bot 의심계정, 실제 사용자) 정도로 나눠서 평점에 영향을 끼치는 정도를 나눠서 보여주는 것도 괜찮을듯. StackOverflow나 ilwar, 카페 같은 곳은 어느정도 활동이 있어야 투표를 할 수 있다던지 글을 쓸 수 있다던지, reputation 점수를 쌓을 수 있다던지 하는 방식으로 하는거 같은데 이런건 초기 유입을 막고, 새로운 유입도 막는 등 단점도 많아 보임.
즉, 평점 분포도를 보여줄 때 미확인 계정, bot 의심계정의 평점들은 따로 빼서 실제 사용자로 보이는 계정들이 매긴 평점들의 분포도를 보여주는 식으로 abusing에 대한 대응을 할수 있을듯. Server에 꽤 부담을 주는 방식 같기도 한데 (user의 등급이 바뀔때마다 이 user가 평가했던 것들에 대한 처리를 해줘야 하니), 이정도 투자는 해야 제대로 된 결과물을 얻을거 같은데... user가 자신의 등급을 볼 수 없게 해야할듯? 볼 수 있으면, bot 만드는 사람이 연구해서 bot이 실제 사용자처럼 연기하도록 만들기 쉬워질듯.
"어떻게 bot을 걸러낼까? 어떤 알고리즘을 짜야하나?"가 한가지 포인트이고, "걸러낸 뒤에는 어떻게 처리할 것인가?"가 두번째 포인트. 걸러내는 작업 자체가 100% 완벽할수는 없을테니 무작정 user를 차단하거나 몰아낼수는 없을듯.
역으로 bot을 이용해서 남들의 sim을 계산해 준다거나, 서비스에 필요한 각종 계산을 시킬수도 있을듯. user resource를 사용하기도 하지만, cloud computing이니 많을수록 좋긴함.

Merging multiple groups of evaluations which indicates the same content

같은 콘텐츠라고 할지라도 실수로 혹은 여러 이유로 인해 다른 content-id 에서 평가가 이루어 졌을 수 있다. 원본 링크로 평가가 이루어졌는데, 퍼온 곳의 링크로도 평가가 되는 경우가 대표적인 것일텐데, 다음의 경우도 그렇고 ㅍㅍㅅㅅ 같은 사이트들도 그렇고 원본을 자신들의 포멧에 맞게 재생산/재배포 하기 때문이다. 이 경우 두 군데에서 평가된 별점들을 merge 할 필요가 있다. Merge 처리 전에 양쪽에서 중복으로 평가를 한 사용자들도 있을 것이고. 이런 점들을 염두에 두고 설계를 해야할 것이다.

Less weight on old evaluations

시간에 따라서 평가가 달라지는 contents 들이 있다. 내용이 추가되고 수정되며 보강되면서 품질이 좋아지는 경우도 있고, 나중에 알고보니 잘못된 정보로 밝혀져서 초기에 좋게 평가되었던 것들이 이후 다시 저평가되는 경우도 많다. 따라서 이런 시간에 따른 평점변화, 평점통계를 처리해 주어야 사용자들에게 제대로 된 정보를 줄 수 있다.

Categorizing the contents (Default category, user's category, multiple categories)

기본적으로 유저를 귀찮게하면 안되니, default로 설정된 (나중에라도 category가 정해지면 업데이트) category로 정리를 해서 보여줌. 사용자보고 category를 고르라고 무리하게 요구하지 않음. 하지만 개인적으로 자신의 페이지를 정리하고 싶은 사람은 솔선해서 categorizing 할 것으로 예상됨. 이 때 한가지 contents가 여러 category에 들어갈수도 있을거임. 영화를 예로 들자면, "코믹영화"이면서 "누구 감독의 영화"이면서 "누구 배우가 나온 영화"일 것임. 어떤 글은 과학 관련이면서 경제 쪽에도 연관이 있을 수 있고, 정치적으로 엮여 있는 일들인 경우도 있음. 대표적인 category가 있긴 하겠지만, 사람마다 분류하는 방식마다 다르게 분류가 될텐데 사용자에게 이걸 선택할 자유를 주는 것이 좋아보임. 이런 선택 결과들에 따라 default category를 더 정확하게 update 할수도 있을테고. Multiple categories로 분류된 경우에는 어떻게 처리해줄지도/정리해줄지도 고민해봐야 함.
  • 뉴스
  • 과학
  • 음식 (Food)
  • 오락 (Entertainment)
    • TV
      • 드라마
      • 예능
    • 영화
    • 게임

Plug-in and Widget for Any sites

위에 이야기 했던 "DISQUS / Facebook Reply Plug-in"과 "Twitter / Facebook / Google+ / Pinterest Widget"처럼 사람들이 글을 올릴 때 바로 공유(?우리의 경우 채점/평가)가 in-site에서 되도록 만들어주는 것이 중요함. 누가 귀찮게 url 입력하고 평가하고 댓글달고 하겠음. 글 작성자가 우리 plug-in을 안 넣었을 경우에는 따로 누군가가 우리 사이트에서 url 입력하고 평가해서 우리 database에 올려줄수는 있겠지만, 기본적으로 in-site plug-in들이 있어야만 쉽게쉽게 data들이 쌓일 것임. 더 많이들 사용하게 될테고. (자신의 contents가 평가받는 것을 싫어하는 사람들도 있을테니, 평가가 이루어졌다는 메일이나 댓글을 해당 url 관리자에게 보내주고 원치 않을 경우 내려주겠다는 메세지를 보내줘야 할듯. 이런 시스템이 있어야 의도치않게 누군가를 상처주고 하는 일들을 미연에 방지할 수 있을듯.)
aaa

Databases and Tables

어떤 자료들을 저장해 놓아야 할까? 이걸 잘 디자인 해놔야 제대로 돌아갈듯. Resizable Hash Table로 구성할 것인지, Resizable Array Table로 구성할 것인지도 핵심이 될텐데, 이건 SQL 같은 상용 프로그램 쓰면 맘대로 건들지 못할듯도??? (공부해 봐야 함.) Indexing으로 hash table이 만들어져서 access가 빨라지게 만드는건가?
Content 중심으로 table을 짤까, User 중심으로 table을 짤까도 중요 포인트인데... 둘 다 있어서 잘 연결되게 해야할듯?
예제: http://kipid.tistory.com/category/0 즐겨찾는 사이트들 - kipid's blog 7/7

How to Operate?

어떤식으로 동작하게 할지, 사용하게 될지를 미리 고민하고 세부사항을 고민해야 할듯? 큰 틀에서만 우선 정하고, 나중에도 고치기 쉽게 디자인한 후 우선 만들어야 할듯?

References and Related Articles

    Introducing

  1. Coursera – Introducing to Recommender System (Video Lectures), 2013, by Joseph A Konstan and Michael D Ekstrand (University of Minnesota).; 추천 시스템에 관한 online 강의.
  2. Ummae's blog - 국내에도 개인화 추천 서비스가 계속 나올까?, 2013-04-28; and Ummae's blog - Coursera - Introducing to Recommender System 시작, 2013-09-08; 개인화 추천에 관한 이야기.
  3. 스웨터's blog - 2008 추천시스템 연구동향, 2013-10-30, by 스웨터
  4. kth 개발자 블로그 - 추천 시스템 분석 – 어떻게 아마존과 넷플릭스가 당신의 취향을 예상하는가?, 2013-01-23, by 김정민; 원문: Deconstructing Recommender Systems - How Amazon and Netflix predict your preferences and prod you to purchase, 2012-09-24, by Joseph A. Konstan and John Riedl (미네소타 대학에서 컴퓨터 과학을 가르치치고 있으며 IEEE 에서 Senior Member와 Fellow로 활동중이다.)
  5. International Joint Conference on Artificial Intelligence - Tutorial: Recommender Systems, 2011-07-17, by Dietmar Jannach and Gerhard Friedrich; 추천 시스템에 관한 tutorial powerpoint. 2013년 것도 있는듯.
  6. Book - Recommender Systems An Introduction, 2011, by Dietmar Jannach, Markus Zanker, Alexander Felfernig, Gerhard Friedrich;
  7. Examples of Personalized Recommendation

  8. Ex: 왓챠(Watcha) (개개인 맞춤형 영화 추천 서비스); Netflix (영화 streaming service 같은데 국내에서는 아직 서비스 안하는듯. 본 영화 및 준 평점에 따라 개인화 된 추천을 해주는듯.); Google and Youtube (검색 history 등을 분석해서 개인화 된 광고를 쏘는듯 함.); Amazon.com (구매내역이나 평가에 따라 맞춤형 제품추천.)
  9. Related Papers

  10. IBM developer Works - Recommender systems, Part 1: Introduction to approaches and algorithms (Learn about the concepts that underlie web recommendation engines.), and Part 2: Introducing open source engines (Explore software for building a recommendation capability.), 2013-12-12, by M. Tim Jones;
  11. Incentive Based Ranking Mechanisms, 201?, by Rajat Bhattacharjee and Ashish Goel;
  12. Yahoo! Labs - A Game-Theoretic Analysis of Rank-Order Mechanisms for User-Generated Content, 2011-06, by Arpita Ghosh, and Patrick Hummel (Yahoo! Research); 인터넷 찾아보면 pdf 있음.
  13. Personalized Recommendation on Dynamic Content Using Predictive Bilinear Models, 2009-04, Wei Chu (Yahoo! Labs.) and Seung-Taek Park (Yahoo! Labs.)
  14. IW3C2 - Local Collaborative Ranking, 2014-04, by Joonseok Lee, Samy Bengio, Seungyeon Kim, Guy Lebanon, Yoram Singer
  15. Related Techs

  16. Outsider's Dev Story - 크롬 개발자도구의 콘솔을 차단하는 방법, 2014-02-14; 보안에 관련된 부분. Javascript로 돌리거나 개인정보에 관한 데이터가 오갈때 보호를 해야할텐데, 어떤 방식으로 해야할까나?
728x90
반응형