본문 바로가기
Programming_Collective Intelligence/2.추천시스템 만들기

항목추천/제품매칭

by 볼록티 2019. 12. 26.
728x90
반응형

1. 항목 추천

 

 *평론가보단 역시 영화 추천입니다. 나와 가장 유사한 취향을 가진 사람을 찾아서 그사람이 좋아하지만 내가 안 본 영화를 찾을 수 있다. 하지만 이건 너무 관대한 판단이다. 

 이런 방식으로는 내가 좋아할 만한 영화 중에서 몇몇을 리뷰하지 않은 평론가들이 우연히 나타날지도 모른다. 또한 topMatches로 리턴된 모든 평론가들에게 악평을 받은 영화를 유독 좋아하는 평론가를 알려줄 수도 있다.

 

 이런 논쟁을 해결하기위해 평론가 순위를 결정하는 가중점수를 만들고 항목점수를 계산해야한다. 모든 다른 평론가들의 평가를 계산한 후 나와의 유사도를 그들이 각 영화에 준 점수와 곱한다. 

 결과적으로 내가 평가하지 않은 영화들에 대한 추천을 받을 수 있다.

 

def getRecommendations(prefs, person, similarity=sim_pearson):
    totals={}
    simSums={}
    for other in prefs:
        #나와 나를 비교하지 말 것
        if other==person: continue
        sim=similarity(prefs,person,other)
        
        #0이하의 점수는 무시함
        if sim <= 0: continue
        for item in prefs[other]:
            
            #내가 보지 않은 영화
            if item not in prefs[person] or prefs[person][item]==0:
                #유사도 x 점수
                totals.setdefault(item,0)
                totals[item] += prefs[other][item]*sim
                #유사도 합계
                simSums.setdefault(item,0)
                simSums[item]+=sim
                
    #정규화된 목록 생성
    rankings = [(total/simSums[item],item) for item,total in totals.items()]
    
    #정렬된 목록 리턴
    rankings.sort()
    rankings.reverse()
    return rankings

 

아래 코드는 python3에서 모듈을 다시 불러오는 코드. 나는 rating.py로 저장하여 사용하고 있다. critics는 rating.py에 있는 계속 사용하고 있는 평가점수 딕셔너리 변수다.

import imp
imp.reload(rating)

함수실행결과출력

rating.getRecommendations(rating.critics, "Toby")

영화 순위 목록도 얻을 수 있지만 영화에 대한 자신의 평가 예측 점수도 얻을 수 있다. 내가 높은 점수를 줄 것으로 예측되는 영화를 추천 받은 것이다. 다른 유사도 지표들도 사용이 가능하지만 크게 달라지지는 않는다.

 

이것으로 어떤 종류의 제품이나 링크와도 동작하는 완전한 추천시스템 구축 방법에 대한 소개를 마친다. 사람, 항목, 점수 딕셔너리를 구축하면 모든게 끝!

 

 

728x90
반응형

댓글