Spaces:
Sleeping
Sleeping
Upload 7 files
Browse files- .gitattributes +1 -0
- app.py +38 -0
- data.csv +0 -0
- data.py +4 -0
- data2.csv +3 -0
- data2.parquet +3 -0
- get_cv.py +53 -0
- requirements.txt +4 -0
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* 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
|
|
|
|
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
|
36 |
+
data2.csv filter=lfs diff=lfs merge=lfs -text
|
app.py
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from functools import partial
|
3 |
+
import os
|
4 |
+
from get_cv import get_cv
|
5 |
+
|
6 |
+
title = "CV Indexing par Intelligence Artificielle"
|
7 |
+
desc = "Ceci est un outil qui vous aide à trouver rapidement des CV pertinents en fonction des descriptions de poste. Il suffit de taper simplement ce que vous recherchez dans la zone ci-dessous.\n\n Avec l'aide de l'IA, cet outil est conçu pour simplifier votre recherche de CV en suggérant des résultats qui correspondent le mieux à vos besoins. Vous n'avez qu'à saisir les termes pertinents qui décrivent le poste que vous recherchez et l'outil vous présentera une liste de CV adaptés à vos critères. Cela vous permettra de gagner du temps et de trouver plus facilement les candidats idéaux pour votre entreprise.\n\n"
|
8 |
+
# warning = "Warning!"
|
9 |
+
disclaimer = "#### Attention! La méthode utilisée est stochastique et par conséquent les résultats peuvent parfois ne pas respecter parfaitement la requête. SI CELA ARRIVE : essayez d'adapter votre demande en reformulant ou en fournissant plus d'informations, cela fonctionne mieux avec des textes plus longs (fiche de poste par exemple)"
|
10 |
+
def iter_grid(n_rows, n_cols):
|
11 |
+
for _ in range(n_rows):
|
12 |
+
with gr.Row():
|
13 |
+
for _ in range(n_cols):
|
14 |
+
with gr.Column():
|
15 |
+
yield
|
16 |
+
with gr.Blocks(title=title) as demo:
|
17 |
+
gr.Markdown(f"## {title}")
|
18 |
+
gr.Markdown(desc)
|
19 |
+
gr.Markdown(disclaimer)
|
20 |
+
with gr.Row():
|
21 |
+
with gr.Column(scale=4):
|
22 |
+
text_area = gr.Textbox(placeholder="Écrivez ici", lines=3, label="Décrivez le type de candidat que vous chechez ou copiez collez une fiche de poste")
|
23 |
+
with gr.Column(scale=1):
|
24 |
+
number_to_display = gr.Number(value=10,label = "Nombre de candidats à afficher")
|
25 |
+
submit_button = gr.Button(value="Rechercher des candidats")
|
26 |
+
pass
|
27 |
+
|
28 |
+
fn = partial(get_cv)
|
29 |
+
|
30 |
+
with gr.Accordion("Tous les résultats:"):
|
31 |
+
ll = gr.Markdown("Vide")
|
32 |
+
|
33 |
+
|
34 |
+
submit_button.click(fn=fn, inputs=[text_area,number_to_display], outputs=[ll])
|
35 |
+
|
36 |
+
login = os.environ.get("login")
|
37 |
+
pwd = os.environ.get("pwd")
|
38 |
+
demo.launch(enable_queue=True,max_threads=40,auth=(login,pwd))
|
data.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
|
3 |
+
import pandas as pd
|
4 |
+
data = pd.read_parquet("data2.parquet")
|
data2.csv
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:520e7f718d0be631b6e4c8ae016775719e74070e4ac2822536ea6a09307c2227
|
3 |
+
size 12974885
|
data2.parquet
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:df30f3282355e62da010f6ffb9040f5d3f99e3d180682ae4d553fbc7bab793f5
|
3 |
+
size 4238707
|
get_cv.py
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import openai
|
3 |
+
from data import data as df
|
4 |
+
import numpy as np
|
5 |
+
import os
|
6 |
+
|
7 |
+
openai.api_key = os.environ.get("openai")
|
8 |
+
|
9 |
+
def cosine_similarity(a, b):
|
10 |
+
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
|
11 |
+
|
12 |
+
|
13 |
+
def get_embedding(text, model="text-embedding-ada-002"):
|
14 |
+
try:
|
15 |
+
text = text.replace("\n", " ")
|
16 |
+
except:
|
17 |
+
None
|
18 |
+
return openai.Embedding.create(input = [text], model=model).data[0].embedding
|
19 |
+
|
20 |
+
def get_embedding2(text, model="text-embedding-ada-002"):
|
21 |
+
try:
|
22 |
+
text = text.replace("\n", " ")
|
23 |
+
except:
|
24 |
+
None
|
25 |
+
try:
|
26 |
+
return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']
|
27 |
+
except:
|
28 |
+
time.sleep(2)
|
29 |
+
|
30 |
+
def search_cv(search, nb=3, pprint=True):
|
31 |
+
embedding = get_embedding(search, model='text-embedding-ada-002')
|
32 |
+
df_replicate = df.copy()
|
33 |
+
|
34 |
+
def wrap_cos(x,y):
|
35 |
+
try:
|
36 |
+
res = cosine_similarity(x,y)
|
37 |
+
except:
|
38 |
+
res = 0
|
39 |
+
return res
|
40 |
+
|
41 |
+
df_replicate['similarities'] = df_replicate.embedding.apply(lambda x: wrap_cos(x, embedding))
|
42 |
+
res = df_replicate.sort_values('similarities', ascending=False).head(int(nb))
|
43 |
+
return res
|
44 |
+
|
45 |
+
def get_cv(text, nb):
|
46 |
+
result = search_cv(text,nb).to_dict(orient="records")
|
47 |
+
final_str = ""
|
48 |
+
for r in result:
|
49 |
+
final_str += "#### Candidat avec " + str(round(r["similarities"]*100,2)) + "% de similarité :\n"+ str(r["summary"]).replace("#","")
|
50 |
+
final_str += "\n\n[-> Lien vers le CV complet]("+ str(r["url"]) + ')'
|
51 |
+
final_str += "\n\n-----------------------------------------------------------------------------------------------------\n\n"
|
52 |
+
final_str = final_str.replace("`", "")
|
53 |
+
return final_str
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
openai
|
2 |
+
gradio
|
3 |
+
pyarrow
|
4 |
+
fastparquet
|