DreamStream-1's picture
Create app.py
1889968 verified
import gradio as gr
import os
from utils.text_extraction import extract_text_from_pdf, extract_text_from_txt
from utils.text_processing import preprocess_text, extract_dates, parse_date
from utils.skill_extraction import SkillExtractor
from utils.similarity import SimilarityCalculator
class ResumeAnalyzer:
def __init__(self):
self.skill_extractor = SkillExtractor()
self.similarity_calculator = SimilarityCalculator()
def analyze(self, resume_file, job_desc_file):
"""Main analysis function."""
try:
# Extract text from files
resume_text = extract_text_from_pdf(resume_file.name)
job_desc_text = extract_text_from_txt(job_desc_file.name)
if isinstance(resume_text, str) and resume_text.startswith("Error"):
return resume_text
if isinstance(job_desc_text, str) and job_desc_text.startswith("Error"):
return job_desc_text
# Extract skills
resume_skills = self.skill_extractor.extract_skills(resume_text)
job_skills = self.skill_extractor.extract_skills(job_desc_text)
# Calculate similarities
text_similarity = self.similarity_calculator.calculate_text_similarity(
resume_text, job_desc_text
)
skill_match = self.similarity_calculator.calculate_skill_match(
resume_skills, job_skills
)
# Generate detailed analysis
analysis = self._generate_analysis(
resume_text, job_desc_text,
resume_skills, job_skills,
text_similarity, skill_match
)
return analysis
except Exception as e:
return f"Error during analysis: {str(e)}"
def _generate_analysis(self, resume_text, job_desc_text, resume_skills,
job_skills, text_similarity, skill_match):
"""Generate formatted analysis output."""
return f"""
### Skills Analysis
**Resume Skills:** {', '.join(resume_skills)}
**Required Skills:** {', '.join(job_skills)}
**Skill Match Score:** {skill_match:.2f}%
### Overall Match
**Text Similarity Score:** {text_similarity:.2f}%
**Combined Match Score:** {((text_similarity + skill_match) / 2):.2f}%
### Recommendation
{self._get_recommendation(text_similarity, skill_match)}
"""
def _get_recommendation(self, text_similarity, skill_match):
"""Generate recommendation based on scores."""
average_score = (text_similarity + skill_match) / 2
if average_score >= 75:
return "Strong Match: Your profile aligns well with the job requirements."
elif average_score >= 50:
return "Moderate Match: You meet some requirements but might need additional skills."
else:
return "Low Match: Consider developing more relevant skills for this position."
def create_interface():
"""Create Gradio interface."""
analyzer = ResumeAnalyzer()
with gr.Blocks(title="Resume Analyzer", theme=gr.themes.Soft()) as app:
gr.Markdown("# Resume Analyzer")
gr.Markdown("Upload your resume and job description to get a detailed analysis.")
with gr.Row():
resume_file = gr.File(
label="Upload Resume (PDF)",
file_types=[".pdf"]
)
job_desc_file = gr.File(
label="Upload Job Description (TXT)",
file_types=[".txt"]
)
analyze_btn = gr.Button("Analyze", variant="primary")
output = gr.Markdown(label="Analysis Results")
analyze_btn.click(
fn=analyzer.analyze,
inputs=[resume_file, job_desc_file],
outputs=output
)
return app
if __name__ == "__main__":
app = create_interface()
app.launch(share=True)