Bulk Resume Keyword Matching: Score, Fix, and Rebuild It Against the Job (Free, On-Device)

Score & Audit: Local Keyword Extraction & Gap Analysis

Use a local Python script (no API keys) to parse the Job Description (JD) and your resume corpus. Install spacy (en_core_web_lg) and pyresparser or pdfplumber. Run NER and noun-chunk extraction on the JD to isolate hard skills (Python, Kubernetes, GAAP), soft skills (stakeholder management), and action verbs (architected, optimized). Generate a frequency-weighted "Must-Have" list (appears 2+ times or in "Requirements" section) and a "Nice-to-Have" list. Batch-process your resume folder: extract text, clean headers/footers, and vectorize using TF-IDF or sentence-transformers/all-MiniLM-L6-v2 for semantic similarity. Score each resume: Score = (Hard_Skill_Matches / Total_JD_Hard_Skills) * 0.7 + (Semantic_Similarity * 0.3). Flag resumes scoring < 65%. Output a CSV: Filename, Score, Missing_Hard_Skills, Missing_Keywords, Semantic_Similarity. This runs entirely offline in < 5 seconds per 50 resumes.

Fix & Rebuild: Targeted Injection & Template Generation

For flagged resumes, automate surgical edits. Map missing hard skills to existing bullet points using dependency parsing: find the root verb of a bullet (e.g., "developed") and append the missing tool contextually ("developed Kubernetes operators..."). If no logical anchor exists, generate a new bullet using the Challenge-Action-Result (CAR) template: "Implemented [Missing Skill] to [quantifiable outcome], reducing [metric] by [%]." Use a local LLM (Ollama running llama3:8b or phi3:mini) with a strict prompt: "Rewrite only the specific bullet point to include [Skill]. Do not hallucinate metrics. Keep original tense. Output raw text only." Validate the rewrite against the original embedding to ensure semantic drift < 0.15 cosine distance. For total rebuilds, feed the JD "Must-Haves" and the candidate's raw experience JSON into a Jinja2 LaTeX/HTML template. Render a tailored PDF via weasyprint or xelatex. Version control outputs in /output/tailored/{JobID}_{Candidate

Skip the DIY. VaultPDF's Screen the Stack room does exactly this — drop a folder, get a ranked sheet back, nothing ever leaves your machine.
Try it free →