From 5545d10ac7d62b44bd6ddb6751324fa68f2d5a69 Mon Sep 17 00:00:00 2001 From: Srishti Saxena Date: Mon, 11 May 2026 17:09:14 +0530 Subject: [PATCH 1/2] Improve recommender scoring documentation --- utils/recommender.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/utils/recommender.py b/utils/recommender.py index b2661dfa..3a5b6771 100644 --- a/utils/recommender.py +++ b/utils/recommender.py @@ -7,11 +7,13 @@ # Maximum number of recommendations returned to the user MAX_RESULTS = 3 -# Point weights for each matching criterion -WEIGHT_SKILL = 3 # Skill matches carry the most influence -WEIGHT_LEVEL = 2 # Experience level is the next strongest signal -WEIGHT_INTEREST = 2 # Area of interest is equally important as level -WEIGHT_TIME = 1 # Time availability is a tiebreaker +# Scoring weights used by the recommendation engine. +# Higher weights mean that criterion has more influence +# on the final recommendation score. +WEIGHT_SKILL = 3 # Skills are weighted highest because they best reflect project compatibility +WEIGHT_LEVEL = 2 # Matching experience level helps avoid projects that are too easy or too difficult +WEIGHT_INTEREST = 2 # Interest alignment improves recommendation relevance +WEIGHT_TIME = 1 # Time availability acts as a smaller tie-breaker factor def parse_skills(skills_string): @@ -38,7 +40,11 @@ def score_single_project(project, user_skills, level, interest, time_availabilit # Compare user's skills against the project's required skills project_skills = [s.lower() for s in project.get("skills", [])] - matched_skills = sum(1 for skill in user_skills if skill in project_skills) + # Count how many user skills overlap with the + # skills required by the current project. + matched_skills = sum(1 for skill in user_skills if skill in project_skills) + # Add weighted points based on the number of matching skills. + # More overlapping skills result in a higher recommendation score. score += matched_skills * WEIGHT_SKILL # Award points for each additional matching criterion @@ -74,10 +80,13 @@ def get_recommendations(skills_string, level, interest, time_availability): score = score_single_project( project, user_skills, level, interest, time_availability ) + # Ignore projects with a score of 0 since they + # have no meaningful overlap with the user's inputs. if score > 0: scored_projects.append({"project": project, "score": score}) - # Sort so the highest-scoring project appears first + # Sort projects in descending order so the + # most relevant recommendations appear first. scored_projects.sort(key=lambda item: item["score"], reverse=True) # Return only the project dicts, not the score metadata From 5565da9ee7d01b23c333fbe85289a7406bcc2e3a Mon Sep 17 00:00:00 2001 From: Srishti Saxena Date: Tue, 12 May 2026 22:03:15 +0530 Subject: [PATCH 2/2] Fix missing starter code files for tests --- starter_code/expense_tracker.py | 16 ++++++++++++++++ utils/file_server.py | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 starter_code/expense_tracker.py diff --git a/starter_code/expense_tracker.py b/starter_code/expense_tracker.py new file mode 100644 index 00000000..f7e53123 --- /dev/null +++ b/starter_code/expense_tracker.py @@ -0,0 +1,16 @@ +# Personal Expense Tracker Starter Code + +expenses = [] + +def add_expense(amount, category): + expenses.append({ + "amount": amount, + "category": category + }) + +def view_expenses(): + for expense in expenses: + print(expense) + +if __name__ == "__main__": + print("Expense Tracker Started") \ No newline at end of file diff --git a/utils/file_server.py b/utils/file_server.py index 149bee4a..5539060e 100644 --- a/utils/file_server.py +++ b/utils/file_server.py @@ -4,7 +4,9 @@ import os # Absolute path to the starter_code directory -STARTER_CODE_DIR = os.path.join(os.path.dirname(__file__), "..", "starter_code") +STARTER_CODE_DIR = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "starter_code") +) def resolve_starter_file(project):