본문 바로가기
추천시스템

콘텐츠 기반 필터링 추천 예제

by 볼록티 2020. 1. 14.
728x90
반응형

 추천시스템을 구축하기 위해서 사용하는 필터링 방법중에 하나인 콘텐츠 기반 필터링을 작은 예제를 통해서 기본적인 구현 방법을 예제를 통해 실습해본다. reference에 나와있는 예제 데이터를 참고 하였으며, 추천이 이루어지는 과정을 한번 살펴본다.

 

 콘텐츠 기반 필터링에 사용될 데이터는 우선 이름에 나와있는 것 처럼 콘텐츠가 필요하다. 이 예제는 영화와 관련된 예제이다. 사용할 아이템 콘텐츠 데이터는 영화가 어떤 장르를 포함하고 있는지를 나타내주는 데이터이다. 또 사용할 데이터인 사용자 프로필 데이터는 사용자가 봤던 영화인지 아닌지를 나타내는 데이터이다. 사용자 프로필 데이터는 협업필터링과 다르게 예컨데 특정 사이트에서 돌아다니기만해도 그정보를 콘텐츠와 연결시켜서 추천을 해줄 수가 있다. 

 

기존의 콘텐츠(장르)를 나타내주는 데이터 셋이다. tf-idf 가중치 행렬은 굳이 계산하지 않고, 값을 입력할 것이다.

 

items=np.array([[1.098,0,0,0,0,0,00.693,0],
         [0,1.098,0,0,0,0,0.6933,0],
         [0,1.098,1.791,0,0,0,0,0],
         [0,0,0,1.791,0,0,0.693,0],
         [0,0,0,0,1.791,0,0,1.791],
         [1.098,0,0,0,0,1.791,0,0]])
         
pd.DataFrame(items, columns=['로맨스','스릴러','액션','공상과학','미스터리','코미디','판타지','범죄'], index=['A','B','C','D','E','F'])

위의 입력 값은 이미 tf-idf 값 임을 참고하자(tf-idf에 대한 설명은 생략.). 즉, 아래의 데이터 프레임은 영화 A ~ F 까지 장르가 포함되어 있는 빈도를 tf-idf 가중치를 주어 단순 이진 값이 아닌 tf-idf 값으로 매겨진 것이다.

 

 

users=np.array([[1,1,0,1,1,0],
               [0,1,1,1,1,0],
               [1,1,1,1,1,1],
               [1,1,1,1,1,1],
               [1,1,1,1,1,0],
               [1,1,1,1,1,1]])
pd.DataFrame(users, columns=['Claudia','Gene','Jack','Lisa','Mick','Toby'],index=['A','B','C','D','E','F'])

아래의 데이터 프레임은 컬럼명에는 사용자 이름이 나와 있으며 각 영화 A ~ F 까지 클릭을 통한 조회를 해보았는지에 대한 내용이다. 여기서도 알 수 있듯이 CF 기법에 사용되는 사용자평점 데이터와는 달리 사용자가 컨텐츠를 경험하기 전에 얻을 수 있는 데이터이다. 사용자 데이터는 명시적(explicit) 또는 암시적(implicit)인 데이터로 나뉘는데, 명시적 데이터(평점! 좋아요! 구독! 알람설정!)는 사용자의 선호에 대한 물음의 대답으로 생각할 수 있으며, 암시적 데이터는 주로 사용자의 행동(조회, 영상시청 시간, 클릭수, 구매 기록,등급 기록)으로 생각하면 된다. 이 예제에서 사용한 데이터는 암시적 데이터라고 할 수 있다.

사용자의 조회 기록을 보여주는 데이터를 활용해서 사용자의 영화 선호도를 알 수 있다. 왜냐하면 조회 해본 영화는 각 각 장르라는 콘텐츠를 포함하고 있어 사용자 선호도에 영향을 끼치게 할 수 있기 때문이다.

 그렇기 때문에 영화에 대한 사용자 선호도 행렬을 만들어 본다. 이는 제일 위에 있는 콘텐츠에 대한 TF-IDF행렬 데이터 셋과 바로 위의 데이터셋과의 내적을 통해서 구하게 된다.

pd.DataFrame(np.dot(users.T,items), columns=['로맨스','스릴러','액션','공상과학','미스터리','코미디','판타지','범죄'], index=['Claudia','Gene','Jack','Lisa','Mick','Toby'])

다음의 결과는 사용자 프로필 행렬을 구한 것이다.

 

사용자 프로필 행렬과 맨 위의 아이템 프로필 행렬(tf-idf행렬) 사이의 코사인 유사도 행렬을 생성한다. sklearn패키지의 cosine_similarity 함수를 사용할 때는 두 행렬의 열의 개수를 맞춰주면 된다. 일반 행렬 곱처럼 앞 행렬의 열의 개수와 뒷 행렬의 행의 개수를 맞춰주는게 아니다. 

 

from sklearn.metrics.pairwise import cosine_similarity
pd.DataFrame(sklearn.metrics.pairwise.cosine_similarity(users_pref, items), columns=['A','B','C','D','E','F'], index=['Claudia','Gene','Jack','Lisa','Mick','Toby'])

결과가 나왔다. A ~ F 영화별로 사용자와의 유사도가 구해져서 이 유사도를 참고로 하여 사용자에게 영화를 추천해줄 수 있다. 지금까지 아주 기본적인 예제를 통해서 콘텐츠 기반 필터링을 활용한 추천시스템을 만들어 보았다.

 

 

 

 

 

 

 

reference: Building recommendation engines. Suresh K. Gorakala

 

728x90
반응형

댓글