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 = "
Marvel Snap deck starter by Jean-Michel D | Article" 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()