Spaces:
Build error
Build error
| # -*- coding: utf-8 -*- | |
| """HS_Recomm_Metacritic_Gradio.ipynb | |
| Automatically generated by Colaboratory. | |
| Original file is located at | |
| https://colab.research.google.com/drive/1cIAUS8Z2U2DXPEVmRdou9mqI0vwNT0_0 | |
| """ | |
| import pandas as pd | |
| import numpy as np | |
| import scipy as sp | |
| from scipy import sparse | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| from fuzzywuzzy import fuzz | |
| import gradio as gr | |
| meta_df = pd.read_csv("Metacritic_Scores_File.csv", error_bad_lines=False, encoding='utf-8') | |
| meta_df = meta_df[['game', 'reviewer_ID', 'score']] | |
| df_game_names = pd.read_csv("Game_Titles_IDs.csv", error_bad_lines=False, encoding='utf-8') | |
| #We will create a pivot table of users as rows and games as columns. | |
| #The pivot table will help us make the calcuations of similarity between the reviewers. | |
| pivot = meta_df.pivot_table(index=['reviewer_ID'], columns=['game'], values='score') | |
| #Applying lambda function to multiple rows using Dataframe.apply() | |
| #(x-np.mean(x))/(np.max(x)-np.min(x)) = Formula | |
| pivot_n = pivot.apply(lambda x: (x-np.mean(x))/(np.max(x)-np.min(x)), axis=1) | |
| # step 2 - Fill NaNs with Zeros | |
| pivot_n.fillna(0, inplace=True) | |
| # step 3 - Transpose the pivot table | |
| pivot_n = pivot_n.T | |
| # step 4 - Locate the columns that are not zero (unrated) | |
| pivot_n = pivot_n.loc[:, (pivot_n != 0).any(axis=0)] | |
| # step 5 - Create a sparse matrix based on our pivot table | |
| piv_sparse = sp.sparse.csr_matrix(pivot_n.values) | |
| #Compute cosine similarity between samples in X and Y. | |
| game_similarity = cosine_similarity(piv_sparse) | |
| #Turn our similarity kernel matrix into a dataframe | |
| game_sim_df = pd.DataFrame(game_similarity, index = pivot_n.index, columns = pivot_n.index) | |
| # create a function to find the closest title | |
| def matching_score(a,b): | |
| #fuzz.ratio(a,b) calculates the Levenshtein Distance between a and b, and returns the score for the distance | |
| return fuzz.ratio(a,b) | |
| # exactly the same, the score becomes 100 | |
| # a function to convert index to title | |
| def get_title_from_index(index): | |
| return df_game_names.iloc[index]['game'] | |
| # a function to return the most similar title to the words a user type | |
| def find_closest_title(title): | |
| #matching_score(a,b) > a is the current row, b is the title we're trying to match | |
| leven_scores = list(enumerate(df_game_names['game'].apply(matching_score, b=title))) | |
| sorted_leven_scores = sorted(leven_scores, key=lambda x: x[1], reverse=True) | |
| closest_title = get_title_from_index(sorted_leven_scores[0][0]) | |
| distance_score = sorted_leven_scores[0][1] | |
| return closest_title, distance_score | |
| # Bejeweled Twist, 100 | |
| def game_recommendation(game): | |
| #Insert closest title here | |
| game, distance_score = find_closest_title(game) | |
| #Counter for Ranking | |
| number = 1 | |
| print('Recommended because you played {}:\n'.format(game)) | |
| for n in game_sim_df.sort_values(by = game, ascending = False).index[1:6]: | |
| print("#" + str(number) + ": " + n + ", " + str(round(game_sim_df[game][n]*100,2)) + "% " + "match") | |
| number +=1 | |
| recommender_interface = gr.Interface(game_recommendation, ["text"], | |
| ["text"], title="Top 5 Game Recommendations", description="This is a Recommendation Engine based on how Metacritic professional reviewers have scored games up to 2019 (apologies for the out of date data). Simply input a game you have enjoyed playing and it should return 5 games that have been rated similarily") | |
| recommender_interface.launch(debug=True) |