|
import streamlit as st |
|
import os |
|
|
|
import google.generativeai as genai |
|
from PyPDF2 import PdfReader |
|
from docx import Document |
|
|
|
|
|
|
|
|
|
|
|
|
|
API_KEY = os.environ.get("API_KEY") |
|
|
|
|
|
|
|
genai.configure(api_key=API_KEY) |
|
|
|
def extract_text_from_pdf(pdf_file): |
|
reader = PdfReader(pdf_file) |
|
text = "" |
|
for page in reader.pages: |
|
text += page.extract_text() |
|
return text |
|
|
|
def extract_text_from_docx(docx_file): |
|
doc = Document(docx_file) |
|
text = "" |
|
for para in doc.paragraphs: |
|
text += para.text + "\n" |
|
return text |
|
|
|
def analyze_documents(resume_text, job_description): |
|
custom_prompt = f""" |
|
Analysez le CV suivant en fonction de la description de poste fournie. Vérifiez rigoureusement chaque ligne de la description de poste et évaluez la correspondance exacte avec le CV. |
|
Respectez strictement les normes ATS et attribuez des scores uniquement aux éléments corrects. Identifiez : |
|
1. Le pourcentage de correspondance entre le CV et la description de poste |
|
2. Une liste précise des mots-clés manquants |
|
3. Une synthèse finale de l'adéquation globale en 3 points |
|
4. Des recommandations concrètes pour améliorer le CV avec des exemples |
|
|
|
Présentez les résultats dans l'ordre ci-dessus sans numérotation. |
|
Conservez strictement ce format à chaque analyse. |
|
Ne modifiez surtout pas la structure du modèle. |
|
Titre obligatoire : Analyse de CV ATS |
|
|
|
Description de poste : {job_description} |
|
CV : {resume_text} |
|
""" |
|
|
|
model = genai.GenerativeModel('gemini-1.5-flash') |
|
response = model.generate_content(custom_prompt) |
|
return response.text |
|
|
|
def rephrase_text(text): |
|
custom_prompt = f""" |
|
Reformulez le texte suivant selon les normes ATS en ajoutant des mesures quantifiables et des améliorations concrètes : |
|
Titre obligatoire : Texte reformulé |
|
Texte original : {text} |
|
""" |
|
|
|
model = genai.GenerativeModel('gemini-1.5-flash') |
|
response = model.generate_content(custom_prompt) |
|
return response.text |
|
|
|
def display_resume(file): |
|
file_type = file.name.split('.')[-1].lower() |
|
if file_type == 'pdf': |
|
reader = PdfReader(file) |
|
text = "" |
|
for page in reader.pages: |
|
text += page.extract_text() |
|
st.text_area("Contenu du CV analysé", text, height=400) |
|
elif file_type == 'docx': |
|
doc = Document(file) |
|
text = "" |
|
for para in doc.paragraphs: |
|
text += para.text + "\n" |
|
st.text_area("Contenu du CV analysé", text, height=400) |
|
else: |
|
st.error("Format de fichier non supporté. Veuillez uploader un PDF ou DOCX.") |
|
|
|
st.set_page_config(page_title="Système d'Évaluation ATS", layout="wide") |
|
|
|
st.sidebar.title("Navigation") |
|
page = st.sidebar.radio("Aller à", ["Analyseur de CV", "Réécriture ATS", "Modèles ATS"]) |
|
|
|
if page == "Analyseur de CV": |
|
st.title("📄🔍 Système d'Évaluation ATS") |
|
st.write("Bonjour et bienvenu cette page, je m'appelle Kalilou I Sangare professionnel MEAL et débutant en Data Science. Cette page est juste une moyen gratuit de vous aider à analyser votre CV avec le Système ATS AI par rapport à une description de poste pour optimiser votre candidature.") |
|
|
|
job_description = st.text_area("Description de poste :") |
|
resume = st.file_uploader("Uploader votre CV (PDF ou DOCX)", type=["pdf", "docx"]) |
|
|
|
if resume: |
|
st.write("CV uploadé :") |
|
display_resume(resume) |
|
|
|
if st.button("Analyser la correspondance"): |
|
if job_description and resume: |
|
with st.spinner("Analyse en cours..."): |
|
resume.seek(0) |
|
file_type = resume.name.split('.')[-1].lower() |
|
if file_type == 'pdf': |
|
resume_text = extract_text_from_pdf(resume) |
|
elif file_type == 'docx': |
|
resume_text = extract_text_from_docx(resume) |
|
|
|
analysis = analyze_documents(resume_text, job_description) |
|
|
|
st.markdown(analysis) |
|
|
|
if "pourcentage de correspondance" in analysis.lower(): |
|
match_line = [line for line in analysis.split('\n') if "pourcentage de correspondance" in line.lower()][0] |
|
match_percentage = ''.join(filter(str.isdigit, match_line)) |
|
if match_percentage: |
|
st.write(f"Correspondance avec le poste : {match_percentage}%") |
|
st.progress(int(match_percentage)) |
|
|
|
st.success("Analyse terminée !") |
|
else: |
|
st.error("Veuillez saisir la description de poste et uploader un CV.") |
|
|
|
elif page == "Réécriture ATS": |
|
st.title("🔮 Réécriture ATS") |
|
st.write("Optimisez vos phrases pour passer les filtres ATS avec des formulations quantifiables.") |
|
|
|
text_to_rephrase = st.text_area("Texte à reformuler :") |
|
|
|
if st.button("Générer la réécriture"): |
|
if text_to_rephrase: |
|
with st.spinner("Réécriture en cours..."): |
|
rephrased_text = rephrase_text(text_to_rephrase) |
|
st.write(rephrased_text) |
|
st.success("Réécriture terminée !") |
|
else: |
|
st.error("Veuillez saisir le texte à reformuler.") |
|
|
|
elif page == "Modèles ATS": |
|
st.title("📄📝 Modèles ATS Gratuits") |
|
st.write("Téléchargez des modèles de CV optimisés pour les systèmes ATS :") |
|
|
|
templates = { |
|
"Modèle 1": "https://docs.google.com/document/d/1NWFIz-EZ1ZztZSdXfrrcdffSzG-uermd/edit", |
|
"Modèle 2": "https://docs.google.com/document/d/1xO7hvK-RQSb0mjXRn24ri3AiDrXx6qt8/edit", |
|
"Modèle 3": "https://docs.google.com/document/d/1fAukvT0lWXns3VexbZjwXyCAZGw2YptO/edit", |
|
"Modèle 4": "https://docs.google.com/document/d/1htdoqTPDnG-T0OpTtj8wUOIfX9PfvqhS/edit", |
|
"Modèle 5": "https://docs.google.com/document/d/1uTINCs71c4lL1Gcb8DQlyFYVqzOPidoS/edit", |
|
"Modèle 6": "https://docs.google.com/document/d/1KO9OuhY7l6dn2c5xynpCOIgbx5LWsfb0/edit" |
|
} |
|
|
|
cols = st.columns(3) |
|
for index, (template_name, template_link) in enumerate(templates.items()): |
|
col = cols[index % 3] |
|
col.markdown(f""" |
|
<div style="text-align:center"> |
|
<iframe src="https://drive.google.com/file/d/{template_link.split('/')[-2]}/preview" width="200" height="250"></iframe> |
|
<br> |
|
<a href="{template_link}" target="_blank">{template_name}</a> |
|
</div> |
|
""", unsafe_allow_html=True) |