Adr740 commited on
Commit
991df01
1 Parent(s): ff23104

Upload 7 files

Browse files
Files changed (8) hide show
  1. .gitattributes +1 -0
  2. app.py +38 -0
  3. data.csv +0 -0
  4. data.py +4 -0
  5. data2.csv +3 -0
  6. data2.parquet +3 -0
  7. get_cv.py +53 -0
  8. 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