_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()