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)