File size: 7,556 Bytes
5450dc1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5fd0bf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5450dc1
 
5fd0bf8
 
 
 
 
5450dc1
5fd0bf8
 
 
 
 
5450dc1
 
5fd0bf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5450dc1
 
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import gradio as gr
import pandas as pd
import os
from component import *
from GameRecommender import *
import gc
from sklearn.model_selection import train_test_split
from huggingface_hub import snapshot_download
from sklearn.preprocessing import MultiLabelBinarizer,LabelEncoder,MinMaxScaler

DATA_BASE_PATH = 'data'
# MODEL_BASE_PATH = 'models'
MODEL_BASE_PATH = snapshot_download(
    repo_id="VJyzCELERY/SteamGameRecommender",
    repo_type="model",
    allow_patterns=["GameRecommender/*"]
)
SEED = 42
RAW_GAMES_DATAPATH = os.path.join(DATA_BASE_PATH,'converted.csv')
GAMES_DATAPATH = os.path.join(DATA_BASE_PATH,'Cleaned_games.csv')
REVIEWS_DATAPATH = os.path.join(DATA_BASE_PATH,'MergedFragmentData_SAMPLE.csv')
TRIMMED_REVIEW_DATAPATH = os.path.join(DATA_BASE_PATH,'Trimmed_Dataset.csv')
USER_PREFERENCE_DATAPATH = os.path.join(DATA_BASE_PATH,'UserPreferenceDF.csv')
MODEL_PATH = os.path.join(MODEL_BASE_PATH,'GameRecommender')
from datasets import load_dataset

GAMES_DS = load_dataset("VJyzCELERY/Cleaned_games")


# load dataset

model = GameRecommendationEnsemble.load(MODEL_PATH)
vectorizer=model.text_based_recommender.vectorizer
review_app_id_encoder=model.text_based_recommender.app_id_encoder
genres = model.game_content_recommeder.genre_encoder.classes_.tolist()
genres = [genre for genre in genres if genre != 'Unknown']
categories = model.game_content_recommeder.category_encoder.classes_.tolist()
categories = [cat for cat in categories if cat != 'Unknown']
price_ranges = model.game_content_recommeder.price_range_encoder.classes_.tolist()
selectable_app_ids = list(model.collaborative_recommender.item_to_index.keys())
# df_games = pd.read_csv(GAMES_DATAPATH,index_col=False)

df_games = GAMES_DS['train'].to_pandas()
available_names = df_games[df_games['app_id'].astype(str).isin(selectable_app_ids)]['Name'].tolist()
        
def recommend_game(description=None, app_name=None, price_range=None, year_release=None,

            excpected_playtime=None, game_score=None, dlc_count=None, 

            genres=None, categories=None, top_n=5,weight_text=1.0, weight_collab=1.0, weight_content=1.0):
    if app_name:
        if isinstance(app_name, (str)):
            app_name = [app_name]
        app_ids = df_games[df_games['Name'].isin(app_name)]['app_id'].astype(str).tolist()
    else: 
        app_ids = None
    prediction = model.predict(description=description,app_ids=app_ids,price_range=price_range,year_release=year_release,average_playtime=excpected_playtime,game_score=game_score,
                               dlc_count=dlc_count,genres=genres,categories=categories,top_n=top_n,weight_text=weight_text,weight_collab=weight_collab,weight_content=weight_content)
    app_ids = prediction['app_id'].tolist()
    output = df_games.loc[df_games['app_id'].astype(str).isin(app_ids)].reset_index()
    return gr.DataFrame(value=output)

# Load external CSS file
with open('style.css', 'r') as f:
    custom_css = f.read()

"""

    MAIN DEMO

"""
with gr.Blocks(css = custom_css) as demo:
    # container
    with gr.Row(elem_classes="container"):
        with gr.Column(elem_id="system", elem_classes='content-section', visible=True) as system_section:
            # special for this section
            gr.HTML('<h1 class="header-title">Game Recommendation System</h1>', elem_id='system')
            with gr.Row():
                with gr.Column(min_width=500, elem_classes='input-column'):
                    
                    app_name = input_choice(
                        Label='Select games that you liked',
                        Choices=available_names,
                        Multiselect=True
                    )
                    year = input_number(
                        Label='Year Release',
                        Precision=0,
                        minimum=0
                    )
                    expected_playtime = input_number(
                        Label='Expected Playtime (Hours)',
                        Precision=2,
                        minimum=0
                    )
                    expected_score = input_number(
                        Label='Expected Score (% Positive)',
                        Precision=2,
                        minimum=0
                    )
                    dlc_count = input_number(
                        Label='DLC Count',
                        Precision=0,
                        minimum=0
                    )
                    description = input_paragaph_textbox('Description', 'Describe the game (max 1200 characters)...')
                    genre = input_choice(
                            Label="Select Your Genre (Multiple Choice)",
                            Choices=genres,
                            Multiselect=True
                        )
                    
                    categories = input_choice(
                            Label="Select Your Categories (Multiple Choice)",
                            Choices=categories,
                            Multiselect=True
                        )
                    # single selection (multiselect=False)
                    price_range = input_choice(
                            Label="Select Your Price Range (Only Single Choice)",
                            Choices=price_ranges,
                            Multiselect=False
                        )
                    
                    top_n= input_number(
                        Label='Output amount',
                        Precision=0,
                        minimum=0,
                        value=10
                    )
                    weight_text = input_number(
                        Label='Weight Text',
                        Precision=2,
                        minimum=0,
                        maximum=1,
                        value=0.5,
                        step=0.01
                    )
                    weight_collab = input_number(
                        Label='Weight Of Collaborative Model',
                        Precision=2,
                        minimum=0,
                        maximum=1,
                        value=0.5,
                        step=0.01
                    )
                    weight_content = input_number(
                        Label='Weight Of Content Based Model',
                        Precision=2,
                        minimum=0,
                        maximum=1,
                        value=0.5,
                        step=0.01
                    )
                    submit_btn = gr.Button("Get Recommendations", variant="primary", elem_id="submit-btn")
                
                # Results column
                with gr.Column(min_width=500, elem_classes='results-column'):
                    h2('Result')
                    with gr.Column(elem_id='Output'):
                        # Results column using the modular component
                        h2('Recommended Game')
                        recommended_game = gr.DataFrame()
                    # click button logic
                    submit_btn.click(
                        fn=recommend_game,
                        inputs=[description,app_name,price_range,year,expected_playtime,expected_score,dlc_count, genre, categories,top_n,weight_text,weight_collab,weight_content],
                        outputs=recommended_game
                    )

demo.launch()