resume-analyzer / app.py
devmalik-official's picture
Update app.py
e990ba3 verified
import gradio as gr
import json
import PyPDF2
import docx
# ----------------------------
# Resume Text Extraction
# ----------------------------
def extract_text(file):
if file is None:
return ""
filename = file.name
text = ""
if filename.endswith(".pdf"):
reader = PyPDF2.PdfReader(file)
for page in reader.pages:
text += page.extract_text() or ""
elif filename.endswith(".docx"):
document = docx.Document(file)
for para in document.paragraphs:
text += para.text + "\n"
elif filename.endswith(".txt"):
text = file.read().decode("utf-8")
return text
# ----------------------------
# Resume Analyzer
# ----------------------------
def analyze_resume(resume_text):
if not resume_text.strip():
return {
"score": 0,
"technical_skills": [],
"soft_skills": [],
"recommendation": "No text detected in resume"
}
text = resume_text.lower()
tech_keywords = [
"python","java","c++","sql","machine learning",
"data analysis","tensorflow","pandas","numpy",
"git","linux","ai"
]
soft_keywords = [
"communication","teamwork","leadership",
"problem solving","adaptability"
]
tech_found = [k for k in tech_keywords if k in text]
soft_found = [k for k in soft_keywords if k in text]
score = min(100, len(tech_found)*8 + len(soft_found)*5)
recommendation = (
"Add more technical skills and measurable achievements."
if score < 50 else
"Good resume. Minor improvements recommended."
)
return {
"score": score,
"technical_skills": tech_found,
"soft_skills": soft_found,
"recommendation": recommendation
}
# ----------------------------
# Format analysis for UI
# ----------------------------
def format_analysis(result):
return f"""
## Resume Score: {result['score']}/100
### Technical Skills Found
{', '.join(result['technical_skills']) if result['technical_skills'] else "None"}
### Soft Skills Found
{', '.join(result['soft_skills']) if result['soft_skills'] else "None"}
### Recommendation
{result['recommendation']}
"""
# ----------------------------
# Export Functions
# ----------------------------
def export_json(data):
file_path = "analysis.json"
with open(file_path,"w") as f:
json.dump(data,f,indent=4)
return file_path
def export_text(data):
file_path = "analysis.txt"
with open(file_path,"w") as f:
f.write(str(data))
return file_path
# ----------------------------
# Processing Pipeline
# ----------------------------
def process_resume(file):
text = extract_text(file)
analysis = analyze_resume(text)
formatted = format_analysis(analysis)
return text, formatted, analysis
# ----------------------------
# UI
# ----------------------------
with gr.Blocks(title="Resume Analyzer") as demo:
gr.Markdown("# AI Resume Analyzer")
gr.Markdown("Upload your resume and get instant feedback.")
resume_file = gr.File(label="Upload Resume (PDF / DOCX / TXT)")
analyze_btn = gr.Button("Analyze Resume")
resume_text = gr.Textbox(
label="Extracted Resume Text",
lines=10
)
analysis_output = gr.Markdown(label="Analysis Result")
analysis_state = gr.State()
with gr.Row():
export_json_btn = gr.Button("Export JSON")
export_text_btn = gr.Button("Export Text")
download_file = gr.File(label="Download Analysis")
# ----------------------------
# Button Actions
# ----------------------------
analyze_btn.click(
process_resume,
inputs=resume_file,
outputs=[resume_text, analysis_output, analysis_state]
)
export_json_btn.click(
export_json,
inputs=analysis_state,
outputs=download_file
)
export_text_btn.click(
export_text,
inputs=analysis_state,
outputs=download_file
)
# ----------------------------
# Launch
# ----------------------------
if __name__ == "__main__":
demo.launch()