# yawpremuh/drexel-elective-course-recommender architecture

> Architecture diagram of the GitHub repository yawpremuh/drexel-elective-course-recommender, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/yawpremuh/drexel-elective-course-recommender
- Repository: https://github.com/yawpremuh/drexel-elective-course-recommender

## Overview

The repository is an early Drexel elective-course recommender. Its implemented workflow collects catalog data, cleans it into a recommendation-ready CSV, then accepts student interests and prints TF-IDF-ranked courses. The README also describes a longer-term hybrid system with eligibility filters, multiple ranking signals, explanations, and API/web interfaces; those components are documented goals, not evidenced implementations in the sampled source. The graph distinguishes that planned design from the current pipeline.

Main entry points: [`app/recommender/tfidf_recommender.py`](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py) (CLI Entry), [`scripts/scrape_courses.py`](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/scripts/scrape_courses.py) (Catalog Scraper), [`scripts/clean_courses.py`](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/scripts/clean_courses.py) (Course Cleaner), [`data/raw/courses_raw.csv`](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/data/raw/courses_raw.csv) (Raw Courses)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_collection["Course Collection"]
  node_scraper["Catalog Scraper<br/>[scrape_courses.py]"]
  node_raw["Raw Courses<br/>[courses_raw.csv]"]
end

subgraph group_preparation["Data Preparation"]
  node_cleaner["Course Cleaner<br/>[clean_courses.py]"]
  node_processed["Clean Courses<br/>[courses_clean.csv]"]
end

subgraph group_baseline["TF-IDF Recommender"]
  node_cli["CLI Entry"]
  node_loader["Course Loader"]
  node_filter["Course Filtering"]
  node_text["Course Text Builder"]
  node_tfidf["TF-IDF Matrix"]
  node_similarity["Similarity Scoring"]
  node_ranking["Top-K Ranking"]
  node_results["Printed Recommendations"]
end

subgraph group_future["Planned Hybrid System"]
  node_profile["Profile Builder"]
  node_eligibility["Eligibility Filters"]
  node_retrieval["Candidate Retrieval"]
  node_hybrid["Hybrid Ranker"]
  node_signals["Ranking Signals"]
  node_explanation["Explanation Engine"]
  node_api["FastAPI"]
  node_web["Web App"]
end

node_catalog(("Drexel Catalog"))
node_student(("Student"))

node_scraper -->|"fetches pages"| node_catalog
node_scraper -->|"writes courses"| node_raw
node_cleaner -->|"reads courses"| node_raw
node_cleaner -->|"writes cleaned data"| node_processed
node_student -->|"enters interests"| node_cli
node_cli -->|"calls recommendation"| node_loader
node_loader -->|"reads courses"| node_processed
node_loader -->|"passes courses"| node_filter
node_filter -->|"passes eligible courses"| node_text
node_text -->|"passes course text"| node_tfidf
node_tfidf -->|"provides matrix"| node_similarity
node_cli -->|"passes interests"| node_similarity
node_similarity -->|"provides scores"| node_ranking
node_ranking -->|"returns top courses"| node_cli
node_cli -->|"prints courses"| node_results
node_student -.->|"provides profile"| node_profile
node_profile -.->|"supplies profile"| node_eligibility
node_eligibility -.->|"filters candidates"| node_retrieval
node_retrieval -.->|"supplies candidates"| node_hybrid
node_hybrid -.->|"combines scores"| node_signals
node_hybrid -.->|"provides ranked courses"| node_explanation
node_explanation -.->|"returns explanations"| node_api
node_api -.->|"serves recommendations"| node_web

click node_scraper "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/scripts/scrape_courses.py"
click node_raw "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/data/raw/courses_raw.csv"
click node_cleaner "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/scripts/clean_courses.py"
click node_processed "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/data/processed/courses_clean.csv"
click node_cli "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_loader "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_filter "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_text "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_tfidf "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_similarity "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_ranking "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"
click node_results "https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_scraper,node_raw toneBlue
class node_cleaner,node_processed toneAmber
class node_cli,node_loader,node_filter,node_text,node_tfidf,node_similarity,node_ranking,node_results toneMint
class node_profile,node_eligibility,node_retrieval,node_hybrid,node_signals,node_explanation,node_api,node_web toneRose
class node_catalog,node_student toneIndigo
```

## Components

### Course Collection

- [Catalog Scraper](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/scripts/scrape_courses.py): `scripts/scrape_courses.py`
- [Raw Courses](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/data/raw/courses_raw.csv): `data/raw/courses_raw.csv`

### Data Preparation

- [Course Cleaner](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/scripts/clean_courses.py): `scripts/clean_courses.py`
- [Clean Courses](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/data/processed/courses_clean.csv): `data/processed/courses_clean.csv`

### TF-IDF Recommender

- [CLI Entry](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [Course Loader](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [Course Filtering](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [Course Text Builder](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [TF-IDF Matrix](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [Similarity Scoring](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [Top-K Ranking](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`
- [Printed Recommendations](https://github.com/yawpremuh/drexel-elective-course-recommender/blob/main/app/recommender/tfidf_recommender.py): `app/recommender/tfidf_recommender.py`

### Planned Hybrid System

- **Profile Builder**
- **Eligibility Filters**
- **Candidate Retrieval**
- **Hybrid Ranker**
- **Ranking Signals**
- **Explanation Engine**
- **FastAPI**
- **Web App**

### Other components

- **Drexel Catalog**
- **Student**

## Connections

- Catalog Scraper → Drexel Catalog: fetches pages
- Catalog Scraper → Raw Courses: writes courses
- Course Cleaner → Raw Courses: reads courses
- Course Cleaner → Clean Courses: writes cleaned data
- Student → CLI Entry: enters interests
- CLI Entry → Course Loader: calls recommendation
- Course Loader → Clean Courses: reads courses
- Course Loader → Course Filtering: passes courses
- Course Filtering → Course Text Builder: passes eligible courses
- Course Text Builder → TF-IDF Matrix: passes course text
- TF-IDF Matrix → Similarity Scoring: provides matrix
- CLI Entry → Similarity Scoring: passes interests
- Similarity Scoring → Top-K Ranking: provides scores
- Top-K Ranking → CLI Entry: returns top courses
- CLI Entry → Printed Recommendations: prints courses
- Student → Profile Builder: provides profile
- Profile Builder → Eligibility Filters: supplies profile
- Eligibility Filters → Candidate Retrieval: filters candidates
- Candidate Retrieval → Hybrid Ranker: supplies candidates
- Hybrid Ranker → Ranking Signals: combines scores
- Hybrid Ranker → Explanation Engine: provides ranked courses
- Explanation Engine → FastAPI: returns explanations
- FastAPI → Web App: serves recommendations
