| class RecommendationRuleEngine: | |
| """ | |
| Expert system for recommendation decisions. | |
| """ | |
| def score_topic(self, topic, user_knowledge_map): | |
| """ | |
| Score a topic for recommendation suitability. | |
| Returns a score (higher is better). | |
| """ | |
| score = 0 | |
| current_knowledge = user_knowledge_map.get(topic.id, 0) | |
| # Rule 1: Don't recommend mastered topics (unless for review) | |
| if current_knowledge > 0.85: | |
| return -1 | |
| # Rule 2: Prerequisites must be met | |
| if not self._check_prerequisites(topic, user_knowledge_map): | |
| return -10 # Blocked | |
| # Rule 3: Prioritize active topics | |
| if 0 < current_knowledge < 0.7: | |
| score += 5 | |
| # Rule 4: Beginner topics get boost if nothing started | |
| if current_knowledge == 0 and topic.difficulty == "beginner": | |
| score += 3 | |
| return score | |
| def _check_prerequisites(self, topic, knowledge_map): | |
| if not topic.prerequisites: | |
| return True | |
| if isinstance(topic.prerequisites, str): | |
| prereq_ids = [int(p) for p in topic.prerequisites.split(',') if p.strip()] | |
| else: | |
| prereq_ids = [] | |
| for pid in prereq_ids: | |
| if knowledge_map.get(pid, 0) < 0.6: | |
| return False | |
| return True | |