Spaces:
Runtime error
Runtime error
| import numpy as np | |
| import torch | |
| import torch.nn as nn | |
| import torch.nn.functional as F | |
| import random | |
| from tqdm import tqdm | |
| import pandas as pd | |
| from torch_geometric.datasets import AmazonBook, MovieLens100K, MovieLens1M | |
| from torch_geometric.nn import GCNConv, LGConv | |
| from torch_geometric.utils import degree | |
| from torch_geometric.nn.conv import MessagePassing | |
| from torch_geometric.data import HeteroData, Data | |
| import torch_geometric.transforms as T | |
| def predict(model, device, data, num_users, num_items, user_id, train_edge_label_index, k=5): | |
| with torch.no_grad(): | |
| ## ML100k | |
| interaction_dataframe = pd.read_csv('./u1.base', delim_whitespace=True, header=None) | |
| meta_dataframe = pd.read_csv('./u.item', sep='|', encoding='latin-1', header=None) | |
| interaction_dataframe = interaction_dataframe[[0, 1]] | |
| interaction_dataframe.columns = ['reviewerID', 'asin'] | |
| meta_dataframe = meta_dataframe[[0, 1]] | |
| meta_dataframe.columns = ['asin', 'title'] | |
| out = model.get_embedding(data.edge_index) | |
| user_emb, item_emb = out[:num_users], out[num_users:] | |
| logits = user_emb @ item_emb.t() | |
| logits = torch.nn.Sigmoid()(logits) | |
| logits[train_edge_label_index[0], train_edge_label_index[1]-num_users] = float('-inf') | |
| # Create unique users to find the index of it in embedding table | |
| unique_users = interaction_dataframe['reviewerID'].unique().tolist() | |
| unique_items = interaction_dataframe['asin'].unique().tolist() | |
| random_row = random.randint(0, len(interaction_dataframe)) | |
| user_to_rec = interaction_dataframe.iloc[random_row]['reviewerID'] | |
| user_to_rec = user_id | |
| #user_to_rec = 923 | |
| user_rates = logits[unique_users.index(user_to_rec)] | |
| # print(f"ID of user we want to recommend to: {user_to_rec}") | |
| ground_truth_asins = interaction_dataframe[interaction_dataframe['reviewerID'] == user_to_rec]['asin'].to_list() | |
| ground_truth_items = meta_dataframe[meta_dataframe['asin'].isin(ground_truth_asins)].head(5) | |
| # print(f"Ground truth items: {ground_truth_items['title'].values.tolist()}") | |
| _, top_ratings = torch.topk(user_rates, k) | |
| recommended_items = [] | |
| for index in top_ratings: | |
| asin_of_item = unique_items[index] | |
| recommended_item = meta_dataframe[meta_dataframe['asin'] == asin_of_item]['title'].values | |
| recommended_items.append(recommended_item.item()) | |
| return ground_truth_items, recommended_items | |