-

영화 추천 시스템 만들기

건휘맨 2024. 5. 27. 17:55

데이터프레임을 불러오고 필요없는 컬럼을 제거하고 합쳐준다.

import pandas as pd
import numpy as np

movie_df = pd.read_csv('Movie_Id_Titles.csv')

review_df = pd.read_csv('user_rating.csv')

df = pd.merge(movie_df, review_df, on='item_id', how='left')

 

각 영화별로 별점에 대한 기본 통계치 확인

df.groupby('movieId')['rating'].describe()

df.corr(numeric_only=True)

 

영화 제목이 컬럼 부분에 위치해야 상관계수를 뽑을 수 있다.
영화 제목은 컬럼으로, 유저아이디는 인덱스로, 유저가 준 별점은 데이터로
들어가도록 데이터프레임을 가공해야 한다.

df = df.pivot_table(index='user_id', columns='title', values='rating')

corr_movie = df.corr(min_periods=50)

my_review = review_df.loc[review_df['user_id'] == 0, ]

my_review = pd.merge(my_review, movie_df, on='item_id')[['title', 'rating']]

title = my_review['title'][0]

recom_movie = corr_movie[title].dropna().sort_values(ascending=False).to_frame()

recom_movie.columns = ['correlation']

recom_movie['weight'] = recom_movie['correlation'] * my_review['rating'][0]

 


비어있는 빈 데이터프레임을 만들고
내가 본 영화의 가중치까지 계산해서 추천 영화를 뽑고
이 추천 영화들을 위의 빈 데이터프레임에 추가하면 된다.
모두 추가한 후 정렬, 중복영화 제거하고, 이미 본 영화도 제거하면 된다.

movie_list = pd.DataFrame()

for i in range(my_review.shape[0]):
  title = my_review['title'][i]
  recom_movie = corr_movie[title].dropna().sort_values(ascending=False).to_frame()
  recom_movie.columns=['correlation']
  recom_movie['weight'] = recom_movie['correlation'] * my_review['rating'][i]
  movie_list = pd.concat([movie_list, recom_movie])

# weight 컬럼으로 정렬
movie_list.sort_values(by='weight', ascending=False, inplace=True)

# 내가 이미 본 영화는 추천에서 제외한다.
for title in my_review['title']:
  if title in movie_list.index:
    movie_list.drop(title, axis=0, inplace=True)

# 중복된 영화는 weight 의 최대값으로 계산해서 중복 제거
movie_list.groupby('title')['weight'].max().sort_values(ascending=False).head(5)

 

'-' 카테고리의 다른 글

Firebase 채팅 기능 구현  (1) 2024.06.21