콘텐츠 기반 필터링(Content-Based Fitering)
아이템의 특성을 분석하여, 해당 특성과 유사한 다른 아이템을 추천하는 방식이다. 이 방식은 사용자가 과거에 선호한 아이템과 유사한 아이템을 추천해주는데, 선호하는 아이템의 특성이 유사한 아이템이기 때문이다.
콘텐츠 기반 필터링의 구현 과정은 다음과 같다.
- 데이터 전처리: 아이템 정보를 수집하고, 아이템의 특성 정보를 추출한다.
- 아이템 특성 벡터 생성: 추출한 아이템의 특성 정보를 기반으로, 아이템 특성 벡터를 생성
- 아이템 간 유사도 측정: 생성된 아이템 특성 벡터를 이용하여, 아이템 간 유사도를 측정
- 유사도가 높은 아이템 추천: 유사도가 높은 아이템을 추천한다.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
# 데이터 로드
movies = pd.read_csv('movies.csv')
ratings = pd.read_csv('ratings.csv')
# TF-IDF 벡터화
tfidf = TfidfVectorizer(stop_words='english')
movies['genres'] = movies['genres'].fillna('')
tfidf_matrix = tfidf.fit_transform(movies['genres'])
# 코사인 유사도 계산
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
# 추천 함수 정의
def get_recommendations(title, cosine_sim=cosine_sim, movies=movies):
# 입력 영화의 인덱스 가져오기
idx = movies.loc[movies['title'] == title].index[0]
# 모든 영화에 대한 유사도 가져오기
sim_scores = list(enumerate(cosine_sim[idx]))
# 유사도에 따라 영화 정렬
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# 가장 유사한 10개의 영화 가져오기
sim_scores = sim_scores[1:11]
movie_indices = [i[0] for i in sim_scores]
return movies['title'].iloc[movie_indices]
# 추천 함수 사용 예시
get_recommendations('Toy Story (1995)')
TF-IDF(Term Frequency-Inverse Document Frequency) 벡터화를 사용하여 각 영화의 장르 정보를 벡터 형태로 변환하고, 그 벡터들 간의 코사인 유사도를 계산하여 유사도 행렬을 만들었다. 그리고, get_recommendations 함수를 정의하여 입력한 영화의 제목을 기반으로 해당 영화와 가장 유사한 10개의 영화를 추천하는 기능을 구현했다.
예를 들어, 'Toy Story (1995)'를 입력하면 해당 영화와 가장 유사한 10개의 영화가 출력된다.
위 결과에서는 'Toy Story (1995)'와 유사한 영화로 'Heat (1995)', 'Four Rooms (1995)', 'Carrington (1995)' 등이 추천되었다.
이와 같이 콘텐츠 기반 필터링은 아이템의 특성 정보를 기반으로 유사도를 측정하여 추천하는 방식이다. 특히, 위 예제에서는 장르 정보를 이용하여 영화를 추천했지만, 다양한 아이템의 특성 정보를 이용하여 적용 가능하다.
댓글