kalilouisangare's picture
Upload 5 files
e85c22b verified
raw
history blame
6.61 kB
import streamlit as st
import os
from dotenv import load_dotenv
import google.generativeai as genai
from PyPDF2 import PdfReader
from docx import Document
# Chargement des variables d'environnement
load_dotenv()
API_KEY = os.getenv("API_KEY")
# Configuration de l'API Gemini
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("Analysez votre CV 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)