steam_filter / app.py
HellSank's picture
Upload 2 files
6d746e7
import gradio as gr
import pandas as pd
from fastai.tabular.all import *
from fastai.layers import Module, Embedding, sigmoid_range
import torch
import torch.nn.functional as F
class DotProductBias(Module):
def __init__(self, n_users, n_games, n_factors, y_range=(0.1, 11754.0)):
self.user_factors = Embedding(n_users, n_factors)
self.user_bias = Embedding(n_users, 1)
self.game_factors = Embedding(n_games, n_factors)
self.game_bias = Embedding(n_games, 1)
self.y_range = y_range
def forward(self, x):
users = self.user_factors(x[:, 0])
games = self.game_factors(x[:, 1])
res = (users * games).sum(dim=1, keepdim=True)
res += self.user_bias(x[:, 0]) + self.game_bias(x[:, 1])
return torch.sigmoid(res) * (self.y_range[1] - self.y_range[0]) + self.y_range[0]
df = pd.read_csv('original.csv')
path = Path("./model.pkl")
learn = load_learner(path, 'model.pkl')
examples = list(df['user-id'].unique())[:20]
all_games_title = list(df['game-title'].unique())
def predict(user_id):
user_id = int(user_id)
games_alredy_played = list(df[(df['user-id'] == user_id)]['game-title'].unique())
games_not_played = set(all_games_title) - set(games_alredy_played)
size_games_not_played = len(games_not_played)
data = {
'user-id': [user_id]* size_games_not_played,
'game-title': list(games_not_played),
'time-played': [0]* size_games_not_played
}
new_df = pd.DataFrame(data)
new_dl = learn.dls.test_dl(new_df)
predictions = learn.get_preds(dl=new_dl)
predicted_time_played = predictions[0].squeeze().tolist()
new_df['time-played'] = predicted_time_played
recomendations = new_df.sort_values(by='time-played', ascending=False).head(10)['game-title'].tolist()
st = [r + '\n' for r in recomendations]
ans = ''.join(st)
return ans
gr.Interface(
fn=predict,
inputs="text",
outputs="text",
examples=examples
).launch(share=False)