ayoni02
Added docstrigs
eb88a98
raw
history blame
2.18 kB
import gradio as gr
import random
import pandas as pd
import operator
from surprise import Dataset, Reader
from surprise import KNNBasic
def opendata(a, nrows):
"""
opens the data and returns a dataframe
"""
df = pd.read_csv(a, nrows=nrows, sep=';', encoding='ISO-8859-1')
return df
def red(df):
"""
Builds the trainset and the anti testset,
Returns the trainset and the anti testset as items
"""
reader = Reader(rating_scale=(1,10)) # rating scale range
trainset = Dataset.load_from_df(df[['User-ID','ISBN','Book-Rating']],reader).build_full_trainset()
items = trainset.build_anti_testset()
return trainset, items
def mod(df, user, items):
"""
Builds the model using KNNBasic,
Fits the model to the trainset,
Takes the given user and creates a recommendation for them based on the model
returns the recommendations
"""
algo = KNNBasic()
algo.fit(df)
user_items = list(filter(lambda x: x[0] == user, items))
recommendations = algo.test(user_items)
recommendations.sort(key=operator.itemgetter(3), reverse=True)
return recommendations
def gl(num):
"""
Opens the 2 datasets
Creates a mapping dictionary for the ISBN and Book-Title,
Creates a list of users and accepts a user input,
Builds the model and returns the top 5 recommendations for the user
"""
data = opendata('BX-Book-Ratings.csv', nrows=20_000)
books = opendata('BX_Books.csv', nrows=None)
mapping_dict = books.set_index("ISBN")["Book-Title"].to_dict()
users=data['User-ID'].tolist()
trainset, items = red(data)
user = users[int(num)]
recommendations = mod(trainset, user, items)
op = []
for r in recommendations[0:5]:
try:
op.append(f"{mapping_dict[r[1]]} with Estimated Rating {round(r[3],3)}")
except:
continue
return ('\n\n'.join(map(str, op)))
text = gr.components.Number(label="pick a number between 1 and 1000")
label = gr.components.Text(label="Picked User Top 5 Recommendations:")
example = [2, 3]
intf = gr.Interface(fn=gl, inputs=text, outputs=label, examples=example)
intf.launch(inline=False)