|
"""Recommender and metadata integration component for CRB-CRS model. |
|
|
|
This component is responsible for replacing placeholders, if any, in the |
|
retrieved response with appropriate movie information. |
|
""" |
|
|
|
from __future__ import annotations |
|
|
|
import os |
|
import pickle |
|
from abc import ABC, abstractmethod |
|
from typing import List |
|
|
|
|
|
class Recommender(ABC): |
|
def __init__(self) -> None: |
|
"""Initializes the recommender.""" |
|
pass |
|
|
|
@abstractmethod |
|
def get_recommendations(self, context: List[str]) -> List[str]: |
|
"""Gets recommendations based on the conversation context. |
|
|
|
Args: |
|
context: Conversation context. |
|
|
|
Raises: |
|
NotImplementedError: If the method is not implemented in the |
|
subclass. |
|
|
|
Returns: |
|
List of recommended items. |
|
""" |
|
raise NotImplementedError |
|
|
|
@abstractmethod |
|
def replace_item_ids_with_recommendations( |
|
self, response: str, recommended_items: List[str] = [] |
|
) -> str: |
|
"""Replaces item ids in a response with recommended items. |
|
|
|
If no recommended items are available, the item ids are replaced with |
|
their original titles. |
|
|
|
Args: |
|
response: Response containing item ids. |
|
recommended_items: List of recommended items. |
|
|
|
Raises: |
|
NotImplementedError: If the method is not implemented in the |
|
subclass. |
|
Returns: |
|
Response with item ids replaced by recommended items. |
|
""" |
|
raise NotImplementedError |
|
|
|
@abstractmethod |
|
def integrate_domain_metadata( |
|
self, |
|
context: List[str], |
|
response: str, |
|
) -> str: |
|
"""Integrates domain metadata into the response. |
|
|
|
Args: |
|
context: Conversation context |
|
response: Response to integrate domain metadata into. |
|
|
|
Raises: |
|
NotImplementedError: If the method is not implemented in the |
|
subclass. |
|
|
|
Returns: |
|
Response with domain metadata integrated. |
|
""" |
|
raise NotImplementedError |
|
|
|
@classmethod |
|
def load(cls, path: str) -> Recommender: |
|
"""Loads the recommender from the given path. |
|
|
|
Args: |
|
path: Path to the recommender. |
|
|
|
Raises: |
|
FileNotFoundError: If the recommender file is not found. |
|
|
|
Returns: |
|
Loaded recommender. |
|
""" |
|
if not os.path.exists(path): |
|
raise FileNotFoundError(f"Recommender file not found: {path}") |
|
|
|
return pickle.load(open(path, "rb")) |
|
|
|
def save(self, path: str) -> None: |
|
"""Saves the recommender to the given path. |
|
|
|
Args: |
|
path: Path to save the recommender. |
|
""" |
|
pickle.dump(self, open(path, "wb")) |
|
|