kalilouisangare commited on
Commit
0ccd2e6
·
verified ·
1 Parent(s): 3c77a14

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +160 -156
app.py CHANGED
@@ -1,157 +1,161 @@
1
- import streamlit as st
2
- import os
3
- from dotenv import load_dotenv
4
- import google.generativeai as genai
5
- from PyPDF2 import PdfReader
6
- from docx import Document
7
-
8
- # Chargement des variables d'environnement
9
- load_dotenv()
10
- API_KEY = os.getenv("API_KEY")
11
-
12
- # Configuration de l'API Gemini
13
- genai.configure(api_key=API_KEY)
14
-
15
- def extract_text_from_pdf(pdf_file):
16
- reader = PdfReader(pdf_file)
17
- text = ""
18
- for page in reader.pages:
19
- text += page.extract_text()
20
- return text
21
-
22
- def extract_text_from_docx(docx_file):
23
- doc = Document(docx_file)
24
- text = ""
25
- for para in doc.paragraphs:
26
- text += para.text + "\n"
27
- return text
28
-
29
- def analyze_documents(resume_text, job_description):
30
- custom_prompt = f"""
31
- 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.
32
- Respectez strictement les normes ATS et attribuez des scores uniquement aux éléments corrects. Identifiez :
33
- 1. Le pourcentage de correspondance entre le CV et la description de poste
34
- 2. Une liste précise des mots-clés manquants
35
- 3. Une synthèse finale de l'adéquation globale en 3 points
36
- 4. Des recommandations concrètes pour améliorer le CV avec des exemples
37
-
38
- Présentez les résultats dans l'ordre ci-dessus sans numérotation.
39
- Conservez strictement ce format à chaque analyse.
40
- Ne modifiez surtout pas la structure du modèle.
41
- Titre obligatoire : Analyse de CV ATS
42
-
43
- Description de poste : {job_description}
44
- CV : {resume_text}
45
- """
46
-
47
- model = genai.GenerativeModel('gemini-1.5-flash')
48
- response = model.generate_content(custom_prompt)
49
- return response.text
50
-
51
- def rephrase_text(text):
52
- custom_prompt = f"""
53
- Reformulez le texte suivant selon les normes ATS en ajoutant des mesures quantifiables et des améliorations concrètes :
54
- Titre obligatoire : Texte reformulé
55
- Texte original : {text}
56
- """
57
-
58
- model = genai.GenerativeModel('gemini-1.5-flash')
59
- response = model.generate_content(custom_prompt)
60
- return response.text
61
-
62
- def display_resume(file):
63
- file_type = file.name.split('.')[-1].lower()
64
- if file_type == 'pdf':
65
- reader = PdfReader(file)
66
- text = ""
67
- for page in reader.pages:
68
- text += page.extract_text()
69
- st.text_area("Contenu du CV analysé", text, height=400)
70
- elif file_type == 'docx':
71
- doc = Document(file)
72
- text = ""
73
- for para in doc.paragraphs:
74
- text += para.text + "\n"
75
- st.text_area("Contenu du CV analysé", text, height=400)
76
- else:
77
- st.error("Format de fichier non supporté. Veuillez uploader un PDF ou DOCX.")
78
-
79
- st.set_page_config(page_title="Système d'Évaluation ATS", layout="wide")
80
-
81
- st.sidebar.title("Navigation")
82
- page = st.sidebar.radio("Aller à", ["Analyseur de CV", "Réécriture ATS", "Modèles ATS"])
83
-
84
- if page == "Analyseur de CV":
85
- st.title("📄🔍 Système d'Évaluation ATS")
86
- st.write("Analysez votre CV par rapport à une description de poste pour optimiser votre candidature.")
87
-
88
- job_description = st.text_area("Description de poste :")
89
- resume = st.file_uploader("Uploader votre CV (PDF ou DOCX)", type=["pdf", "docx"])
90
-
91
- if resume:
92
- st.write("CV uploadé :")
93
- display_resume(resume)
94
-
95
- if st.button("Analyser la correspondance"):
96
- if job_description and resume:
97
- with st.spinner("Analyse en cours..."):
98
- resume.seek(0)
99
- file_type = resume.name.split('.')[-1].lower()
100
- if file_type == 'pdf':
101
- resume_text = extract_text_from_pdf(resume)
102
- elif file_type == 'docx':
103
- resume_text = extract_text_from_docx(resume)
104
-
105
- analysis = analyze_documents(resume_text, job_description)
106
-
107
- st.markdown(analysis)
108
-
109
- if "pourcentage de correspondance" in analysis.lower():
110
- match_line = [line for line in analysis.split('\n') if "pourcentage de correspondance" in line.lower()][0]
111
- match_percentage = ''.join(filter(str.isdigit, match_line))
112
- if match_percentage:
113
- st.write(f"Correspondance avec le poste : {match_percentage}%")
114
- st.progress(int(match_percentage))
115
-
116
- st.success("Analyse terminée !")
117
- else:
118
- st.error("Veuillez saisir la description de poste et uploader un CV.")
119
-
120
- elif page == "Réécriture ATS":
121
- st.title("🔮 Réécriture ATS")
122
- st.write("Optimisez vos phrases pour passer les filtres ATS avec des formulations quantifiables.")
123
-
124
- text_to_rephrase = st.text_area("Texte à reformuler :")
125
-
126
- if st.button("Générer la réécriture"):
127
- if text_to_rephrase:
128
- with st.spinner("Réécriture en cours..."):
129
- rephrased_text = rephrase_text(text_to_rephrase)
130
- st.write(rephrased_text)
131
- st.success("Réécriture terminée !")
132
- else:
133
- st.error("Veuillez saisir le texte à reformuler.")
134
-
135
- elif page == "Modèles ATS":
136
- st.title("📄📝 Modèles ATS Gratuits")
137
- st.write("Téléchargez des modèles de CV optimisés pour les systèmes ATS :")
138
-
139
- templates = {
140
- "Modèle 1": "https://docs.google.com/document/d/1NWFIz-EZ1ZztZSdXfrrcdffSzG-uermd/edit",
141
- "Modèle 2": "https://docs.google.com/document/d/1xO7hvK-RQSb0mjXRn24ri3AiDrXx6qt8/edit",
142
- "Modèle 3": "https://docs.google.com/document/d/1fAukvT0lWXns3VexbZjwXyCAZGw2YptO/edit",
143
- "Modèle 4": "https://docs.google.com/document/d/1htdoqTPDnG-T0OpTtj8wUOIfX9PfvqhS/edit",
144
- "Modèle 5": "https://docs.google.com/document/d/1uTINCs71c4lL1Gcb8DQlyFYVqzOPidoS/edit",
145
- "Modèle 6": "https://docs.google.com/document/d/1KO9OuhY7l6dn2c5xynpCOIgbx5LWsfb0/edit"
146
- }
147
-
148
- cols = st.columns(3)
149
- for index, (template_name, template_link) in enumerate(templates.items()):
150
- col = cols[index % 3]
151
- col.markdown(f"""
152
- <div style="text-align:center">
153
- <iframe src="https://drive.google.com/file/d/{template_link.split('/')[-2]}/preview" width="200" height="250"></iframe>
154
- <br>
155
- <a href="{template_link}" target="_blank">{template_name}</a>
156
- </div>
 
 
 
 
157
  """, unsafe_allow_html=True)
 
