Skip to content

Interactive Filtering

InteractiveFilteringRecommender

Source code in engines/contentFilterEngine/special_techniques/interactive_filtering.py
 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
class InteractiveFilteringRecommender:
    def __init__(self, base_recommender: Any):
        """
        Initialize the InteractiveFilteringRecommender with a base recommender.

        Parameters:
        - base_recommender (Any): An instance of a base recommender (e.g., LSA, LDA).
        """
        self.base_recommender = base_recommender
        # Stores user feedback in the format {user_id: {item_id: feedback_score}}
        self.user_feedback: Dict[int, Dict[int, float]] = {}
        logger.info("InteractiveFilteringRecommender initialized with base recommender.")

    def collect_feedback(self, user_id: int, item_id: int, feedback_score: float):
        """
        Collect feedback from the user for a specific item.

        Parameters:
        - user_id (int): The ID of the user.
        - item_id (int): The ID of the item.
        - feedback_score (float): The feedback score (e.g., 1.0 for positive, -1.0 for negative).
        """
        if user_id not in self.user_feedback:
            self.user_feedback[user_id] = {}
        self.user_feedback[user_id][item_id] = feedback_score
        logger.info(f"Collected feedback from user {user_id} for item {item_id}: {feedback_score}")

        # Update the base recommender based on feedback
        self.update_recommender(user_id, item_id, feedback_score)

    def update_recommender(self, user_id: int, item_id: int, feedback_score: float):
        """
        Update the base recommender system based on user feedback.

        Parameters:
        - user_id (int): The ID of the user.
        - item_id (int): The ID of the item.
        - feedback_score (float): The feedback score.
        """
        try:
            # Example: Adjust user profile or model based on feedback
            # This is a placeholder for actual implementation
            logger.info(f"Updating base recommender for user {user_id} based on feedback.")
            if hasattr(self.base_recommender, 'update_user_profile'):
                self.base_recommender.update_user_profile(user_id, item_id, feedback_score)
            else:
                logger.warning("Base recommender does not support updating user profiles.")
        except Exception as e:
            logger.error(f"Error updating recommender based on feedback: {e}")

    def recommend(self, user_id: int, query: str, top_n: int = 10) -> List[int]:
        """
        Generate top-N item recommendations for a user, considering their feedback.

        Parameters:
        - user_id (int): The ID of the user.
        - query (str): The query text for generating recommendations.
        - top_n (int): Number of top recommendations to return.

        Returns:
        - List[int]: List of recommended item IDs.
        """
        logger.info(f"Generating recommendations for user {user_id} with query '{query}' using InteractiveFilteringRecommender.")
        # Get base recommendations
        base_recommendations = self.base_recommender.recommend(user_id, query, top_n=top_n * 2)

        if user_id in self.user_feedback:
            # Filter out items with negative feedback
            filtered_recommendations = [
                item_id for item_id in base_recommendations
                if self.user_feedback[user_id].get(item_id, 0) >= 0
            ]
            logger.info(f"Filtered recommendations for user {user_id}: {filtered_recommendations}")
            return filtered_recommendations[:top_n]
        else:
            return base_recommendations[:top_n]

__init__(base_recommender)

Initialize the InteractiveFilteringRecommender with a base recommender.

Parameters: - base_recommender (Any): An instance of a base recommender (e.g., LSA, LDA).

Source code in engines/contentFilterEngine/special_techniques/interactive_filtering.py
10
11
12
13
14
15
16
17
18
19
20
def __init__(self, base_recommender: Any):
    """
    Initialize the InteractiveFilteringRecommender with a base recommender.

    Parameters:
    - base_recommender (Any): An instance of a base recommender (e.g., LSA, LDA).
    """
    self.base_recommender = base_recommender
    # Stores user feedback in the format {user_id: {item_id: feedback_score}}
    self.user_feedback: Dict[int, Dict[int, float]] = {}
    logger.info("InteractiveFilteringRecommender initialized with base recommender.")

collect_feedback(user_id, item_id, feedback_score)

Collect feedback from the user for a specific item.

Parameters: - user_id (int): The ID of the user. - item_id (int): The ID of the item. - feedback_score (float): The feedback score (e.g., 1.0 for positive, -1.0 for negative).

Source code in engines/contentFilterEngine/special_techniques/interactive_filtering.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def collect_feedback(self, user_id: int, item_id: int, feedback_score: float):
    """
    Collect feedback from the user for a specific item.

    Parameters:
    - user_id (int): The ID of the user.
    - item_id (int): The ID of the item.
    - feedback_score (float): The feedback score (e.g., 1.0 for positive, -1.0 for negative).
    """
    if user_id not in self.user_feedback:
        self.user_feedback[user_id] = {}
    self.user_feedback[user_id][item_id] = feedback_score
    logger.info(f"Collected feedback from user {user_id} for item {item_id}: {feedback_score}")

    # Update the base recommender based on feedback
    self.update_recommender(user_id, item_id, feedback_score)

recommend(user_id, query, top_n=10)

Generate top-N item recommendations for a user, considering their feedback.

Parameters: - user_id (int): The ID of the user. - query (str): The query text for generating recommendations. - top_n (int): Number of top recommendations to return.

Returns: - List[int]: List of recommended item IDs.

Source code in engines/contentFilterEngine/special_techniques/interactive_filtering.py
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
def recommend(self, user_id: int, query: str, top_n: int = 10) -> List[int]:
    """
    Generate top-N item recommendations for a user, considering their feedback.

    Parameters:
    - user_id (int): The ID of the user.
    - query (str): The query text for generating recommendations.
    - top_n (int): Number of top recommendations to return.

    Returns:
    - List[int]: List of recommended item IDs.
    """
    logger.info(f"Generating recommendations for user {user_id} with query '{query}' using InteractiveFilteringRecommender.")
    # Get base recommendations
    base_recommendations = self.base_recommender.recommend(user_id, query, top_n=top_n * 2)

    if user_id in self.user_feedback:
        # Filter out items with negative feedback
        filtered_recommendations = [
            item_id for item_id in base_recommendations
            if self.user_feedback[user_id].get(item_id, 0) >= 0
        ]
        logger.info(f"Filtered recommendations for user {user_id}: {filtered_recommendations}")
        return filtered_recommendations[:top_n]
    else:
        return base_recommendations[:top_n]

update_recommender(user_id, item_id, feedback_score)

Update the base recommender system based on user feedback.

Parameters: - user_id (int): The ID of the user. - item_id (int): The ID of the item. - feedback_score (float): The feedback score.

Source code in engines/contentFilterEngine/special_techniques/interactive_filtering.py
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def update_recommender(self, user_id: int, item_id: int, feedback_score: float):
    """
    Update the base recommender system based on user feedback.

    Parameters:
    - user_id (int): The ID of the user.
    - item_id (int): The ID of the item.
    - feedback_score (float): The feedback score.
    """
    try:
        # Example: Adjust user profile or model based on feedback
        # This is a placeholder for actual implementation
        logger.info(f"Updating base recommender for user {user_id} based on feedback.")
        if hasattr(self.base_recommender, 'update_user_profile'):
            self.base_recommender.update_user_profile(user_id, item_id, feedback_score)
        else:
            logger.warning("Base recommender does not support updating user profiles.")
    except Exception as e:
        logger.error(f"Error updating recommender based on feedback: {e}")