Overview
Resume Scanner parses resumes in PDF, DOCX, and TXT formats using PyMuPDF and python-docx, extracts structured information via an LLM-backed analyzer (Qwen2.5:7b via Ollama by default, or any OpenAI-compatible endpoint), scores every resume on a 100-point multi-dimensional rubric, optionally matches candidate skills against a job description, and generates a fully self-contained interactive HTML report with inline charts and color-coded suggestions.
Capability Boundaries
What this tool does:
- Parse PDF / DOCX / TXT resumes into plain text.
- Detect sections (education, experience, skills, projects, certifications) using bilingual regex patterns for both Chinese and English resumes.
- Extract structured JSON: name, email, phone, location, years of experience, current role, education entries, work experience entries (with STAR-format completeness detection), skills (technical / language / soft / tools), projects, certifications, and a one-line summary.
- Score across 6 dimensions on a 100-point scale:
- Format & Structure (15 pts)
- Experience Quality (25 pts)
- Skills Match (25 pts)
- Education Fit (10 pts)
- Projects & Extras (15 pts)
- Readability (10 pts)
- Job description matching: compute skills overlap rate against an optional JD text file.
- Generate a self-contained HTML report containing:
- Semi-circular score gauge
- 6-dimension radar chart (matplotlib)
- Dimension-by-dimension progress bars with scores
- Prioritized improvement suggestions (high / medium / low)
- Extracted structured data display (name, contact, education, experience, skills, projects)
- JD skills comparison table (matched / unmatched)
What this tool does NOT do:
- It is NOT a resume builder or formatter -- it only reads and scores.
- It does NOT parse images or scanned PDFs (OCR is not included).
- It does NOT handle batch/multi-file processing from the CLI.
- It does NOT send resumes to external services; the LLM backend is local (Ollama) or user-configured.
Trigger Conditions
Use this skill when the user:
- Uploads or provides a path to a resume file (.pdf, .docx, .txt) and asks for analysis, scoring, feedback, or improvement suggestions.
- Wants to compare a resume against a job description.
- Needs a structured report on resume quality with actionable suggestions.
- Mentions phrases like "rate my resume", "resume score", "analyze this CV", "简历评分", or "简历分析".
Usage
CLI
# Basic analysis
python scanner.py analyze resume.pdf
# Analysis with job description matching
python scanner.py analyze resume.pdf --jd job_description.txt
# Custom output path
python scanner.py analyze resume.docx --output output/report.html
Dependencies
- PDF parsing: PyMuPDF (
pip install PyMuPDF) - DOCX parsing: python-docx (
pip install python-docx) - LLM backend: Ollama with Qwen2.5:7b (or any OpenAI-compatible endpoint)
- Charts: matplotlib, numpy
- CLI: rich
Configuration
The LLM backend is configured in ResumeAnalyzer.__init__(). Default:
model = "qwen2.5:7b"
base_url = "http://localhost:11434/v1"
Change these values in resume_scanner/analyzer.py to use a different model or provider.
Output Example
After running python scanner.py analyze resume.pdf, the tool produces output/report.html. The report includes:
- Header: "Resume Analysis Report" with generation timestamp.
- Score Overview: Letter grade (A+ through D), total score out of 100, semi-circular gauge chart.
- Dimension Radar: Spider chart showing all 6 dimension scores.
- Dimension Breakdown: Horizontal progress bars for each dimension with score/max values and color coding (green >= 80%, yellow >= 60%, orange >= 40%, red < 40%).
- Improvement Suggestions: Cards ordered by priority (high/medium/low), each with the dimension name, score, and 3 specific actionable fixes.
- Extracted Information: Name, email, phone, location, years of experience, current role, skills (as tags), education history, projects, and work experience with achievements.
- JD Comparison (if JD provided): Matched skills list (green) vs. skills not found in JD (gray), with match rate percentage.
FAQ
Q: What if the LLM backend is unavailable? A: The analyzer has a regex-based fallback that extracts email, phone, name, degree keywords, and common tech skills. Scores will be lower and suggestions less specific, but a report will still be generated.
Q: What languages are supported? A: The parser supports bilingual (Chinese + English) section detection. The LLM analyzer prompt is in Chinese. Most patterns work for both languages.
Q: Can I use a cloud LLM instead of Ollama?
A: Yes. Change base_url and api_key in resume_scanner/analyzer.py to point to any OpenAI-compatible endpoint (e.g., OpenAI, Groq, DeepSeek).
Q: How accurate is the scoring? A: The scoring uses rule-based heuristics (bullet count, action verb frequency, quantified achievement ratio, STAR completeness, skill-JD overlap). It provides directional guidance, not a definitive evaluation.
微信扫一扫