본문 바로가기
Recommendation system

콘텐츠 기반 필터링

by Nowkeeh Ahc

콘텐츠 기반 필터링(Content-Based Fitering)

아이템의 특성을 분석하여, 해당 특성과 유사한 다른 아이템을 추천하는 방식이다. 이 방식은 사용자가 과거에 선호한 아이템과 유사한 아이템을 추천해주는데, 선호하는 아이템의 특성이 유사한 아이템이기 때문이다.

콘텐츠 기반 필터링의 구현 과정은 다음과 같다.

  1. 데이터 전처리: 아이템 정보를 수집하고, 아이템의 특성 정보를 추출한다.
  2. 아이템 특성 벡터 생성: 추출한 아이템의 특성 정보를 기반으로, 아이템 특성 벡터를 생성
  3. 아이템 간 유사도 측정: 생성된 아이템 특성 벡터를 이용하여, 아이템 간 유사도를 측정
  4. 유사도가 높은 아이템 추천: 유사도가 높은 아이템을 추천한다.
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)' 등이 추천되었다.

 

이와 같이 콘텐츠 기반 필터링은 아이템의 특성 정보를 기반으로 유사도를 측정하여 추천하는 방식이다. 특히, 위 예제에서는 장르 정보를 이용하여 영화를 추천했지만, 다양한 아이템의 특성 정보를 이용하여 적용 가능하다.

댓글