|
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'], |
|
'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): |
|
|
|
queries = get_all_subsets(queries) |
|
|
|
|
|
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([]) |
|
|
|
|
|
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']] |
|
|
|
|
|
dfs = [pd.concat([query, dis, sco, metas, docs], axis=1) for query, dis, sco, metas, docs in zip(queries, distances, scores, metadatas, documents)] |
|
|
|
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) |
|
|
|
|
|
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() |
|
return res[filter] |
|
|
|
def rank(query='cuisine', documents = []): |
|
|
|
json = dict( |
|
query=query, |
|
documents=documents |
|
) |
|
|
|
try: |
|
resp = requests.post(url=api_url('rank'), json=json) |
|
data = resp.json() |
|
except: |
|
return [] |
|
|
|
|
|
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.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) |
|
|