등록 항목 

읽을 좋은 평론가를 찾는 것도 좋지만 내가 정말 원하는 것은 지금 당장 영화 추천이다. 나는 나와 가장 비슷한 취향을 가진 사람을 보고 아직 보지 못한 그가 좋아하는 영화를 찾을 수 있었지만, 그건 너무 관대할 것이다. 그런 접근은 내가 좋아하는 영화 몇 편을 검토하지 않은 평론가들을 우연히 떠오르게 할 수도 있다. 그것은 또한 이상하게도 다른 비평가들로부터 나쁜 평을 받은 영화를 좋아했던 평론가를 탑매치가 돌려줄 수도 있다. 


이러한 문제를 해결하려면 평론가 순위를 매기는 가중 점수를 산출하여 항목 점수를 매길 필요가 있다. 다른 모든 평론가들의 표를 얻어서 그들이 각 영화에 준 점수로 나와 얼마나 비슷한지 곱해 보아라. 표 2-2는 이 공정이 어떻게 작동하는지 보여준다.


이 표는 각 평론가들의 상관점수와 내가 평가하지 않은 세 편의 영화(야상 수상자, 물속의 아가씨, 그리고 단지 내 운)에 대한 등급을 보여준다. S.x로 시작하는 컬럼은 평점을 곱한 유사점을 주므로 나와 비슷한 사람이 나와 다른 사람보다 전체 점수에 더 기여하게 된다. 총 행은 이 모든 숫자의 합을 보여준다.


총계를 사용해서 순위를 계산할 수도 있지만, 더 많은 사람들이 검토한 영화가 큰 이점이 있을 것이다. 이를 바로잡기 위해서는 그 영화(심)를 검토한 평론가들의 모든 유사점을 합쳐서 나눌 필요가 있다. 표의 행 합계). 나이트 수신기는 모든 사람들에 의해 검토되었기 때문에, 그것의 총계는 모든 유사점들의 합으로 나누어져 있다. 그러나 물속의 아가씨는 푸그의 심사를 받지 않았기 때문에 영화의 점수는 다른 모든 유사점들의 합으로 나누어져 있다. 마지막 행은 이 중분류의 결과를 보여준다.


이에 대한 코드는 매우 간단하며, 유클리드 거리 또는 피어슨 상관 점수와 함께 작동한다. 


# Gets recommendations for a person by using a weighted average

# of every other user's rankings

def getRecommendations(prefs,person,similarity=sim_pearson):

 totals={}

 simSums={}

 for other in prefs:

 # don't compare me to myself

 if other==person: continue

 sim=similarity(prefs,person,other)

 # ignore scores of zero or lower

 if sim<=0: continue

 for item in prefs[other]:

 # only score movies I haven't seen yet

 if item not in prefs[person] or prefs[person][item]==0:

 # Similarity * Score

 totals.setdefault(item,0)

totals[item]+=prefs[other][item]*sim

 # Sum of similarities

 simSums.setdefault(item,0)

 simSums[item]+=sim

 # Create the normalized list

 rankings=[(total/simSums[item],item) for item,total in totals.items( )]

 # Return the sorted list

 rankings.sort( )

 rankings.reverse( )

 return rankings


이 코드는 프리fs 사전의 다른 모든 사람들을 통과한다. 각각의 경우에, 그것은 그들이 지정된 사람과 얼마나 비슷한지를 계산한다. 그런 다음 그들이 점수를 준 모든 항목을 순환한다. 뻔뻔스러움에 있는 라인 각 항목에 대해 어떻게 항목을 최종 점수는calculated?the 점수는 유사성에 의한과 이들 제품 모두 함께 추가됩니다 곱한 것을 보여 준다. 마지막에 각 점수를 유사도 합계로 나누어 평준화하여, 정렬된 결과를 반환한다.


이제 당신은 내가 다음에 어떤 영화를 봐야 하는지 알 수 있다.

>>> reload(recommendations)

>>> recommendations.getRecommendations(recommendations.critics,'Toby')

[(3.3477895267131013, 'The Night Listener'), (2.8325499182641614, 'Lady in the Water'), (2.5309807037655645, 'Just My Luck')]

>>> recommendations.getRecommendations(recommendations.critics,'Toby', ... similarity=recommendations.sim_distance)

[(3.5002478401415877, 'The Night Listener'), (2.7561242939959363, 'Lady in the Water'), (2.4619884860743739, 'Just My Luck')]


