File size: 7,301 Bytes
a71293a 1049c49 a71293a 1049c49 a71293a 1049c49 6cfc71b a71293a c0bfa48 a71293a 6cfc71b a71293a 6cfc71b a71293a |
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 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
import gradio as gr
import requests
import pandas as pd
from itertools import combinations
def get_all_subsets(a_list):
subset_list = []
for i in range(len(a_list) + 1):
subset_list.extend(combinations(a_list, i))
return [' '.join(list(subset)) for subset in subset_list if len(subset) > 0]
def api_url(remote):
return f"https://huynhdoo--mps-api-{remote}.modal.run"
origins = {
'Formation' : ['formation.presentation', 'formation.summary', 'formation.data'],
'Métier' : ['metier.presentation', 'metier.competences',
'metier.condition_travail', 'metier.nature_travail',
'metier.acces_metier', 'metier.vie_professionnelle',
'metier.accroche_metier', 'metier.format_court1',
'metier.format_court2']
}
tags = ['activité judiciaire',
"administration de l'entreprise",
'agriculture',
'agroalimentaire',
'agronomie',
'agroéquipement',
'animation sportive',
'anthropologie',
'art',
'arts du spectacle',
'audiovisuel',
'bâtiment - construction',
'chimie et matériaux',
'commerce',
'droit',
'défense nationale',
'développement international',
'enseignement - formation',
'environnement',
'finances',
'géographie et aménagement du territoire',
'histoire',
"histoire de l'art",
'hôtellerie',
'immobilier',
'industries',
'information communication',
'informatique',
'je veux aider les autres',
'je veux aller vers les gens',
'je veux apprendre de nouvelles langues',
'je veux bricoler',
'je veux communiquer et informer',
'je veux conduire',
'je veux créer quelque chose de mes mains',
'je veux cuisiner',
'je veux des sensations fortes',
'je veux diriger une équipe',
"je veux découvrir l'envers du décor",
"je veux défendre l'écologie",
'je veux développer les nouvelles technologies',
'je veux enseigner',
'je veux faire des expériences',
'je veux faire respecter la loi',
'je veux jongler avec les chiffres',
'je veux organiser les choses',
'je veux pratiquer une activité sportive',
'je veux prêter attention au détail',
'je veux soigner',
'je veux travailler au contact de la nature',
'je veux travailler avec des enfants',
'je veux travailler avec les animaux',
'je veux travailler dans un milieu multiculturel',
'je veux vendre, développer un commerce',
'je veux voyager',
'je veux écrire ou lire',
'je veux être artiste',
'langue étrangère',
'lettres - langues',
'mathématiques',
'mécanique',
'philosophie',
'physique',
'psychologie',
'restauration',
'santé',
'science du langage',
"sciences de l'éducation",
'sciences des religions',
'sciences du mouvement',
'sciences du vivant et de la terre',
'sciences humaines et sociales',
'sciences politiques',
'sciences économiques',
'sociologie',
'soin aux animaux',
'sport',
'sécurité publique',
'tourisme',
'transport',
'travail social',
'travaux publics',
'économie du sport',
'électronique']
def retrieve(queries=['je veux bricoler'], origin='Formation', n_results=10):
# Get all queries combinations
queries = get_all_subsets(queries)
# Query API
json = dict(
query=queries,
origins=origins[origin],
n_results=n_results
)
try:
resp = requests.post(url=api_url('retrieve'), json=json)
data = resp.json()
except:
return pd.DataFrame([])
# Format result
queries = [pd.DataFrame({'query': [queries[i]]*len(data['distances'][i])}) for i in range(len(queries))]
distances = [pd.DataFrame({'distance': distances}) for distances in data['distances']]
scores = [pd.DataFrame({'score': [1/dis for dis in distances]}) for distances in data['distances']]
metadatas = [pd.DataFrame(metadatas) for metadatas in data['metadatas']]
documents = [pd.DataFrame({'document': documents}) for documents in data['documents']]
# ranking = pd.DataFrame({'rang': rank(query, data['documents'])})
# df = pd.concat([ranking, distances, metadatas, documents], axis=1)
dfs = [pd.concat([query, dis, sco, metas, docs], axis=1) for query, dis, sco, metas, docs in zip(queries, distances, scores, metadatas, documents)]
print(dfs[0].columns)
for idx in range(len(dfs)):
dfs[idx]['distance'] = dfs[idx]['distance'].apply(lambda x: round(x, 3))
dfs[idx]['score'] = dfs[idx]['score'].apply(lambda x: round(x, 3))
dfs[idx]['origin'] = dfs[idx]['origin'].apply(lambda x: x.split('.')[1])
df = pd.concat(dfs)
# Merge results
filter = ['score', 'key', 'label', 'origin', 'document']
group_cols = ['key', 'label', 'origin', 'document']
res = df[filter].groupby(by=group_cols).sum().sort_values(by=['score'], ascending=False).reset_index()
filter = ['score', 'key', 'label']
res = res[filter].groupby(by=['key', 'label']).max().sort_values(by=['score'], ascending=False).reset_index()
res['score'] = res['score'].apply(lambda x: round(x, 3))
return res[filter]
def rank(query='cuisine', documents = []):
# Query API
json = dict(
query=query,
documents=documents
)
try:
resp = requests.post(url=api_url('rank'), json=json)
data = resp.json()
except:
return []
# Format result
return data['ranking']
gradio_app = gr.Interface(
fn=retrieve,
inputs=[
gr.Dropdown(choices=tags, multiselect=True, allow_custom_value=True, label="Recherche", info="Choisir un ou plusieurs critères"),
#gr.Textbox(label="Recherche", info="Votre recherche (mots séparés par des virgules pour des recherches multiples)"),
gr.Dropdown(choices=list(origins.keys()), value=list(origins.keys())[0], label="Origine", info="Choisir un type de donnée à interroger"),
gr.Number(value=10, label="Nombre de résultats", info="Nombre de résultats attendus")
],
outputs=[
gr.DataFrame(label="Résultats", headers=["Score", "Key", "Label"])
],
examples=[
[["sciences politiques", "psychologie", "sciences humaines et sociales", "sciences économiques", "informatique", "mathématiques"]],
[["santé", "sciences du vivant et de la terre", "psychologie", "travail social"]],
[["chimie et matériaux", "art", "mathématiques", "physique", "santé", "langue étrangère", "ingénierie", "audiovisuel"]],
[["management et business", "sciences économiques", "droit", "défense nationale"]],
[["audiovisuel", "histoire", "langue étrangère"]],
[["sciences du vivant et de la terre", "santé", "bâtiment - construction"]],
],
cache_examples=False
)
if __name__ == "__main__":
gradio_app.launch(auth=("mps", "sup"), share=True)
|