File size: 2,335 Bytes
766b779
19e3424
 
766b779
61af90b
 
766b779
 
 
 
 
 
 
19e3424
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77fe8b3
 
766b779
3e8662d
766b779
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61af90b
 
abcfba5
61af90b
 
 
 
766b779
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import gradio as gr
from fastai.collab import *
from fastai.tabular.all import *
from fastai.learner import load_learner
import pandas as pd
import numpy as np

dados = pd.read_csv('valid.csv')
ids = dados['user'].unique()
ids_list = list(map(str, ids.tolist()))

ratings = pd.read_csv('ratings.csv')

class CollabNN(Module):
    def __init__(self, user_sz, item_sz, y_range=(0,5.5), n_act=100):
        self.user_factors = Embedding(*user_sz)
        self.item_factors = Embedding(*item_sz)
        self.layers = nn.Sequential(
            nn.Linear(user_sz[1]+item_sz[1], n_act),
            nn.ReLU(),
            nn.Linear(n_act, 1))
        self.y_range = y_range
        
    def forward(self, x):
        embs = self.user_factors(x[:,0]),self.item_factors(x[:,1])
        x = self.layers(torch.cat(embs, dim=1))
        return sigmoid_range(x, *self.y_range)

class DotProduct(Module):
    def __init__(self, n_users, n_books, n_factors, y_range=(0, 5.5)):
        self.user_factors = Embedding(n_users, n_factors)
        self.user_bias = Embedding(n_users, 1)
        self.books_factors = Embedding(n_books, n_factors)
        self.books_bias = Embedding(n_books, 1)
        self.y_range = y_range
    
    def forward(self, x):
        users = self.user_factors(x[:,0])
        books = self.books_factors(x[:,1])
        res = (users * books).sum(dim=1, keepdim=True)
        res += self.user_bias(x[:,0]) + self.books_bias(x[:,1])
        return sigmoid_range(res, *self.y_range)

learn = load_learner('model.pkl', cpu=True)

def top5(user):
    user = int(user)
    items = pd.Series(learn.dls.classes['title']).unique()
    
    clas_items = ratings.loc[(ratings['user'] == user) & (ratings['rating'] > 0), 'title']
    no_clas_items = np.setdiff1d(items, clas_items)

    df = pd.DataFrame({'user': [user]*len(no_clas_items), 'title': no_clas_items})
    
    preds,_ = learn.get_preds(dl=learn.dls.test_dl(df))
    
    df['prediction'] = preds.numpy()
    
    top_5 = df.nlargest(5, 'prediction')
    
    return '\n'.join(top_5['title'].tolist())

iface = gr.Interface(
    fn=top5, 
    inputs=gr.Dropdown(choices=ids_list), 
    outputs="text", 
    title="Books Recommendation",
    description="This model is responsible for a recommendation system involving books and their ratings.",
)

iface.launch(share=True)