영화 순위를 매길 뿐만 아니라 각 영화마다 내 등급이 얼마일지 짐작이 간다. 이 보고서는 내가 영화를 보고 싶은지 아니면 내가 완전히 다른 것을 하고 싶은지 결정할 수 있게 해준다. 당신의 애플리케이션에 따라, 당신은 주어진 사용자의 기준에 맞는 것이 없다면 추천을 하지 않기로 결정할 수 있다. 결과는 유사성 측정 지표의 선택에 의해 매우 약간만 영향을 받는다는 것을 알게 될 것이다.


이제 모든 종류의 제품이나 링크와 호환되는 완벽한 추천 시스템을 구축하셨습니다. 사람, 항목, 점수 사전만 설정하면 되고, 이것을 이용해 아무나 추천할 수 있다. 이 장 뒷부분에서 당신은 어떻게 del.icio.us API를 사용하여 사람들에게 웹 사이트를 추천하기 위한 실제 데이터를 얻을 수 있는지 알게 될 것이다.


매칭 제품 

이제 당신은 비슷한 사람을 찾고, 주어진 사람에게 제품을 추천하는 방법을 알고 있지만, 어떤 제품이 서로 비슷한지 보고 싶다면? 여러분은 쇼핑 웹사이트에서, 특히 그 사이트가 여러분에 대한 많은 정보를 수집하지 않았을 때, 이것을 접했을지도 모른다. 아마존의 책 프로그래밍 파이썬을 위한 웹 페이지의 한 부분은 그림 2-4에 나와 있다.


이 경우, 당신은 누가 특정 항목을 좋아하는지 보고 그들이 좋아하는 다른 것을 보고 유사성을 판단할 수 있다. 우리 전에 사람뿐만과 항목들의 바꿀 필요가 있people?you 사이에는 유사성 결정하는 데 이것은 실제로 같은 수법이야. 만약 너의 사전이 변해 가는 따라서 여러분이 당신이 전에 썼다 동일한 메서드를 사용할 수 있다.


{'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5},

'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5}}

to:

{'Lady in the Water':{'Lisa Rose':2.5,'Gene Seymour':3.0},

'Snakes on a Plane':{'Lisa Rose':3.5,'Gene Seymour':3.5}} etc..

Add a function to recommendations.py to do this transformation:

def transformPrefs(prefs):

 result={}

 for person in prefs:

 for item in prefs[person]:

 result.setdefault(item,{})

 # Flip item and person

 result[item][person]=prefs[person][item]

 return result


그리고 이제 슈퍼맨 리턴스와 가장 비슷한 영화 세트를 찾기 위해 이전에 사용했던 TopMatchs 기능을 불러라.


>> reload(recommendations)

>> movies=recommendations.transformPrefs(recommendations.critics)

>> recommendations.topMatches(movies,'Superman Returns')

[(0.657, 'You, Me and Dupree'), (0.487, 'Lady in the Water'), (0.111, 'Snakes on a Plane'), (-0.179, 'The Night Listener'), (-0.422, 'Just My Luck')]


이 예에서는 실제로 마이너스 상관 점수가 있는데, 이는 슈퍼맨 리턴즈를 좋아하는 사람들이 그림 2-5와 같이 Just My Luck을 싫어하는 경향이 있음을 나타낸다.


상황을 더 왜곡하기 위해서, 여러분은 영화 평론가들을 추천 받을 수 있다. 초연에 누구를 초대할지 결정하려고 하는 건 아닐까?


>> recommendations.getRecommendations(movies,'Just My Luck')

[(4.0, 'Michael Phillips'), (3.0, 'Jack Matthews')]


사람과 아이템을 뒤집는 것이 유용한 결과를 가져올지는 항상 명확하지 않지만, 많은 경우에 그것은 여러분이 흥미로운 비교를 할 수 있게 해줄 것이다. 온라인 소매업자는 개인에게 제품을 추천할 목적으로 구매 이력을 수집할 수 있다. 당신이 여기서 한 것처럼, 사람들과 그 제품들을 뒤집는 것은, 그들이 특정 제품을 살 수 있는 사람들을 검색할 수 있게 해줄 것이다. 이것은 특정 품목의 대규모 공제를 위한 마케팅 노력을 계획하는 데 매우 유용할 수 있다. 또 다른 잠재적인 용도는 링크 추천 사이트의 새로운 링크를 즐길 가능성이 가장 높은 사람들이 볼 수 있도록 하는 것이다.

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