|
_C='rating' |
|
_B='userId' |
|
_A='movieId' |
|
import gradio as gr,numpy as np,pandas as pd |
|
from scipy.sparse import csr_matrix |
|
from sklearn.neighbors import NearestNeighbors |
|
def create_matrix(df):A=df;B=len(A[_B].unique());C=len(A[_A].unique());D=dict(zip(np.unique(A[_B]),list(range(B))));E=dict(zip(np.unique(A[_A]),list(range(C))));F=dict(zip(list(range(B)),np.unique(A[_B])));G=dict(zip(list(range(C)),np.unique(A[_A])));H=[D[A]for A in A[_B]];I=[E[A]for A in A[_A]];J=csr_matrix((A[_C],(I,H)),shape=(C,B));return J,D,E,F,G |
|
def find_similar_movies(movie_id,X,k,metric='cosine',show_distance=False): |
|
A=[];D=movie_mapper[movie_id];B=X[D];k+=1;C=NearestNeighbors(n_neighbors=k,algorithm='brute',metric=metric);C.fit(X);B=B.reshape(1,-1);E=C.kneighbors(B,return_distance=show_distance) |
|
for F in range(0,k):G=E.item(F);A.append(movie_inv_mapper[G]) |
|
A.pop(0);return A |
|
def recommend_movies(movie_name): |
|
A=[A for(A,B)in movie_titles.items()if movie_name.lower()in B.lower()] |
|
if len(A)==0:return'Movie not found. Please check the spelling and try again' |
|
A=A[0];B=find_similar_movies(A,X,k=10);C='\n'.join([movie_titles[A]for A in B]);return C |
|
ratings=pd.read_csv('ratings.csv') |
|
movies=pd.read_csv('movies.csv') |
|
n_ratings=len(ratings) |
|
n_movies=len(ratings[_A].unique()) |
|
n_users=len(ratings[_B].unique()) |
|
user_freq=ratings[[_B,_A]].groupby(_B).count().reset_index() |
|
user_freq.columns=[_B,'n_ratings'] |
|
mean_rating=ratings.groupby(_A)[[_C]].mean() |
|
lowest_rated=mean_rating[_C].idxmin() |
|
highest_rated=mean_rating[_C].idxmax() |
|
movie_stats=ratings.groupby(_A)[[_C]].agg(['count','mean']) |
|
movie_stats.columns=movie_stats.columns.droplevel() |
|
X,user_mapper,movie_mapper,user_inv_mapper,movie_inv_mapper=create_matrix(ratings) |
|
movie_titles=dict(zip(movies[_A],movies['title'])) |
|
movie_name=gr.inputs.Textbox(label='Movie Name') |
|
outputs=gr.outputs.Textbox(label='Recommended Movies',type='text') |
|
iface=gr.Interface(fn=recommend_movies,inputs=movie_name,outputs=outputs,theme=gr.themes.Default(primary_hue='slate')) |
|
iface.launch() |