productizationlabs's picture
Upload app.py
b0cb0c6
raw
history blame contribute delete
No virus
2.05 kB
_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()