Spaces:
Runtime error
Runtime error
| 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) |