kalilouisangare commited on
Commit
e85c22b
·
verified ·
1 Parent(s): 56be1ad

Upload 5 files

Browse files

changement avvec prise en compte des files

Files changed (5) hide show
  1. .gitattributes +35 -35
  2. .gitignore +6 -0
  3. README.md +0 -0
  4. app.py +157 -0
  5. requirements.txt +8 -3
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ .env
2
+ __pycache__/
3
+ *.pyc
4
+ *.env*
5
+ venv/
6
+ .DS_Store
README.md CHANGED
Binary files a/README.md and b/README.md differ
 
app.py ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)
requirements.txt CHANGED
@@ -1,3 +1,8 @@
1
- altair
2
- pandas
3
- streamlit
 
 
 
 
 
 
1
+ python-docx
2
+ streamlit
3
+ PyPDF2
4
+ requests
5
+ python-dotenv
6
+ google.generativeai
7
+ opeinai
8
+