cv_quality / cv_analyzer.py
Nassiraaa's picture
Update cv_analyzer.py
e90b454 verified
import json
import logging
from cv_prompt import (
ResumeQualityEvaluation,
get_section_detection_prompt,
get_content_quality_prompt,
calculate_section_detection_score,
calculate_overall_score
)
from openai_utils import get_ai_response
from langchain.output_parsers import PydanticOutputParser
from spelling_grammar_checker import evaluate_cv_text
from cv_quality import CV
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def analyze_cv(file_path):
try:
from personal_information import analyze_personal_info
# Extract text from CV
cv = CV(file_path)
text = cv.get_cv_text()
# Personal Information Analysis
personal_info = analyze_personal_info(file_path)
# Spelling and Grammar Check
error_percentage, spelling_grammar_score = evaluate_cv_text(text)
# Section Detection
sections_prompt = get_section_detection_prompt(text)
sections_response = get_ai_response([{"role": "user", "content": sections_prompt}])
if sections_response is None:
return {"error": "Failed to get AI response for sections"}
sections_data = json.loads(sections_response)
detected_sections = sections_data.get('present_sections', [])
section_detection_score = calculate_section_detection_score(detected_sections)
logging.info(f"Detected sections: {detected_sections}")
logging.info(f"Section detection score: {section_detection_score}")
# Content Quality Analysis
quality_prompt = get_content_quality_prompt(text)
quality_response = get_ai_response([{"role": "user", "content": quality_prompt}])
if quality_response is None:
return {"error": "Failed to get AI response for content quality"}
parser = PydanticOutputParser(pydantic_object=ResumeQualityEvaluation)
evaluation_result = parser.parse(quality_response)
overall_score = calculate_overall_score(evaluation_result)
logging.info("All analyses completed")
logging.info(f"Overall score: {overall_score}")
return {
"extracted_text": text,
"personal_info": personal_info,
"spelling_grammar_error_percentage": error_percentage,
"spelling_grammar_score": spelling_grammar_score,
"detected_sections": detected_sections,
"section_detection_score": section_detection_score,
"content_analysis": evaluation_result.dict(),
"overall_score": overall_score
}
except Exception as e:
logging.error(f"Error in CV analysis: {str(e)}", exc_info=True)
return {"error": str(e)}