ats-resume-checker
A lightweight Python package that scores resumes against job descriptions for ATS (Applicant Tracking System) compatibility — runs fully locally, no external AI APIs required.
Features
- Multi-format support — PDF, DOCX, and plain TXT resumes
- TF-IDF similarity scoring — more accurate than simple word-count matching
- Smart keyword extraction — lemmatization, bigrams, and a built-in library of 30+ recognized multi-word skills (
"machine learning","rest api","data analysis", etc.) - Keyword gap analysis — shows exactly which JD keywords are present or missing in the resume
- Keyword match rate — percentage of job description keywords covered
- Resume word count — flags resumes that are too short or too long
- Actionable suggestions — concrete tips to improve ATS compatibility
- CLI — run analysis directly from your terminal without writing any code
Installation
pip install ats-resume-checker
Quick Start
from ats_resume_checker import analyze_resume
result = analyze_resume(
"resume.pdf", # supports .pdf, .docx, and .txt
"Looking for a Python developer with SQL and machine learning experience."
)
print(result)
Output
{
"ats_score": 54.30, # TF-IDF cosine similarity score (0–100)
"match_rate": 66.7, # % of JD keywords found in the resume
"matched_keywords": [
"data analysis",
"machine learning",
"python",
"sql"
],
"missing_keywords": [
"communication",
"developer",
"problem solving"
],
"resume_word_count": 520,
"suggestions": [
"Include more job-specific keywords. Missing: communication, developer, problem solving.",
"Quantify achievements where possible (e.g. 'Improved performance by 30%')."
]
}
Python API
analyze_resume(resume_path, job_description)
| Parameter | Type | Description |
|---|---|---|
resume_path |
str |
Path to the resume file (.pdf, .docx, or .txt) |
job_description |
str |
Plain-text job description |
Returns a dict with ats_score, match_rate, matched_keywords, missing_keywords, resume_word_count, suggestions.
Utility functions
from ats_resume_checker import extract_text, extract_keywords, get_keyword_set
# Extract text from any supported file type
text = extract_text("resume.pdf")
# Get a ranked list of keywords (includes bigrams and known phrases)
keywords = extract_keywords(text, top_n=30)
# Get a clean keyword set (unigrams + known phrases only, no noise)
kw_set = get_keyword_set(text, top_n=50)
Command-Line Interface
After installation the ats-check command is available in your terminal:
# Job description as a string
ats-check resume.pdf "Python developer with SQL and machine learning skills"
# Job description as a .txt file
ats-check resume.docx job_description.txt
# Output as JSON (useful for scripts and pipelines)
ats-check resume.pdf "Data engineer with Spark experience" --json
Example output
==============================================
ATS RESUME ANALYSIS REPORT
==============================================
ATS Score : 54.30%
Keyword Match : 66.7%
Resume Words : 520
Matched Keywords (4):
+ data analysis
+ machine learning
+ python
+ sql
Missing Keywords (3):
- communication
- developer
- problem solving
Suggestions:
* Include more job-specific keywords. Missing: communication, developer, problem solving.
* Quantify achievements where possible.
==============================================
Dependencies
| Package | Purpose |
|---|---|
PyPDF2 |
PDF text extraction |
python-docx |
DOCX text extraction |
scikit-learn |
TF-IDF vectorization and cosine similarity |
nltk |
Lemmatization, stopwords, tokenization |
All dependencies are installed automatically with pip install ats-resume-checker.
License
MIT © Vidhi Bhutia
Metadata
Release files for ats-resume-checker 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ats_resume_checker-0.2.0.tar.gz | 8.5 kB | Without provenance | Details for ats_resume_checker-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ats_resume_checker-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for ats_resume_checker-0.2.0-py3-none-any.whl |
Total release size: 17.6 kB
Release files / ats_resume_checker-0.2.0.tar.gz
| Download URL | ats_resume_checker-0.2.0.tar.gz |
|---|---|
| Size | 8.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
84fd314d810c7e5c9ebc09a760953e77d9be40b36d1a166300099a6155e9e0df
|
|
BLAKE2b-256 checksum How to use checksums |
1ef60d0bc02cb8361a258ed6230dc16bf2abc545ccd78e91638865896b478683
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / ats_resume_checker-0.2.0-py3-none-any.whl
| Download URL | ats_resume_checker-0.2.0-py3-none-any.whl |
|---|---|
| Size | 9.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
36510c6207f7168917963f532ef0256ea411b7f7e4401d87ef86bb6439ba4962
|
|
BLAKE2b-256 checksum How to use checksums |
fccc24e99c3a538660c0b69b6dc4058ec640913834c29343610081a2eea8670c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Security for ats-resume-checker 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.