From c6658e21e1d5c99cb1de34480ee24a0ebfb8bc6e Mon Sep 17 00:00:00 2001 From: imrecommender Date: Wed, 5 Jun 2024 17:08:58 -0500 Subject: [PATCH] pfar diversification draft --- src/poprox_recommender/default.py | 47 +++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/poprox_recommender/default.py b/src/poprox_recommender/default.py index f2f3daad..89877466 100644 --- a/src/poprox_recommender/default.py +++ b/src/poprox_recommender/default.py @@ -173,6 +173,53 @@ def mmr_diversification(rewards, similarity_matrix, theta, topk): S.append(candidate) return S # LIST(candidate index) +def pfar_diversification(rewards, articles, lamb, tau, topk): + # articles: LIST[ARTICLE] + # p(v|u) + lamb*tau \sum_{d \in D} P(d|u)I{v \in d} \prod_{i \in S} I{i \in d} + + S = [] # final recommendation LIST[candidate index] + initial_item = rewards.argmax() + S.append(initial_item) + + S_topic = set() + article = articles[int(initial_item)] + S_topic.add(topic for topic in [mention.entity.name for mention in article.mentions]) + + + for k in range(topk - 1): + candidate = None # next item + best_PFAR = float("-inf") + + for i, reward_i in enumerate(rewards): # iterate R for next item + if i in S: + continue + product = 1 + summation = 0 + + candidate_topic = [mention.entity.name for mention in articles[int(i)].mentions] + for topic in candidate_topic: + if topic in S_topic: + product = 0 + break + + for topic in candidate_topic: + summation += user_preference[topic] + + PFAR_i = reward_i + lamb * tau * summation * product + + if PFAR_i > best_PFAR: + best_PFAR = PFAR_i + candidate = i + + if candidate != None: + S.append(candidate) + S_topic.add(topic for topic in candidate_topic) + + return S # LIST(candidate index) + + + + def generate_recommendations( model, articles, article_vectors, similarity_matrix, user_embeddings, num_slots=10