luismarques's picture
update app.py
5b66d45
import gradio as gr
import pandas as pd
from fastai.collab import *
from fastai.tabular.all import *
from fastai.learner import load_learner
anime = pd.read_csv("animes_name.csv")
users = pd.read_csv("users.csv")
users = users["user_id"].unique()
options = list(map(str, users.tolist()))
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 DotProductBias(Module):
def __init__(self, n_users, n_anime, n_factors, y_range=(0, 5.5)):
self.user_factors = create_params([n_users, n_factors])
self.user_bias = create_params([n_users])
self.book_factors = create_params([n_anime, n_factors])
self.book_bias = create_params([n_anime])
self.y_range = y_range
def forward(self, x):
users = self.user_factors[x[:, 0]]
anime = self.book_factors[x[:, 1]]
res = (users * anime).sum(dim=1)
res += self.user_bias[x[:, 0]] + self.book_bias[x[:, 1]]
return sigmoid_range(res, *self.y_range)
learn = load_learner("deep_model.pkl", cpu=True)
def get_user_preds(user_id):
rows = []
anime_name = list(anime.drop_duplicates(subset="name", keep="first").book)
for i in range(len(anime_name)):
rows.append(dict({"user": user_id, "name": anime_name[i]}))
data = pd.DataFrame(rows)
dl = learn.dls.test_dl(data)
preds, y = learn.get_preds(dl=dl)
preds_df = pd.DataFrame(
{"anime_name": anime_name, "prediction": preds.numpy().flatten()}
).sort_values("prediction", ascending=False)
best_5_arr = preds_df[:5]
formatted_parts = []
# Loop sobre as linhas ordenadas
for i, row in enumerate(best_5_arr.itertuples(), 1):
anime_name = getattr(row, "anime_name")
prediction = getattr(row, "prediction")
# Adiciona a parte formatada à lista
formatted_parts.append(f"{i}. {anime_name} - Prediction: {prediction}")
# Combina as partes formatadas em uma única string, separadas por vírgula e espaço
result_string = ", ".join(formatted_parts)
return result_string
iface = gr.Interface(
fn=get_user_preds,
title="Anime Recomendation",
allow_flagging="never",
inputs=[
gr.Dropdown(
choices=options,
label="user_id",
info="Escolha o usuário para o modelo fazer as melhores recomendações",
)
],
outputs="text",
)
iface.launch()