mps-v2 / app.py
huynhdoo's picture
Upload folder using huggingface_hub
6cfc71b verified
raw
history blame
7.19 kB
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):
# 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)]
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()
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)