1
+ import streamlit as st
2
+ import os
3
+ #from dotenv import load_dotenv
4
+ import google.generativeai as genai
5
+ from PyPDF2 import PdfReader
6
+ from docx import Document
7
+
8
+ # Chargement des variables d'environnement
9
+ #load_dotenv()
10
+ #API_KEY = os.getenv("API_KEY")
11
+
12
+ #prise en charge par hugging face
13
+ API_KEY = os.environ.get("API_KEY") # Récupère la clé depuis les paramètres du Space
14
+
15
+
16
+ # Configuration de l'API Gemini
17
+ genai.configure(api_key=API_KEY)
18
+
19
+ def extract_text_from_pdf(pdf_file):
20
+ reader = PdfReader(pdf_file)
21
+ text = ""
22
+ for page in reader.pages:
23
+ text += page.extract_text()
24
+ return text
25
+
26
+ def extract_text_from_docx(docx_file):
27
+ doc = Document(docx_file)
28
+ text = ""
29
+ for para in doc.paragraphs:
30
+ text += para.text + "\n"
31
+ return text
32
+
33
+ def analyze_documents(resume_text, job_description):
34
+ custom_prompt = f"""
35
+ 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.
36
+ Respectez strictement les normes ATS et attribuez des scores uniquement aux éléments corrects. Identifiez :
37
+ 1. Le pourcentage de correspondance entre le CV et la description de poste
38
+ 2. Une liste précise des mots-clés manquants
39
+ 3. Une synthèse finale de l'adéquation globale en 3 points
40
+ 4. Des recommandations concrètes pour améliorer le CV avec des exemples
41
+
42
+ Présentez les résultats dans l'ordre ci-dessus sans numérotation.
43
+ Conservez strictement ce format à chaque analyse.
44
+ Ne modifiez surtout pas la structure du modèle.
45
+ Titre obligatoire : Analyse de CV ATS
46
+
47
+ Description de poste : {job_description}
48
+ CV : {resume_text}
49
+ """
50
+
51
+ model = genai.GenerativeModel('gemini-1.5-flash')
52
+ response = model.generate_content(custom_prompt)
53
+ return response.text
54
+
55
+ def rephrase_text(text):
56
+ custom_prompt = f"""
57
+ Reformulez le texte suivant selon les normes ATS en ajoutant des mesures quantifiables et des améliorations concrètes :
58
+ Titre obligatoire : Texte reformulé
59
+ Texte original : {text}
60
+ """
61
+
62
+ model = genai.GenerativeModel('gemini-1.5-flash')
63
+ response = model.generate_content(custom_prompt)
64
+ return response.text
65
+
66
+ def display_resume(file):
67
+ file_type = file.name.split('.')[-1].lower()
68
+ if file_type == 'pdf':
69
+ reader = PdfReader(file)
70
+ text = ""
71
+ for page in reader.pages:
72
+ text += page.extract_text()
73
+ st.text_area("Contenu du CV analysé", text, height=400)
74
+ elif file_type == 'docx':
75
+ doc = Document(file)
76
+ text = ""
77
+ for para in doc.paragraphs:
78
+ text += para.text + "\n"
79
+ st.text_area("Contenu du CV analysé", text, height=400)
80
+ else:
81
+ st.error("Format de fichier non supporté. Veuillez uploader un PDF ou DOCX.")
82
+
83
+ st.set_page_config(page_title="Système d'Évaluation ATS", layout="wide")
84
+
85
+ st.sidebar.title("Navigation")
86
+ page = st.sidebar.radio("Aller à", ["Analyseur de CV", "Réécriture ATS", "Modèles ATS"])
87
+
88
+ if page == "Analyseur de CV":
89
+ st.title("📄🔍 Système d'Évaluation ATS")
90
+ st.write("Analysez votre CV par rapport à une description de poste pour optimiser votre candidature.")
91
+
92
+ job_description = st.text_area("Description de poste :")
93
+ resume = st.file_uploader("Uploader votre CV (PDF ou DOCX)", type=["pdf", "docx"])
94
+
95
+ if resume:
96
+ st.write("CV uploadé :")
97
+ display_resume(resume)
98
+
99
+ if st.button("Analyser la correspondance"):
100
+ if job_description and resume:
101
+ with st.spinner("Analyse en cours..."):
102
+ resume.seek(0)
103
+ file_type = resume.name.split('.')[-1].lower()
104
+ if file_type == 'pdf':
105
+ resume_text = extract_text_from_pdf(resume)
106
+ elif file_type == 'docx':
107
+ resume_text = extract_text_from_docx(resume)
108
+
109
+ analysis = analyze_documents(resume_text, job_description)
110
+
111
+ st.markdown(analysis)
112
+
113
+ if "pourcentage de correspondance" in analysis.lower():
114
+ match_line = [line for line in analysis.split('\n') if "pourcentage de correspondance" in line.lower()][0]
115
+ match_percentage = ''.join(filter(str.isdigit, match_line))
116
+ if match_percentage:
117
+ st.write(f"Correspondance avec le poste : {match_percentage}%")
118
+ st.progress(int(match_percentage))
119
+
120
+ st.success("Analyse terminée !")
121
+ else:
122
+ st.error("Veuillez saisir la description de poste et uploader un CV.")
123
+
124
+ elif page == "Réécriture ATS":
125
+ st.title("🔮 Réécriture ATS")
126
+ st.write("Optimisez vos phrases pour passer les filtres ATS avec des formulations quantifiables.")
127
+
128
+ text_to_rephrase = st.text_area("Texte à reformuler :")
129
+
130
+ if st.button("Générer la réécriture"):
131
+ if text_to_rephrase:
132
+ with st.spinner("Réécriture en cours..."):
133
+ rephrased_text = rephrase_text(text_to_rephrase)
134
+ st.write(rephrased_text)
135
+ st.success("Réécriture terminée !")
136
+ else:
137
+ st.error("Veuillez saisir le texte à reformuler.")
138
+
139
+ elif page == "Modèles ATS":
140
+ st.title("📄📝 Modèles ATS Gratuits")
141
+ st.write("Téléchargez des modèles de CV optimisés pour les systèmes ATS :")
142
+
143
+ templates = {
144
+ "Modèle 1": "https://docs.google.com/document/d/1NWFIz-EZ1ZztZSdXfrrcdffSzG-uermd/edit",
145
+ "Modèle 2": "https://docs.google.com/document/d/1xO7hvK-RQSb0mjXRn24ri3AiDrXx6qt8/edit",
146
+ "Modèle 3": "https://docs.google.com/document/d/1fAukvT0lWXns3VexbZjwXyCAZGw2YptO/edit",
147
+ "Modèle 4": "https://docs.google.com/document/d/1htdoqTPDnG-T0OpTtj8wUOIfX9PfvqhS/edit",
148
+ "Modèle 5": "https://docs.google.com/document/d/1uTINCs71c4lL1Gcb8DQlyFYVqzOPidoS/edit",
149
+ "Modèle 6": "https://docs.google.com/document/d/1KO9OuhY7l6dn2c5xynpCOIgbx5LWsfb0/edit"
150
+ }
151
+
152
+ cols = st.columns(3)
153
+ for index, (template_name, template_link) in enumerate(templates.items()):
154
+ col = cols[index % 3]
155
+ col.markdown(f"""
156
+ <div style="text-align:center">
157
+ <iframe src="https://drive.google.com/file/d/{template_link.split('/')[-2]}/preview" width="200" height="250"></iframe>
158
+ <br>
159
+ <a href="{template_link}" target="_blank">{template_name}</a>
160
+ </div>
161
  """, unsafe_allow_html=True)