File size: 3,576 Bytes
96f57e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66a882a
 
faf5990
0d2ba5d
 
 
faf5990
 
66a882a
 
96f57e5
 
 
 
 
6860d09
96f57e5
66a882a
 
 
96f57e5
 
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
import gradio as gr
import pandas as pd
from PIL import Image
import requests

dfp_matrice_association = pd.read_csv("./data/association.csv", index_col=0)
dfp_matrice_distance_from_encoding = pd.read_csv("./data/ed_from_encoding.csv", index_col=0)
dfp_matrice_distance_from_association = pd.read_csv("./data/ed_from_association.csv", index_col=0)
dfp_cards = pd.read_csv("./data/cards.csv")
dfp_cards.sort_values("cname", inplace=True)

mapping_cname_cid = dfp_cards[["cname", "cid"]].reset_index()
mapping_cname_cid = mapping_cname_cid.set_index("cname").to_dict(orient="index")

dfp_cards.set_index(["cid"], inplace=True)

def clean_recommendations(cid, recommendations):
    if cid in recommendations:
        recommendations.remove(cid)
    if str(cid) in recommendations:
        recommendations.remove(str(cid))
    return recommendations
        
def get_recommendations(cid, dfp_, ascending=False, k=5):
    recommendations = dfp_.loc[cid].sort_values(ascending=ascending).index.tolist()
    clean_recommendations(cid, recommendations)
    return recommendations[:k]

def display_recommendations(cname, use_euclidian_distance, use_description_embedding, k):

    cid = int(mapping_cname_cid[cname]["cid"])
    # Collect the recommendations
    dfp_dist = dfp_matrice_distance_from_association if use_euclidian_distance else dfp_matrice_association
    
    if (use_description_embedding == False):
        recommendations = get_recommendations(cid, dfp_dist, use_euclidian_distance,  k=25)
    else:
        closest_card = get_recommendations(cid, dfp_matrice_distance_from_encoding, True,  k=1)[0]
        recommendations = get_recommendations(int(closest_card), dfp_dist, use_euclidian_distance,  k=25)
    
    recommendations = recommendations[:k]
    recommendations_string = [dfp_cards.loc[int(cid_r)]["cname"] for cid_r in recommendations]
    recommendations_image = [Image.open(requests.get(dfp_cards.loc[int(cid_r)]["art"], stream=True).raw).resize((240,300)) for cid_r in recommendations]
    
    block_text = "\n"
    for idx, cid_r in enumerate(recommendations):
        block_text += f"{idx+1}){dfp_cards.loc[int(cid_r)]['cname']} : {dfp_cards.loc[int(cid_r)]['ability']}\n" 
#         block_text += f"{idx+1})\n" 
        
    text_output = f"""
    Recommended cards:{block_text}
    """
    return text_output, recommendations_image

title = "Marvel Snap deck starter"
description = """Gradio demo for Marvel Snap deck starter \n
To use it, simply select the card in the dropdown (cname) that you want to use to kickstart the deck and after use the type of recommender system:\n
1) use_euclidian_distance: Use the euclidian distance or the normalized association \n
2) use_description_embedding: Use the description (name + stats + ability X transformers encoder) as first filtering before the model in 1)\n
More details in this article https://www.the-odd-dataguy.com/2023/01/15/marvel_snap_cold_start/
"""
article = "<div style='text-align: center;'>Marvel Snap deck starter by <a href='https://www.linkedin.com/in/jeanmicheldaignan/' target='_blank'>Jean-Michel D</a> | <a href='https://www.the-odd-dataguy.com/2023/01/15/marvel_snap_cold_start/' target='_blank'>Article</a>"

demo = gr.Interface(
    fn=display_recommendations,
    inputs=[gr.inputs.Dropdown(dfp_cards["cname"].tolist()), 
            "checkbox", 
            "checkbox",
            gr.Slider(minimum=1, maximum=20, step=1, value=5)],
    outputs=["text", gr.Gallery(label="Recommendations")],
    title=title,
    description=description,
    article=article,
)
demo.launch()