File size: 1,431 Bytes
25732fb | 1 2 3 4 5 6 7 8 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 | 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
|