지금까지 권장 엔진이 구현된 방식은 데이터 세트를 생성하기 위해 모든 사용자의 모든 순위를 사용해야 했다. 이것은 아마도 수천 명의 사람들 또는 물건들에는 잘 먹히겠지만 아마존과 같은 매우 큰 사이트는 수백만 명의 고객들과 제품들을 가지고 있다. 즉, 한 사용자를 다른 모든 사용자들과 비교한 다음 각 사용자가 평가한 모든 제품을 비교하는 것은 매우 느릴 수 있다. 또한 수백만 개의 제품을 판매하는 사이트는 사람들 사이에 거의 중복되지 않을 수 있어 어떤 사람이 비슷한지 결정하기가 어려울 수 있다.


지금까지 우리가 사용한 기법을 사용자 기반 협업 필터링이라고 한다. 대안은 항목 기반 공동 필터링으로 알려져 있다. 데이터 세트가 매우 큰 경우 항목 기반 공동 필터링은 더 나은 결과를 제공할 수 있으며, 권장 사항이 필요한 사용자가 더 빨리 얻을 수 있도록 미리 많은 계산을 수행할 수 있다.


품목 기반 필터링 절차는 우리가 이미 논의했던 것에 많은 영향을 미친다. 일반적인 기술은 각 항목에 대해 가장 유사한 항목을 사전 계산하는 것이다. 그런 다음 사용자에게 권장하고 싶을 때 그의 최고 등급 항목을 보고 가장 유사한 항목의 가중 목록을 생성하십시오. 여기서 중요한 차이점은 첫 번째 단계에서는 모든 데이터를 검토해야 하지만, 항목 간의 비교는 사용자 간의 비교만큼 자주 변하지 않는다는 것이다. 즉, 각 항목의 가장 유사한 항목을 지속적으로 계산할 필요가 없으며, 교통량이 적은 시간이나 주 응용 프로그램과 별개의 컴퓨터에서 계산할 수 있다.



항목 비교 데이터 세트 구축

항목을 비교하려면 유사한 항목의 전체 데이터 세트를 작성하는 기능을 가장 먼저 작성해야 한다. 다시 말해, 권장 사항이 필요할 때마다 이 작업을 수행할 필요는 없다. 대신 데이터 세트를 한 번 구축한 후 필요할 때마다 재사용하자.


데이터셋을 생성하기 위해서는 아래 기능을 recommendations.py에 추가해야 한다.


def calculateSimilarItems(prefs,n=10):

 # Create a dictionary of items showing which other items they

 # are most similar to.

 result={}

 # Invert the preference matrix to be item-centric

 itemPrefs=transformPrefs(prefs)

 c=0

 for item in itemPrefs:

 # Status updates for large datasets

 c+=1

 if c%100==0: print "%d / %d" % (c,len(itemPrefs))

 # Find the most similar items to this one

 scores=topMatches(itemPrefs,item,n=n,similarity=sim_distance)

 result[item]=scores

 return result


이 함수는 먼저 앞에서 정의한 transformPrefs 함수를 사용하여 점수 사전을 뒤집고, 각 사용자가 평가한 등급과 함께 항목 목록을 제공한다. 그런 다음 모든 항목을 루프하고 변환된 사전을 TopMatches 함수로 전달하여 유사성 점수와 함께 가장 유사한 항목을 얻는다. 마지막으로, 그것은 가장 유사한 항목의 목록과 함께 항목의 사전을 만들고 반환한다.


Python 세션에서 항목 유사성 데이터 세트를 구축하고 그 모양을 확인하십시오.


>>> reload(recommendations)

>>> itemsim=recommendations.calculateSimilarItems(recommendations.critics)

>>> itemsim

{'Lady in the Water': [(0.40000000000000002, 'You, Me and Dupree'),

 (0.2857142857142857, 'The Night Listener'),...

 'Snakes on a Plane': [(0.22222222222222221, 'Lady in the Water'),

 (0.18181818181818182, 'The Night Listener'),...

etc.


이 기능은 항목 유사성을 최신 상태로 유지할 수 있을 정도로만 자주 실행되어야 한다는 점을 기억하십시오. 사용자 기반과 등급 수가 적을 때는 초기에 더 자주 이 작업을 해야 하겠지만, 사용자 기반이 커질수록 항목 간의 유사성 점수는 보통 더 안정적이 될 것이다.



권장 사항 가져오기

이제 전체 데이터 세트를 거치지 않고도 항목 유사성 사전을 사용하여 권장 사항을 제공할 준비가 되셨습니다. 사용자가 순위를 매긴 모든 항목을 얻고, 유사한 항목을 찾아내고, 얼마나 비슷한지에 따라 가중치를 부여할 수 있다. 그 항목 사전은 유사점을 얻기 위해 쉽게 사용될 수 있다.


표 2-3은 항목 기반 접근법을 사용한 권고안을 찾는 과정을 보여준다. 표 2-2와는 달리, 비평가들은 전혀 관여하지 않고, 대신에 내가 평가한 영화와 내가 평가하지 않은 영화들의 격자가 있다.


각 행에는 내가 이미 본 영화가 있고, 그에 대한 나의 개인적인 평가도 있다. 내가 보지 못한 모든 영화에는, 내가 본 영화와 얼마나 비슷한지 보여주는 칼럼이 있다. 예를 들어, 슈퍼맨과 나이트 리스터의 유사점수는 0.103이다. R.x로 시작하는 기둥들은 내가 슈퍼맨 4.0을 평가했기 때문에 영화에 대한 나의 등급을 유사성으로 곱한 것을 보여준다. 슈퍼맨 행의 나이트 옆 값은 4.0 × 0.103 = 0.412이다.


총 행은 각 영화의 유사성 점수와 R.x 열의 합계를 보여준다. 각 영화의 내 등급을 예측하려면 R.x 열의 합계를 유사성 열의 합계로 나누면 된다. 야간 수신기에 대한 나의 예상 등급은 따라서 1.378/0.433 = 3.183이다.


recommendations.py에 아래 기능을 추가함으로써 이 기능을 사용할 수 있다.


def getRecommendedItems(prefs,itemMatch,user):

 userRatings=prefs[user]

 scores={}

 totalSim={}

 # Loop over items rated by this user

 for (item,rating) in userRatings.items( ):

 # Loop over items similar to this one

 for (similarity,item2) in itemMatch[item]:

 # Ignore if this user has already rated this item

 if item2 in userRatings: continue

 # Weighted sum of rating times similarity

 scores.setdefault(item2,0)

 scores[item2]+=similarity*rating

 # Sum of all the similarities

 totalSim.setdefault(item2,0)

 totalSim[item2]+=similarity

 # Divide each total score by total weighting to get an average

 rankings=[(score/totalSim[item],item) for item,score in scores.items( )]

 # Return the rankings from highest to lowest

 rankings.sort( )

 rankings.reverse( )

 return rankings


Toby에 대한 새로운 권장 사항을 얻으려면 이전에 구축한 유사성 데이터 집합을 사용하여 이 기능을 시도해 보자.


>> reload(recommendations)

>> recommendations.getRecommendedItems(recommendations.critics,itemsim,'Toby')

[(3.182, 'The Night Listener'),

 (2.598, 'Just My Luck'),

 (2.473, 'Lady in the Water')]


나이트 리스터는 여전히 상당한 차이로 1위를 차지하며, Just My Luck and Lady in the Water는 여전히 친하지만 장소를 바꾸었다. 더 중요한 것은 항목 유사성 데이터 집합이 미리 구축되었기 때문에 다른 모든 비평가들의 유사성 점수를 계산할 필요가 없었다는 점이다.

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기