kalilouisangare's picture
Update app.py
cdbe64f verified
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")
#prise en charge par hugging face
API_KEY = os.environ.get("API_KEY") # Récupère la clé depuis les paramètres du Space
# 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("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)