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)