File size: 6,775 Bytes
0ccd2e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cdbe64f
0ccd2e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e85c22b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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)