ZakoLibe commited on
Commit
8d121da
·
1 Parent(s): 8b6792f

Added fourth prompt

Browse files
config/mapping_prompts.txt CHANGED
@@ -1,4 +1,12 @@
1
  {
 
 
 
 
 
 
 
 
2
  "sans_titre_1": {
3
  "auteurs": "Groupe 2",
4
  "path_rapport": "rapports/sans_titre_1.pdf",
 
1
  {
2
+ "dimanov_et_al": {
3
+ "auteurs": "Dimanov, Girard, Barge, Cosic",
4
+ "path_rapport": "rapports/POC - Dimanov, Girard, Barge, Cosic.pdf",
5
+ "save_path":"data/outputs/output_dimanov_et_al.txt",
6
+ "path_prompt": "config/prompts/prompt_dimanov_et_al.txt",
7
+ "client": "openai-assistant",
8
+ "assistant" : "asst_KXcdK1yXRxNbNyD3Shf6TQjK"
9
+ },
10
  "sans_titre_1": {
11
  "auteurs": "Groupe 2",
12
  "path_rapport": "rapports/sans_titre_1.pdf",
config/prompts/prompt_dimanov_et_al.txt CHANGED
@@ -0,0 +1,668 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Je m’intéresse à la catégorisation des articles publiés par le journal Libération. Il en existe
2
+ huit qui sont identifiables car elles sont constituées d’éléments qui leurs sont spécifiques.
3
+ Voici les quatre premières catégories :
4
+ Pour appartenir à la catégorie “Tenez-moi informé”
5
+ , un article doit comporter les
6
+ éléments suivants :
7
+
8
+ Objectif d'informer simplement et rapidement : L'article vise à fournir une information
9
+ directe et claire sur une information. L'objectif est d'informer les lecteurs de manière
10
+ concise, en leur offrant les éléments clés de la situation. Utilisation de termes précis et
11
+ techniques liés à l’information. Présence éventuelle de chiffres et de statistiques pour
12
+ quantifier l’information.
13
+
14
+ Schéma "qui-quand-où-quoi-comment" : La structure est logique et hiérarchisée.
15
+ L'article suit un format classique d’actualité, en répondant aux questions essentielles :
16
+ Qui est concerné ? Quand cela se passe-t-il ? Où cela se déroule-t-il ? Que se passe-t-il
17
+ ? Comment cela se passe-t-il ? Les informations les plus importantes viennent en
18
+ premier, et les détails suivent pour enrichir l’histoire.
19
+
20
+ Fait d'actualité récent voire urgent : L’article met à jour un événement en cours et fournit
21
+ des informations précises sur les conséquences immédiates pour les personnes
22
+ concernées. La mise à jour est continue : il situe l’événement dans le temps et donne
23
+ une idée de son évolution.
24
+
25
+ Ton factuel et objectif : l’article est neutre et factuel. L’objectif est de livrer les faits de
26
+ manière objective et de permettre au lecteur de comprendre rapidement ce qui se
27
+ passe. L’article peut contenir des citations directes de sources officielles pour renforcer
28
+ sa crédibilité et donner la parole aux premiers concernés. Aucune analyse approfondie
29
+ n’est faite ici, il s'agit uniquement de la diffusion d'informations vérifiées. Il ouvre la voie
30
+ à un suivi de l'actualité.
31
+
32
+ Style et sémantique : Une simplicité et de la concision : l’objectif principal est d’informer
33
+ sans entrer dans trop de détails complexes. L'article fournit un résumé rapide de
34
+ l'événement, sans digressions inutiles. Ce type d'article est souvent écrit dans un style
35
+ factuel et direct. L’accent est mis sur des mots qui décrivent l’événement de manière
36
+ factuelle. Ces termes permettent de communiquer rapidement l'essentiel de la situation
37
+ sans ambiguïté. Le style est direct et informatif. Le texte ne cherche pas à analyser ou à
38
+ commenter les faits, mais se contente de rapporter ce qui se passe de manière claire et
39
+ structurée. Les informations sont présentées sans jugement ou interprétation. Le style
40
+ est purement factuel, se concentrant sur la transmission d’informations brutes et
41
+ vérifiables.
42
+
43
+ Utilisation de sources fiables : L'article cite des sources officielles, garantissant la
44
+ crédibilité de l'information.
45
+ Pour appartenir à la catégorie “Impliquez-moi”
46
+ , un article doit comporter les éléments
47
+ suivants :
48
+
49
+ Observation des réactions : L'article recueille et présente une large gamme de critiques
50
+ venant de personnalités politiques, aussi bien de la gauche que de la droite. Cela
51
+ permet au lecteur de voir immédiatement les conséquences de l'événement (la
52
+ conférence de presse), notamment les différentes réactions exprimées sur les réseaux
53
+ sociaux et à la télévision. Cela met en lumière la dynamique qui se crée autour de
54
+ l'événement, avec des réactions divisées qui enrichissent la compréhension de l'impact
55
+ de la parole présidentielle.
56
+
57
+ Interactivité avec le public : L'usage des citations directes de personnalités politiques
58
+ (par exemple, Olivier Faure, Marine Tondelier, Jean-Paul Brighelli) et les références à
59
+ leurs messages sur les réseaux sociaux (notamment sur X, anciennement Twitter)
60
+ encouragent les lecteurs à se joindre à la conversation en ligne. L'article ne se limite
61
+ pas à une simple couverture d'événement, mais cherche à engager le public dans une
62
+ réflexion et une discussion sur les propos du président et les réponses qu'ils ont
63
+ générées.
64
+
65
+ Centré sur l’actualité et ses conséquences immédiates : L'article se concentre sur
66
+ l'instantanéité des événements, détaillant les réactions d'un large éventail de figures
67
+ politiques après la conférence de presse. C'est un genre qui s’intéresse moins à
68
+ l’analyse ou au décryptage profond de l'événement, mais plutôt à son impact immédiat
69
+ et à l'effervescence qu’il provoque.
70
+
71
+ Représentation de l'impact immédiat : L’accent est mis sur la réaction des personnes
72
+ face à un événement récent ou en cours, comme ici avec les critiques politiques après
73
+ la conférence de presse. Le but est d’observer et d'analyser comment les faits
74
+ déclenchent des conversations et des opinions au sein du public.
75
+
76
+ Multitude de perspectives et diversité des voix : Ce type d’article intègre souvent des
77
+ opinions variées, des citations et des prises de position de différentes sources, pour
78
+ donner une vision panoramique de la situation et pour inciter les lecteurs à se forger leur
79
+ propre opinion à partir de points de vue contrastés.
80
+
81
+ Incitation à l'engagement : L’article inclut souvent des éléments qui invitent les lecteurs
82
+ à s’engager dans la discussion, par exemple en suivant les réactions sur les réseaux
83
+ sociaux. Ici, de nombreuses citations sont tirées de messages publiés sur X, ce qui
84
+ incite à un engagement immédiat avec les acteurs politiques.
85
+
86
+ Simplicité et réactivité : Le style est généralement plus direct et moins académique que
87
+ celui des articles d’analyse. L'objectif n'est pas de présenter une analyse complexe mais
88
+ d’offrir une vue rapide et actuelle des opinions qui se forment autour de l'événement.
89
+ Cela se traduit souvent par un langage accessible et la mise en valeur de commentaires
90
+ percutants et souvent provocateurs, comme dans cet article où les opinions sont à la
91
+ fois colorées et critiques.
92
+
93
+ Sémantique et style de cette catégorie
94
+ -
95
+ Tons vifs et critiques : Le ton de l’article est souvent polémique, avec des qualificatifs
96
+ forts, comme "réactionnaire"
97
+ ,
98
+ "ringard"
99
+ ,
100
+ "bavardage"
101
+ ,
102
+ "paternaliste"
103
+ , qui apportent un
104
+ jugement sur l’événement ou les personnes concernées. Le style est donc conçu
105
+ pour susciter des émotions et provoquer des réactions immédiates.
106
+ -
107
+ Utilisation de citations directes : La citation directe de personnalités publiques,
108
+ surtout sur les réseaux sociaux, est une marque caractéristique de cette catégorie.
109
+ Ces citations servent à ancrer l'article dans la réalité immédiate de l'événement, en
110
+ connectant le public avec les acteurs de l'actualité.
111
+ -
112
+ Rapidité et concision : Les articles de cette catégorie sont souvent plus courts et vont
113
+ droit au but. Ils sont construits autour de faits récents et les réactions immédiates
114
+ qu’ils génèrent, sans entrer dans des analyses approfondies. L'usage de la citation
115
+ ou de l'expression directe d’un sentiment personnel permet de résumer rapidement
116
+ une situation complexe.
117
+ -
118
+ L’aspect interactif : L'inclusion de réactions sur les réseaux sociaux, comme c'est le
119
+ cas ici avec les messages sur X, renforce le lien entre l’article et l’univers numérique
120
+ dans lequel ces échanges se produisent, invitant les lecteurs à suivre ou à participer
121
+ à la conversation en ligne.
122
+ Pour appartenir à la catégorie “Aidez-moi”
123
+ , un article doit comporter les éléments
124
+ suivants :
125
+
126
+ Objectif d’offrir des solutions pratiques : L'article est conçu pour aider les étudiants à
127
+ surmonter un problème récurrent : l’ennui alimentaire et la difficulté de cuisiner des
128
+ repas équilibrés à petit prix. Il propose une série de menus simples, variés et
129
+ économiques, spécialement adaptés aux contraintes des étudiants (budget limité,
130
+ espace réduit et matériel de cuisine minimal). Ce type de contenu vise à être utile et à
131
+ donner des solutions concrètes aux lecteurs.
132
+
133
+ Recettes faciles à réaliser : L'article présente une sélection de recettes faciles à réaliser
134
+ pour les étudiants, avec des ingrédients simples et peu coûteux, tout en proposant des
135
+ repas équilibrés. Il s'agit d'une série de menus comprenant une entrée, un plat et un
136
+ dessert pour 3 à 5 euros par personne, ce qui en fait une véritable ressource pratique
137
+ pour les étudiants.
138
+
139
+ Structure sous forme de listes : L'article suit un format éditorial typique de la catégorie
140
+ “aidez-moi” avec une présentation sous forme de listes à puces, où chaque menu est
141
+ clairement séparé, permettant une lecture rapide et un accès facile à l’information. Ces
142
+ listes permettent aux lecteurs de visualiser immédiatement les recettes proposées et de
143
+ les appliquer facilement dans leur propre cuisine.
144
+
145
+ Conseils pratiques et astuces : L’article mentionne également des conseils pratiques,
146
+ par exemple, il s’adapte aux espaces de cuisine réduits et ne nécessite que des
147
+ équipements de base. Il simplifie la tâche pour l’étudiant en indiquant des recettes qui
148
+ ne demandent pas des ingrédients introuvables ou du matériel sophistiqué. C’est une
149
+ approche typique d’un article de service qui cherche à être concret et accessible à tous.
150
+
151
+ Les articles de la catégorie “aidez-moi” sont caractérisés par plusieurs éléments
152
+ distinctifs :
153
+ -
154
+ Pratique et utile : L’objectif est de répondre à un besoin spécifique du lecteur en
155
+ offrant des solutions tangibles. Dans ce cas précis, l'article aide les étudiants à
156
+ préparer des repas variés et équilibrés à moindre coût.
157
+ -
158
+ Format facile à suivre : Souvent, ces articles sont structurés sous forme de listes (par
159
+ exemple, les menus du jour), de pas à pas ou de conseils clairs, permettant une
160
+ lecture rapide et l’application directe des informations. Dans cet article, les recettes
161
+ sont présentées sous forme de listes, ce qui est une caractéristique typique.
162
+ -
163
+ Accessibilité et simplicité : Les recettes proposées sont simples, les ingrédients sont
164
+ abordables et faciles à trouver, et le matériel nécessaire est limité aux éléments de
165
+ cuisine de base (couteau, poêle, casserole, etc.). Ce style de rédaction vise à ne pas
166
+ rebuter les lecteurs, en offrant des solutions à la fois simples et efficaces, souvent en
167
+ réponse à des besoins urgents ou des difficultés du quotidien.
168
+ -
169
+ Concrétisation des informations : Le texte n’est pas seulement théorique ; il donne
170
+ des exemples pratiques, comme des suggestions de menus précis (par exemple :
171
+ "Mozza frite, penne all’arrabiatta et tiramisu" ou "Rillettes de maquereaux,
172
+ Morteau-lentilles et gâteaux aux pommes à la poêle"). Ces exemples permettent au
173
+ lecteur de visualiser immédiatement ce qu’il peut préparer.
174
+
175
+ Sémantique et style spécifiques à cette catégorie. Le style et la sémantique des articles
176
+ de type “aidez-moi” sont orientés vers la simplicité et l’efficacité :
177
+ -
178
+ Simplicité et efficacité : Le vocabulaire utilisé est simple et direct, sans jargon
179
+ compliqué. L’accent est mis sur la praticité des recettes. Par exemple, des
180
+ expressions comme “simples à cuisiner”
181
+ ,
182
+ “rapides à préparer”
183
+ , et “économiques”
184
+ illustrent cette volonté de rendre la cuisine accessible. Le ton est détendu et
185
+ encourageant, souvent avec une touche d'humour ou de proximité (par exemple, le
186
+ clin d'œil aux étudiants qui “ont rarement des cuisines de 15 mètres carrés”).
187
+ -
188
+ Accessibilité : Les ingrédients sont simples, souvent utilisés dans plusieurs menus
189
+ différents (pâtes, légumes de saison, fromages accessibles, etc.), ce qui donne
190
+ l’impression que les repas sont à la fois abordables et rapides à préparer. L'absence
191
+ d’ingrédients rares ou coûteux est un choix délibéré pour rendre la cuisine abordable
192
+ pour tous.
193
+ -
194
+ Encouragement et proximité : Le texte parle directement au lecteur en utilisant des
195
+ tournures engageantes, comme “Libération vous propose”
196
+ , et en évoquant des
197
+ situations que les étudiants connaissent bien, telles que “une cuisine de 15 mètres
198
+ carrés”
199
+ . Cela crée une proximité avec le lecteur et donne un côté rassurant et utile à
200
+ l'article.
201
+ -
202
+ Ton optimiste et positif : Le ton de l'article est motivant. Il cherche à convaincre le
203
+ lecteur que cuisiner des repas sains, équilibrés et peu coûteux peut être facile et
204
+ agréable, ce qui est un aspect essentiel du journalisme de service. Ce ton léger et
205
+ convivial est typique d'un article conçu pour être utile tout en restant plaisant à lire.
206
+ Pour appartenir à la catégorie “Connectez-moi”
207
+ , un article doit comporter les
208
+ éléments suivants :
209
+
210
+ Création d’un lien avec le public : L'article met en lumière l'initiative locale de
211
+ Mouans-Sartoux, une petite ville qui a adopté une approche durable pour son
212
+ alimentation. En partageant cette expérience avec les étudiants et les professionnels en
213
+ formation, l’article montre comment cette expérience pourrait être répliquée ailleurs,
214
+ suscitant ainsi un sentiment de solidarité et de partage d’idées. Les lecteurs sont invités
215
+ à s'identifier à cette action collective et à se sentir connectés à un mouvement plus
216
+ large, celui de l’alimentation durable.
217
+
218
+ Identification avec les étudiants et les acteurs locaux : L’article présente des étudiants
219
+ qui, par leur formation et leur engagement, participent à cette transformation alimentaire
220
+ dans différentes régions de France. Le texte favorise l’empathie du lecteur en racontant
221
+ les histoires personnelles de ces étudiants, comme Marion Boubel, qui travaille sur la
222
+ réduction du gaspillage alimentaire dans un autre territoire, ou Frédéric Haeftlen, qui
223
+ veut créer une ferme urbaine. Ces portraits individuels permettent au public de
224
+ s'identifier à ces personnes, et de percevoir que, malgré les difficultés, ils peuvent eux
225
+ aussi agir à leur échelle.
226
+
227
+ Promotion de l’action collective et de l’engagement : L’article ne se contente pas de
228
+ décrire une initiative, il fait également l’éloge de l’action concrète et du changement. En
229
+ détaillant les actions mises en place à Mouans-Sartoux, comme la gestion de la ferme
230
+ municipale ou la réduction du gaspillage alimentaire, l’article invite les lecteurs à
231
+ réfléchir à leur propre rôle dans la transformation durable. Cela contribue à créer un
232
+ sentiment d’appartenance à un mouvement plus grand, où chaque action locale
233
+ participe à un objectif global.
234
+
235
+ Caractéristiques de la catégorie "connectez-moi"
236
+ -
237
+ Récit humanisé et personnel : Les articles de cette catégorie mettent en avant des
238
+ histoires humaines, des récits de personnes ordinaires qui réalisent des actions
239
+ remarquables, permettant aux lecteurs de se projeter dans ces histoires et
240
+ d'éprouver un sentiment d’empathie. Dans cet article, les étudiants et les habitants
241
+ de Mouans-Sartoux sont des personnages centraux, et leurs histoires sont racontées
242
+ de manière à ce que le public puisse facilement s'y identifier.
243
+ -
244
+ Mise en avant des valeurs communes : La catégorie "connectez-moi" s'appuie sur
245
+ des valeurs communes ou des causes collectives, comme ici la transition alimentaire
246
+ durable. Ces valeurs sont partagées par les protagonistes de l’histoire, mais aussi
247
+ par les lecteurs, qui sont invités à réfléchir à leur propre contribution à ces causes.
248
+ L'article valorise l’action locale tout en mettant l’accent sur l’importance de la
249
+ collaboration et de l’engagement collectif.
250
+ -
251
+ Inspiration et motivation : L'objectif est de motiver les lecteurs à agir en leur montrant
252
+ que de petites initiatives locales peuvent avoir un impact significatif, et que chacun
253
+ peut faire une différence. L’article cherche à encourager le lecteur à s’investir dans la
254
+ transition écologique et alimentaire, en lui montrant des exemples concrets et
255
+ inspirants, tout en donnant des idées pratiques qu'il pourrait transposer à son propre
256
+ environnement.
257
+ -
258
+ Proximité et authenticité : Le ton utilisé est proche et accessible, visant à créer un
259
+ lien direct entre le lecteur et le sujet. Le texte raconte des faits réels, ce qui donne
260
+ une dimension authentique et crédible à l’histoire. Cette approche permet au public
261
+ de se sentir partie prenante du récit et du changement présenté.
262
+
263
+ Sémantique et style spécifiques à cette catégorie
264
+ -
265
+ Langage inspirant et inclusif : L’article emploie un vocabulaire simple mais riche de
266
+ sens, visant à motiver et à engager le lecteur. Par exemple, l’utilisation de termes
267
+ comme « modèle », « transition », « changement », « partage » ou « engagement »
268
+ crée un sentiment de possibilité collective. Ces mots encouragent l’identification et
269
+ l’action.
270
+ -
271
+ Ton empathique et proche : L’auteur s’adresse indirectement au lecteur en plaçant
272
+ les personnages au cœur de l’histoire. Il donne une voix aux étudiants et aux
273
+ habitants de Mouans-Sartoux, partageant leurs expériences personnelles et
274
+ professionnelles. Ce ton humanisé crée une atmosphère de solidarité et de
275
+ proximité, incitant les lecteurs à s'engager dans la même dynamique.
276
+ -
277
+ Célébration du local et de l’initiative : Un autre aspect clé de la sémantique de cet
278
+ article est de mettre en avant des initiatives locales comme des exemples à suivre,
279
+ ce qui donne un sentiment de fierté collective. Par la mise en lumière des actions
280
+ concrètes de Mouans-Sartoux et des projets menés par les étudiants, l'article incite à
281
+ voir dans ces pratiques locales un modèle pouvant être dupliqué ailleurs.
282
+ -
283
+ Narration d’expériences concrètes : L’article fait appel à des témoignages réels et à
284
+ des expériences vécues, ce qui rend le récit plus tangible et accessible. Par
285
+ exemple, en détaillant les efforts réalisés pour réduire le gaspillage alimentaire ou en
286
+ expliquant les actions pratiques entreprises par les étudiants dans leurs stages, le
287
+ texte montre concrètement comment ces initiatives peuvent avoir un impact
288
+ mesurable et positif sur le terrain.
289
+ Voici les quatre catégories suivantes
290
+ Pour appartenir à la catégorie “Donnez moi une perspective”
291
+ , un article doit
292
+ comporter les éléments suivants :
293
+
294
+ Confrontation de points de vue d’experts : L’article présente les opinions de deux
295
+ experts ayant des perspectives opposées sur la question de la notation scolaire. Pierre
296
+ Merle, sociologue, critique l'évaluation par note et propose des alternatives, tandis que
297
+ Jean-Paul Brighelli, professeur de lettres modernes, défend l'idée que les notes sont
298
+ nécessaires pour mesurer les difficultés des élèves. Cette confrontation permet au
299
+ lecteur d'accéder à divers points de vue et de se faire sa propre opinion sur le sujet.
300
+
301
+ Exploration d'un sujet complexe : La question de l'évaluation scolaire est un sujet
302
+ compliqué et controversé, avec des implications profondes pour l'enseignement et la
303
+ société. L'article propose une analyse approfondie de ce problème, en explorant les
304
+ avantages et les inconvénients des notes, ainsi que les conséquences de leur
305
+ suppression ou de leur réforme. Cela correspond bien à l'objectif de cette catégorie, qui
306
+ est d'expliquer des enjeux complexes et leur impact sur la société.
307
+
308
+ Mise en valeur des perspectives opposées : L'article met en lumière deux positions
309
+ contradictoires sur la question des notes. En confrontant les arguments pour et contre, il
310
+ aide le lecteur à comprendre les enjeux sous-jacents, notamment les problèmes liés à
311
+ l'inégalité scolaire et les débats sur la pertinence des notes comme système
312
+ d’évaluation. Le format du pour/contre permet une discussion équilibrée, où chaque
313
+ point de vue est exploré en profondeur.
314
+
315
+ Caractéristiques de la catégorie "donnez-moi une perspective"
316
+ -
317
+ Examen d’un sujet d’actualité complexe : Les articles de cette catégorie se
318
+ concentrent sur des sujets qui exigent une réflexion et une analyse approfondies,
319
+ souvent liés à des réformes sociales, politiques ou éducatives. Dans cet article, la
320
+ question de la réforme de l’évaluation scolaire touche à des problématiques
321
+ complexes comme les inégalités sociales, la pédagogie, et l'efficacité des systèmes
322
+ éducatifs. L'article aide à décortiquer ces questions en profondeur.
323
+ -
324
+ Confrontation des opinions d’experts : Un des aspects clés de cette catégorie est la
325
+ mise en lumière de différents points de vue d'experts ou de personnes ayant des
326
+ connaissances approfondies sur le sujet traité. Ici, les opinions de Pierre Merle et
327
+ Jean-Paul Brighelli permettent au lecteur de saisir les avantages et les limites de
328
+ chaque position. Le but est d’offrir au public un panorama complet des idées et des
329
+ arguments pour l’aider à se forger son propre avis.
330
+ -
331
+ Argumentation claire et structurée : Les articles de la catégorie "donnez-moi une
332
+ perspective" sont souvent bien structurés, avec des arguments bien développés pour
333
+ chaque position. L'article sur les notes à l'école alterne entre les interventions des
334
+ deux experts, donnant un aperçu détaillé de leurs opinions respectives. Le lecteur
335
+ peut ainsi suivre les arguments présentés de manière logique et cohérente, ce qui
336
+ l'aide à mieux comprendre les implications de chaque position.
337
+ -
338
+ Invitation à la réflexion : L'objectif de ces articles est de faire réfléchir le lecteur sur
339
+ des sujets d'actualité ou des problèmes sociétaux importants. En présentant les
340
+ différents points de vue sur les notes à l'école, cet article incite à une réflexion
341
+ critique sur la manière dont nous évaluons les élèves, sur les avantages et les
342
+ inconvénients des systèmes éducatifs actuels, et sur les conséquences d’une
343
+ réforme de ce type.
344
+
345
+ Sémantique et style spécifiques à cette catégorie
346
+ -
347
+ Vocabulaire technique et analytique : L'article utilise un vocabulaire précis et souvent
348
+ technique, lié aux problématiques éducatives. Des termes comme “évaluation par
349
+ compétences”
350
+ ,
351
+ “biais sociaux de notation”
352
+ ,
353
+ “décrochage scolaire” ou “hiérarchie des
354
+ élèves” sont utilisés pour structurer l'analyse. Ce vocabulaire permet d’illustrer des
355
+ concepts complexes et de renforcer la crédibilité des arguments présentés par les
356
+ experts.
357
+ -
358
+ Ton argumentatif et factuel : Le style est objectif et factuel, avec un ton souvent plus
359
+ formel que celui des articles orientés vers le grand public. Les experts sont invités à
360
+ s'exprimer de manière détaillée et argumentée. Le texte cherche avant tout à
361
+ convaincre par la force des arguments, en exposant clairement les avantages et les
362
+ inconvénients de chaque position.
363
+ -
364
+ Présence de témoignages et d’exemples : Bien que l'article soit analytique et
365
+ argumentatif, il s'appuie également sur des exemples concrets et des témoignages
366
+ pour illustrer les points de vue des experts. Par exemple, l’exemple de la Finlande et
367
+ des comparaisons avec d'autres systèmes éducatifs servent à appuyer les
368
+ arguments de Pierre Merle et Jean-Paul Brighelli. Ces exemples visent à rendre
369
+ l’analyse plus compréhensible et à donner du poids aux arguments.
370
+ -
371
+ Structure du débat : L'article suit une structure claire, divisée entre les opinions de
372
+ chaque expert. Cette structure bipartite permet au lecteur de voir directement les
373
+ arguments pour et contre la question, ce qui facilite la compréhension des enjeux. Ce
374
+ format est caractéristique des articles de type “donnez-moi une perspective”
375
+ , où
376
+ l'objectif est de présenter des points de vue opposés sur une question donnée.
377
+ Pour appartenir à la catégorie “Expliquez moi”
378
+ , un article doit comporter les éléments
379
+ suivants :
380
+
381
+ Approfondissement des connaissances sur un sujet complexe : L’article cherche avant
382
+ tout à expliquer les tenants et aboutissants de l’initiative de Donald Trump. Il va au-delà
383
+ de l’actualité immédiate en détaillant l’histoire du département de l’Éducation, son rôle,
384
+ et le contexte historique des attaques des conservateurs contre cette agence. Il
385
+ décompose le sujet en éléments essentiels et permet au lecteur de comprendre non
386
+ seulement les événements récents, mais aussi les enjeux de fond liés à l’éducation aux
387
+ États-Unis et les répercussions possibles d’une telle décision.
388
+
389
+ Démystification et clarification : L'article décompose le démantèlement du département
390
+ de l’Éducation en plusieurs questions essentielles, comme : « Quel est le rôle du
391
+ département de l’Éducation ? », « Pourquoi Trump mène cette offensive ? », et « Peut-il
392
+ le faire légalement ? ». Ce format, sous forme de questions-réponses et d’explications
393
+ détaillées, permet au lecteur de mieux saisir les implications de l'action de Trump et de
394
+ comprendre la portée de cette décision dans un contexte plus large.
395
+
396
+ Exploration des enjeux politiques et sociaux : L'article offre également une analyse des
397
+ motifs politiques derrière cette décision et des impacts potentiels sur la société,
398
+ notamment les inégalités éducatives. Il met en lumière l'opposition au sein du pays et
399
+ les critiques venant de l'Union nationale des parents d’élèves. En discutant de la légalité
400
+ de la démarche de Trump, il permet au lecteur de comprendre les risques juridiques et
401
+ constitutionnels liés à ce type de réforme, ce qui enrichit l’analyse du sujet.
402
+
403
+ Les caractéristiques de la catégorie "expliquez-moi"
404
+ -
405
+ Décomposition du sujet en éléments essentiels : Les articles de cette catégorie
406
+ cherchent à expliquer des sujets complexes en les découpant en éléments simples
407
+ et compréhensibles. Dans cet article, chaque section aborde un aspect clé du sujet
408
+ (rôle du département, historique des attaques, enjeux politiques, etc.), ce qui aide à
409
+ clarifier un sujet complexe pour le lecteur.
410
+ -
411
+ Objectif pédagogique : L’objectif principal de ce type d’article est d’informer le lecteur
412
+ tout en éveillant sa curiosité sur un sujet précis. L’article de Libération fait ici un
413
+ travail pédagogique en expliquant les implications d’une réforme du système éducatif
414
+ américain, et en clarifiant des points tels que la légalité de la décision de Trump et
415
+ les raisons derrière cette volonté politique.
416
+ -
417
+ Utilisation de questions/réponses ou de formats explicatifs : La structure de l’article,
418
+ qui alterne entre questions-réponses et explications, est caractéristique de cette
419
+ catégorie. Cela permet de structurer l’information de manière logique et fluide, tout
420
+ en permettant au lecteur de trouver facilement les réponses à ses interrogations sur
421
+ un sujet d'actualité.
422
+ -
423
+ Recherche de longue durée : Ce genre d’article a souvent une durée de vie longue et
424
+ une valeur informative pérenne, car il explique un sujet qui peut continuer à être
425
+ pertinent bien après sa publication. L’article sur la suppression du département de
426
+ l’Éducation pourrait être consulté à l'avenir par ceux qui cherchent à comprendre
427
+ l’évolution de la politique éducative américaine ou les initiatives de Trump.
428
+ -
429
+ Mise en contexte et analyse historique : Un article de type "expliquez-moi" va
430
+ souvent mettre en perspective l’actualité avec des éléments historiques ou
431
+ contextuels, comme cela est fait ici avec les critiques de l'agence depuis sa création
432
+ en 1979 et l’opposition constante des conservateurs américains. Cette analyse
433
+ permet d’enrichir la compréhension du sujet et de montrer que l’actualité n’est pas
434
+ simplement un fait isolé, mais qu’elle s’inscrit dans un contexte plus large.
435
+
436
+ Sémantique et style spécifiques à cette catégorie
437
+ -
438
+ Langage clair et accessible : Le vocabulaire utilisé dans cet article est accessible,
439
+ même pour un lecteur qui n’est pas expert en politique américaine ou en systèmes
440
+ éducatifs. Bien que le sujet soit complexe, le langage est précis mais simple,
441
+ permettant à tout type de lecteur de comprendre les enjeux sans se perdre dans des
442
+ détails techniques ou des jargons.
443
+ -
444
+ Style explicatif et descriptif : Le style de l’article est explicatif, il s’efforce de décrire
445
+ les événements et les contextes de manière neutre, sans jugement. Le but est
446
+ d’éclairer le lecteur sur un sujet d’actualité en offrant des explications détaillées,
447
+ comme le rôle du département de l’Éducation, son budget, ou encore les critiques
448
+ qui lui sont faites. Le ton est factuel, donnant des informations précises sans
449
+ interférence subjective.
450
+ -
451
+ Présence d'exemples et de données : L'article se base sur des données chiffrées
452
+ pour appuyer ses propos, comme le budget du département de l’Éducation en 2024
453
+ (238 milliards de dollars), ou les dépenses du département représentant environ 14
454
+ % du financement des écoles publiques. Ces éléments factuels servent à ancrer
455
+ l’analyse dans la réalité et à rendre l’information plus crédible.
456
+ -
457
+ Approche analytique : L’article prend soin d'analyser les motifs politiques, les
458
+ conséquences potentielles et les réactions à cette décision, en prenant le temps de
459
+ discuter des implications sociales et juridiques. L’objectif est de fournir une vision
460
+ globale du sujet afin que le lecteur puisse appréhender l’ampleur des enjeux et des
461
+ répercussions de cette décision.
462
+ Pour appartenir à la catégorie “Divertissez-moi”
463
+ , un article doit comporter les
464
+ éléments suivants :
465
+
466
+ Approche légère et divertissante : L'article ne se concentre pas sur des informations
467
+ graves ou des analyses profondes, mais sur un phénomène spectaculaire et
468
+ visuellement captivant, l’éclipse lunaire. Il utilise des termes comme « récap’imagé »
469
+ pour donner une tonalité plus décontractée et accessible au lecteur, invitant à une
470
+ expérience légère et agréable. Il sert à divertir tout en informant, ce qui est un trait
471
+ central de cette catégorie.
472
+
473
+ Événement spectaculaire avec une approche visuelle : L'article se concentre sur un
474
+ événement fascinant, l’éclipse lunaire, et sur ses images spectaculaires, mais sans
475
+ entrer trop profondément dans les aspects techniques ou scientifiques. Il s'agit ici de
476
+ faire découvrir un phénomène céleste d'une manière attrayante, sans alourdir le
477
+ contenu avec des détails trop complexes. Le format visuel (référence à des photos ou
478
+ des images spectaculaires) évoque des galeries de photos ou des diaporamas, souvent
479
+ utilisés dans les articles de cette catégorie pour captiver l'attention du lecteur tout en
480
+ offrant une expérience plus sensorielle.
481
+
482
+ Interruption du flux d'actualités plus lourdes : En pleine période d'actualités souvent
483
+ graves ou sérieuses, l'article offre une pause rafraîchissante, un moyen pour le lecteur
484
+ de se détacher des informations lourdes en s'intéressant à un événement spectaculaire,
485
+ mais sans gravité. Ce phénomène naturel devient l’occasion d’une rupture avec
486
+ l'actualité plus pesante.
487
+
488
+ Ton informatif mais accessible : Le ton est informatif sans être trop dense. L'article offre
489
+ des explications simples et compréhensibles sur l’éclipse lunaire, sans chercher à
490
+ imposer des détails techniques. Le style est conçu pour être accessible à tous, même à
491
+ ceux qui n’ont pas de connaissances en astronomie. Ce type de contenu vise à être
492
+ léger et divertissant, tout en restant informatif.
493
+
494
+ Invitation à l’émerveillement et à l'évasion : L’article invite à l’émerveillement, à observer
495
+ un phénomène unique, tout en restant sur un ton simple et accueillant. Il présente des
496
+ informations pratiques sur l’éclipse, mais sans en faire un sujet trop lourd ou complexe.
497
+ C’est un contenu qui fait appel à l’admiration, et qui fait plaisir à lire, un des objectifs de
498
+ la catégorie "divertissez-moi"
499
+ .
500
+
501
+ Les caractéristiques de la catégorie "divertissez-moi"
502
+ -
503
+ Perspective légère et agréable : Les articles de cette catégorie cherchent à offrir une
504
+ pause dans le flot d’informations sérieuses ou pesantes, en mettant en avant des
505
+ sujets légers mais intéressants. Il s'agit de divertirtout en informant, mais sans entrer
506
+ trop profondément dans les complexités. L’objectif est d'attirer l'attention du lecteur
507
+ sur des sujets qui provoquent de l’émerveillement ou de la curiosité.
508
+ -
509
+ Accessibilité et simplicité : Le ton est décontracté et accessible, avec des
510
+ explications claires et simples. Les termes sont familier et conviviaux, ce qui permet
511
+ de toucher un large public. C'est un contenu facile à lire, sans jargon compliqué,
512
+ conçu pour être compris rapidement et agréablement.
513
+ -
514
+ Utilisation de formats visuels : L’article pourrait inclure des galeries de photos, des
515
+ diaporamas, ou même des vidéos. Dans ce cas, la mention de « récap’imagé » fait
516
+ allusion à un contenu qui, bien que principalement textuel, se concentre sur la
517
+ visualité du phénomène, et pourrait être enrichi d’images spectaculaires. Cela
518
+ renforce l’aspect visuel et engageant du contenu.
519
+ -
520
+ Interruption de l’actualité lourde : Un des objectifs principaux de cette catégorie est
521
+ de briser la monotonie de l’actualité sérieuse, souvent en proposant un contenu plus
522
+ léger ou plus agréable à lire. L’éclipse lunaire, bien que scientifique, devient un sujet
523
+ qui permet de s'évader, et de sortir temporairement du cadre de l'actualité lourde,
524
+ qu’elle soit politique, sociale ou économique.
525
+ -
526
+ Émerveillement et fascination : L’article met l'accent sur l’émerveillement provoqué
527
+ par l’éclipse lunaire. Les informations sont données sous forme de faits intéressants,
528
+ comme l'alignement des astres ou la couleur rouge de la Lune, pour capturer
529
+ l’attention et susciter la curiosité sans chercher à forcer une analyse profonde.
530
+
531
+ Sémantique et style spécifiques à cette catégorie
532
+ -
533
+ Ton informel et décontracté : L'article utilise un ton familier et ludique, avec des
534
+ expressions comme "pas de panique" et "réac’imagé" pour inviter à une expérience
535
+ de lecture détendue. Ce style vise à rendre le contenu accessible et agréable à lire,
536
+ même pour des lecteurs qui ne sont pas spécialisés dans le domaine.
537
+ -
538
+ Vocabulaire simple et visuel : Le vocabulaire est simple et direct, et l'accent est mis
539
+ sur la visualité du phénomène (par exemple,
540
+ "la lune qui a viré au rouge"
541
+ ,
542
+ "images
543
+ spectaculaires"). Le style cherche à capturer l’imagination du lecteur et à rendre le
544
+ contenu aussi visuel et sensoriel que possible, tout en restant compréhensible.
545
+ -
546
+ Engagement par la curiosité : L’article suscite la curiosité en offrant des détails
547
+ fascinants, comme la description du phénomène, sans se perdre dans des
548
+ explications scientifiques trop lourdes. Il parle de l’éclipse comme d’un spectacle
549
+ céleste et invite le lecteur à l’admirer, plutôt que de se concentrer sur des analyses
550
+ ou des interprétations complexes.
551
+ -
552
+ Ton optimiste et encourageant : Le ton reste toujours optimiste et encourageant,
553
+ avec un contenu qui ne fait pas de l’information lourde un poids, mais une chance de
554
+ s’émerveiller (par exemple,
555
+ "Pas de panique, une nouvelle éclipse est à venir"). Ce
556
+ ton engageant fait partie de l'approche de l’article, qui veut attirer l’attention sur des
557
+ événements célestes extraordinaires sans stress ni complexité.
558
+ Pour appartenir à la catégorie “Inspirez-moi”
559
+ , un article doit comporter les éléments
560
+ suivants:
561
+
562
+ Mise en lumière d'un individu remarquable : L'article se concentre sur un personnage
563
+ singulier, Daniel Gros, un ancien CPE et représentant de la Ligue des droits de l'homme
564
+ (LDH) à Mayotte. À travers sa carrière et son engagement personnel, cet article met en
565
+ avant une personne qui se distingue par son humanisme, son désir d’aider les plus
566
+ vulnérables (les immigrés, les demandeurs d'asile), et son engagement contre
567
+ l'injustice. Ce type de portrait humain est central dans la catégorie "inspirez-moi"
568
+ , car il
569
+ incite à réfléchir à ce que chaque individu peut accomplir pour améliorer la société.
570
+
571
+ Actions inspirantes : Daniel Gros mène des actions concrètes et souvent difficiles : il
572
+ aide des étrangers en situation irrégulière, se bat pour leurs droits dans un
573
+ environnement hostile, et dénonce publiquement des injustices, comme le droit du sol à
574
+ Mayotte ou la gestion des crises humanitaires. Son engagement envers les personnes
575
+ marginalisées et son implication dans des causes sociales sont des éléments typiques
576
+ de cette catégorie, où l'accent est mis sur des actions qui apportent une réelle
577
+ différence.
578
+
579
+ Thème de la responsabilité sociale et humaine : L'article ne se contente pas de décrire
580
+ les actions de Daniel Gros, mais il invite également le lecteur à réfléchir sur les
581
+ questions sociales et éthiques liées à l'immigration, aux inégalités sociales et à la
582
+ défense des droits humains. L'accent est mis sur la responsabilité sociale de l'individu
583
+ face aux injustices, et cet engagement est présenté comme un exemple à suivre.
584
+
585
+ Portrait qui inspire à la réflexion et à l'action : Le choix de décrire un homme de 74 ans,
586
+ qui continue à se battre pour une cause juste malgré les difficultés physiques et
587
+ psychologiques, encourage une réflexion personnelle sur l'engagement, le sens de la
588
+ vie et la volonté de lutter contre l'injustice. L'article suggère que, même à un âge
589
+ avancé, l'action est possible et que le sens de l'engagement n'a pas de limite. Cela
590
+ invite le lecteur à se demander ce qu’il pourrait faire pour contribuer positivement à la
591
+ société, en particulier face aux injustices.
592
+
593
+ Exemple de “journalisme de solutions” : L'article propose des exemples concrets de
594
+ solutions ou de réponses face aux problèmes sociaux, notamment la manière dont
595
+ Daniel Gros aide les personnes vulnérables. Il s'agit moins de se concentrer sur le
596
+ problème que sur la manière dont un individu peut y répondre, ce qui est l’essence
597
+ même du "journalisme de solutions"
598
+ . L'article présente un individu qui, au lieu de se
599
+ contenter de dénoncer des injustices, agit activement pour les combattre.
600
+
601
+ Les caractéristiques spécifiques de la catégorie “inspirez-moi”
602
+ -
603
+ Portraits de personnages inspirants : Cette catégorie se concentre sur des individus
604
+ dont les actions ou le parcours sont exemplaires. Ces personnes sont souvent
605
+ caractérisées par une forte motivation personnelle, une éthique de travail et une lutte
606
+ pour des causes importantes. Leur histoire est racontée de manière à inciter le
607
+ lecteur à s'interroger sur sa propre vie et son propre engagement.
608
+ -
609
+ Optimisme et engagement social : Les articles de cette catégorie présentent un ton
610
+ positif, même si les défis auxquels les protagonistes sont confrontés sont grands.
611
+ L'idée est d'inspirer le lecteur en mettant en avant des personnes qui ne se laissent
612
+ pas abattre par les difficultés et qui continuent de se battre pour un monde meilleur.
613
+ L’engagement de Daniel Gros, même dans un contexte difficile, montre l'importance
614
+ de la persévérance.
615
+ -
616
+ Récits axés sur des actions et des solutions : Contrairement à des articles plus
617
+ critiques qui mettent en avant les problèmes sans nécessairement offrir de réponses,
618
+ cette catégorie de récits se concentre sur les actions concrètes, les solutions
619
+ apportées par les individus et la manière dont ces actions peuvent inspirer un
620
+ changement. Le parcours de Daniel Gros, de son rôle de CPE à son engagement
621
+ humanitaire, illustre parfaitement cette approche.
622
+ -
623
+ Dimension sociale et humaine forte : Les sujets traités dans cette catégorie sont
624
+ souvent des histoires qui ont une forte dimension humaine et qui interrogent la place
625
+ de l’individu dans la société. L'accent est mis sur des sujets qui touchent à la
626
+ condition humaine, aux inégalités et à la solidarité. Cet article, qui présente Daniel
627
+ Gros comme un défenseur des droits des étrangers, aborde des questions liées à
628
+ l'immigration, à la justice sociale et à la dignité humaine.
629
+
630
+ Sémantique et style spécifiques à cette catégorie
631
+ -
632
+ Ton humain et empathique : Le style de l’article est chaleureux, empathique et
633
+ respectueux. Il cherche à établir une connexion émotionnelle avec le lecteur en
634
+ montrant la dévotion et le sacrifice personnel de Daniel Gros. Les descriptions
635
+ détaillées de sa vie et de ses actions visent à montrer sa bienveillance et son
636
+ engagement authentique.
637
+ -
638
+ Langage inspirant : Le vocabulaire utilisé dans cet article est choisi pour valoriser
639
+ l'engagement de l’individu et pour souligner son caractère exceptionnel sans pour
640
+ autant le mettre sur un piédestal. Les termes comme "révolté"
641
+ ,
642
+ "blessé par
643
+ l’injustice"
644
+ ,
645
+ "aime les gens"
646
+ , ou encore "se battre" illustrent une volonté d'expliquer
647
+ les motivations profondes de l'individu. Cela renforce l'idée qu'il est un exemple à
648
+ suivre, tout en restant profondément humain.
649
+ -
650
+ Narration fluide et humaine : L’article adopte un récit fluide et détaillé, nous plongeant
651
+ dans le quotidien de Daniel Gros et dans son parcours. L’écriture fait souvent appel à
652
+ des anecdotes personnelles et à des citations directes du protagoniste pour créer
653
+ une atmosphère proche et accessible, qui permet au lecteur de mieux comprendre et
654
+ d'apprécier l'engagement de cet homme.
655
+ -
656
+ Mise en valeur de l’humilité : L'article met aussi l'accent sur l'humilité de Daniel Gros,
657
+ qui ne cherche pas la gloire mais agit pour une cause juste, souvent avec des
658
+ moyens modestes. Ce style présente un anti-héros qui se bat pour la justice sociale
659
+ sans attendre de récompenses ou de reconnaissance.
660
+ Voilà, tu as les indications nécessaires pour catégoriser chaque article de Libération dans
661
+ l’une des catégories de la boussole. Tu es donc en mesure de justifier ton choix.
662
+
663
+
664
+ EXAMPLE JSON OUTPUT:
665
+ {
666
+ "categorie_principale": "Inspirez-moi",
667
+ "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"
668
+ }
data/outputs/output_dimanov_et_al.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ [{"item_id": "I4OEKQ6MHRBP3LQVVYDDXW6T6U", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"}, {"item_id": "LVA4MZBQOBECNPZD323NV6O7K4", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Inspirez-moi, Impliquez-moi"}, {"item_id": "4FAEHUUZ5ZFAJKLFEV2LT5CBAQ", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez-moi une perspective"}, {"item_id": "4S4G6BKFRNER3LB22CLPAEWWKY", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez-moi une perspective"}, {"item_id": "ZAFHRNAHJVC6THXRSBMCB4A24I", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Connectez-moi"}, {"item_id": "ESEADAHDJVGQRC2S3JHSZEVWHM", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi"}, {"item_id": "FZHZS32EOZG5FAK7IKOJIB3J4I", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Donnez-moi une perspective, Expliquez moi"}, {"item_id": "H4JJGHBTL5DDFNNNETBE5T7FLI", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi"}, {"item_id": "JTND25UK2NA6HL2DVJRX46VCVM", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Inspirez-moi, Impliquez-moi"}, {"item_id": "LFRXBXICUFFULNKZUG4JN4E2NY", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Connectez-moi, Divertissez-moi"}, {"item_id": "O5546IGISVGOLAPLOUIXAHXATE", "categorie_principale": "Donnez moi une perspective", "categorie_secondaire": "Expliquez moi"}, {"item_id": "5LRGJN3CONBZ3OIGARTGZX7X34", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Connectez-moi"}, {"item_id": "A2CXALUPDVHDZP22PBL4YMMGVU", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Connectez-moi, Divertissez-moi"}, {"item_id": "6T5ESGV6CNFA5L3TIEO475EO2I", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Aidez-moi"}, {"item_id": "KGJGC5V6OJCJJEVO4D3MP5QA4Q", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Impliquez-moi, Expliquez-moi"}, {"item_id": "ASBHDD73HZANDM5W3WRKXGCCGI", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Inspirez-moi"}, {"item_id": "YL7UVGJLQZALVK5PCV2LZLPTDQ", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Inspirez-moi, Connectez-moi"}, {"item_id": "2T6XZA7OHRD6RFCGPA3ZVCNJ7A", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Donnez-moi une perspective, Inspirez-moi"}, {"item_id": "V3THEIGVXBDADLDXUKJZTRLLUQ", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"}, {"item_id": "Z3WQ6BXPKRATPCGSKMROOOMQ44", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Expliquez-moi"}, {"item_id": "TUR55MJTKRA7TNJOOP62XW7NIM", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Donnez-moi une perspective"}, {"item_id": "YGI5VTCGIJFDNOA5C4G5BOITH4", "categorie_principale": "Expliquez moi", "categorie_secondaire": "Donnez-moi une perspective"}, {"item_id": "S2FVMMUVK5BS3HK5YN7PNU2LZE", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9"}, {"item_id": "ZASS6FXGGVGCHFSSZKZXQ4AG2U", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Expliquez-moi"}, {"item_id": "2AZTSRRBUNBHNNHU5DCMRGG6WY", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Impliquez-moi, Expliquez-moi"}, {"item_id": "AKDZ7PAIQVBN5OENKR5AQ6YGNI", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9"}, {"item_id": "M4RJIWTMK5BVPAWNFEHGXZSLRY", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Divertissez-moi, Connectez-moi"}, {"item_id": "WLTP7ZAZ7JFUDJG2LNO5E7APZA", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Impliquez-moi"}, {"item_id": "DCY4O24FUBAZZB3KOTIMMBA6MY", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Donnez-moi une perspective, Connectez-moi"}, {"item_id": "FHFB7Z3XYBH25LO7XDGHAEQ7N4", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi"}, {"item_id": "BPNRZFZPAVA3HPUOXUKXEUR5RY", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Impliquez-moi"}, {"item_id": "NWGRYEOIQ5ADRDRXYZCU5C3VDA", "categorie_principale": "Connectez-moi", "categorie_secondaire": "Impliquez-moi, Inspirez-moi"}, {"item_id": "GORDMTE47FA5FEUA3U76M5VPOY", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Expliquez moi, Impliquez-moi"}, {"item_id": "XFBX7NDGN5CMPL3OU5ZXFF6YCE", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Connectez-moi"}, {"item_id": "VYEPVCBK4ZCV7D3SW35GZ2Y5DM", "categorie_principale": "Connectez-moi", "categorie_secondaire": "Inspirez-moi, Expliquez moi"}, {"item_id": "F5TBC6SGHRGRFJGZXZYG73I2C4", "categorie_principale": "Expliquez moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez moi une perspective"}, {"item_id": "ZFZG6QOFBRFE3BL4VCI72HFQKQ", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Donnez-moi une perspective, Connectez-moi"}, {"item_id": "ZGPFATVT4ZFJZMX7LDXE3VS7RM", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Donnez-moi une perspective, Connectez-moi"}, {"item_id": "UBVFCLZ6OZCP5DAAYCBW2CDPJI", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Connectez-moi, Expliquez-moi"}, {"item_id": "WYEBGIAY5JAUFLB4GH6IXVYP34", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"}, {"item_id": "DXW7WX7ALVFBZNPFU6QKHEH3G4", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"}, {"item_id": "QOFNZRU2TVES7GMVVPMZ5LSI2E", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Divertissez-moi, Connectez-moi"}, {"item_id": "WBJI7FFINZHCPC5QZL2NFY6XWE", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Inspirez-moi, Donnez-moi une perspective"}, {"item_id": "IYAAHFU3PVFOPAN6XIJDPQ5XLQ", "categorie_principale": "Connectez-moi", "categorie_secondaire": "Impliquez-moi, Expliquez moi"}, {"item_id": "SNYUYV4G5BAODBTQWJBRG5JZKM", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Tenez-moi inform\u00e9, Expliquez-moi"}, {"item_id": "PMBTTRISTNDN3P3ANDECQKSEDE", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi"}, {"item_id": "UHYPJFKFJNHVPHVRFV7OHNDU64", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Impliquez-moi"}, {"item_id": "ESRPEZYCA5AG7HIXUIVMPHDFVQ", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Impliquez-moi"}, {"item_id": "HQW7TUOY7NHUVMCLNSDSEY5X4I", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Connectez-moi, Donnez-moi une perspective"}, {"item_id": "C3BA2XUBXRG5RBNHJUSDUKP4RI", "categorie_principale": "Divertissez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9"}, {"item_id": "RYGHZSLANZG6VAECBX5E4URWGA", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Expliquez-moi"}, {"item_id": "XE4JJOEEW5GEFGHCWRUDZQQNEI", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Connectez-moi"}, {"item_id": "MLOY6OAMK5DIXP7DU4JADUI6PY", "categorie_principale": "Connectez-moi", "categorie_secondaire": "Impliquez-moi, Inspirez-moi"}, {"item_id": "QV4QOZLJARAEFBLHAPKTZ5COZY", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Donnez-moi une perspective"}, {"item_id": "FH2X2NGD3JD3JIHPF2NLRFDXYA", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Expliquez-moi, Donnez-moi une perspective"}, {"item_id": "LJK5Z4OCR5GPJPJIKO6WDNXIZM", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Connectez-moi, Donnez-moi une perspective"}, {"item_id": "SGOURM7YXJFN7A6PMD5QGXEOCM", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Impliquez-moi, Expliquez-moi"}, {"item_id": "243MVH3PQFDKVEMG3AZRXQPXU4", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Donnez-moi une perspective"}, {"item_id": "Y7F3DLWP5NHXZNUHEO5VXTXOWA", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez-moi une perspective"}, {"item_id": "5MC57OWJ5VDUVP5OMZD4V77S7Y", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Tenez-moi inform\u00e9"}, {"item_id": "O7BU3TOSENBW5OKJXGVT2GC5KA", "categorie_principale": "Expliquez moi", "categorie_secondaire": "Donnez-moi une perspective"}, {"item_id": "ZDAODPBYFNENJN5ZNXA5FE46UY", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez-moi une perspective"}, {"item_id": "5YFBB3ECWBHSBLZVXFESCKRVQ4", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Connectez-moi"}, {"item_id": "6WGI3SNAGRFF3GJDQDNRDRWCSI", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez moi une perspective"}, {"item_id": "CJAETVEBDBBE7LGV3UYCN25I5A", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Impliquez-moi"}, {"item_id": "5RIUL6TGIRCZFNLP56A3GU6JSA", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Donnez-moi une perspective, Tenez-moi inform\u00e9"}, {"item_id": "NQW7FPL6UJFNJJIGBXMOUH74SQ", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Donnez-moi une perspective"}, {"item_id": "EACSBF2QO5GLNDLQCUYQHA46WM", "categorie_principale": "Impliquez-moi", "categorie_secondaire": "Tenez-moi inform\u00e9, Connectez-moi"}, {"item_id": "2XUJFEZK2VDA7M3WTKF776CIQE", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"}, {"item_id": "V7VFZH573JAANDOJ6VID3DP54A", "categorie_principale": "Donnez moi une perspective", "categorie_secondaire": "Tenez-moi inform\u00e9, Impliquez-moi"}, {"item_id": "UFRIHUTT6FEQZHVWC7VJOPULOI", "categorie_principale": "Expliquez-moi", "categorie_secondaire": "Donnez-moi une perspective, Connectez-moi"}, {"item_id": "PCZQ5Q2SHJFHZANPXZW2CUQVWU", "categorie_principale": "Inspirez-moi", "categorie_secondaire": "Divertissez-moi, Connectez-moi"}, {"item_id": "WSJBPLZMYNCJTLD2FHAH5YJZ3M", "categorie_principale": "Donnez-moi une perspective", "categorie_secondaire": "Expliquez-moi, Inspirez-moi"}, {"item_id": "XYIVTEB4VVBXFMJOJTD7DFKDIU", "categorie_principale": "Tenez-moi inform\u00e9", "categorie_secondaire": "Impliquez-moi, Donnez-moi une perspective"}]
execution.ipynb ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pandas as pd \n",
10
+ "import requests \n",
11
+ "import datetime as dt\n",
12
+ "import re\n",
13
+ "import json\n",
14
+ "from tqdm import tqdm\n",
15
+ "import os\n",
16
+ "import time\n",
17
+ "from openai import OpenAI"
18
+ ]
19
+ },
20
+ {
21
+ "cell_type": "markdown",
22
+ "metadata": {},
23
+ "source": [
24
+ "#### Calculate"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": 2,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "if \"OPENAI_API_KEY\" not in os.environ:\n",
34
+ " with open('/home/sagemaker-user/Sciences-POC/config/secrets/keys.txt', 'r') as f:\n",
35
+ " keys = json.loads(f.read())\n",
36
+ "else : \n",
37
+ " keys=os.environ"
38
+ ]
39
+ },
40
+ {
41
+ "cell_type": "code",
42
+ "execution_count": 3,
43
+ "metadata": {},
44
+ "outputs": [],
45
+ "source": [
46
+ "save_path = '/home/sagemaker-user/Sciences-POC/data/outputs'\n",
47
+ "content_path = '/home/sagemaker-user/Sciences-POC/data/extract_sciences_po'\n",
48
+ "\n",
49
+ "\n",
50
+ "def retrieve_classifications(name, mapping_prompt):\n",
51
+ "\n",
52
+ " df = pd.read_csv('/home/sagemaker-user/Sciences-POC/data/extract_sciences_po.csv')\n",
53
+ "\n",
54
+ "\n",
55
+ " if os.path.exists(f\"{save_path}/output_{name}.txt\"):\n",
56
+ " with open(f\"{save_path}/output_{name}.txt\", 'r') as f : \n",
57
+ " out_dict = json.loads(f.read())\n",
58
+ " out_df = pd.DataFrame.from_dict(out_dict)\n",
59
+ " out = out_dict\n",
60
+ " else : \n",
61
+ " out_df = pd.DataFrame(columns = ['item_id', 'categorie_principale', 'categorie_secondaire'])\n",
62
+ " out = []\n",
63
+ "\n",
64
+ " df_to_process = df.loc[~df.item_id.isin(out_df.item_id)]\n",
65
+ "\n",
66
+ " if mapping_prompt[name]['client']=='deepseek':\n",
67
+ " client = OpenAI(api_key=keys[\"DEEPSEEK_API_KEY\"], base_url=\"https://api.deepseek.com\")\n",
68
+ " model=\"deepseek-chat\"\n",
69
+ " else:\n",
70
+ " client=OpenAI(api_key=keys['OPENAI_API_KEY'])\n",
71
+ " model=\"gpt-4o\"\n",
72
+ "\n",
73
+ " df_to_process = df.loc[~df.item_id.isin(out_df.item_id)]\n",
74
+ "\n",
75
+ "\n",
76
+ " with open(mapping_prompt[name]['path_prompt'], 'r') as f:\n",
77
+ " prompt = f.read()\n",
78
+ "\n",
79
+ " with tqdm(total=df_to_process.shape[0]) as pbar:\n",
80
+ " for i, row in df_to_process.iterrows():\n",
81
+ " titre_brut = f\"{row.item_id}_\"+row.titre.lower().strip().replace(f\"\\xa0\", ' ').replace(' : ', ':').replace(' ', '_').replace('/', '')\n",
82
+ " \n",
83
+ " with open(f'{content_path}/{titre_brut}.txt', 'r') as f:\n",
84
+ " text = f.read()\n",
85
+ "\n",
86
+ " messages = [{\"role\": \"system\", \"content\": prompt},\n",
87
+ " {\"role\": \"user\", \"content\": text}]\n",
88
+ "\n",
89
+ " response = client.chat.completions.create(\n",
90
+ " model=model,\n",
91
+ " messages=messages,\n",
92
+ " response_format={\n",
93
+ " 'type': 'json_object'\n",
94
+ " }\n",
95
+ " )\n",
96
+ " try : \n",
97
+ " cat_json = json.loads(response.choices[0].message.content)\n",
98
+ "\n",
99
+ " out.append({\n",
100
+ " 'item_id':row.item_id, \n",
101
+ " 'categorie_principale': cat_json['categorie_principale'],\n",
102
+ " 'categorie_secondaire': cat_json['categorie_secondaire'],\n",
103
+ " })\n",
104
+ " \n",
105
+ " with open(f'{save_path}/output_{name}.txt', 'w+') as f : \n",
106
+ " f.write(json.dumps(out))\n",
107
+ "\n",
108
+ " except Exception as e : \n",
109
+ " print(f'Error with article {row.item_id}')\n",
110
+ " pass\n",
111
+ "\n",
112
+ " \n",
113
+ " pbar.update(1)\n",
114
+ "\n"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": 4,
120
+ "metadata": {},
121
+ "outputs": [
122
+ {
123
+ "name": "stdout",
124
+ "output_type": "stream",
125
+ "text": [
126
+ "dimanov_et_al\n"
127
+ ]
128
+ },
129
+ {
130
+ "name": "stderr",
131
+ "output_type": "stream",
132
+ "text": [
133
+ " 0%| | 0/442 [00:02<?, ?it/s]\n"
134
+ ]
135
+ },
136
+ {
137
+ "ename": "RateLimitError",
138
+ "evalue": "Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}",
139
+ "output_type": "error",
140
+ "traceback": [
141
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
142
+ "\u001b[31mRateLimitError\u001b[39m Traceback (most recent call last)",
143
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 6\u001b[39m\n\u001b[32m 4\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m mapping.keys():\n\u001b[32m 5\u001b[39m \u001b[38;5;28mprint\u001b[39m(name)\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m \u001b[43mretrieve_classifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmapping\u001b[49m\u001b[43m)\u001b[49m\n",
144
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 44\u001b[39m, in \u001b[36mretrieve_classifications\u001b[39m\u001b[34m(name, mapping_prompt)\u001b[39m\n\u001b[32m 39\u001b[39m text = f.read()\n\u001b[32m 41\u001b[39m messages = [{\u001b[33m\"\u001b[39m\u001b[33mrole\u001b[39m\u001b[33m\"\u001b[39m: \u001b[33m\"\u001b[39m\u001b[33msystem\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mcontent\u001b[39m\u001b[33m\"\u001b[39m: prompt},\n\u001b[32m 42\u001b[39m {\u001b[33m\"\u001b[39m\u001b[33mrole\u001b[39m\u001b[33m\"\u001b[39m: \u001b[33m\"\u001b[39m\u001b[33muser\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mcontent\u001b[39m\u001b[33m\"\u001b[39m: text}]\n\u001b[32m---> \u001b[39m\u001b[32m44\u001b[39m response = \u001b[43mclient\u001b[49m\u001b[43m.\u001b[49m\u001b[43mchat\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcompletions\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcreate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 45\u001b[39m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 46\u001b[39m \u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 47\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_format\u001b[49m\u001b[43m=\u001b[49m\u001b[43m{\u001b[49m\n\u001b[32m 48\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mtype\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mjson_object\u001b[39;49m\u001b[33;43m'\u001b[39;49m\n\u001b[32m 49\u001b[39m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\n\u001b[32m 50\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 51\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m : \n\u001b[32m 52\u001b[39m cat_json = json.loads(response.choices[\u001b[32m0\u001b[39m].message.content)\n",
145
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_utils/_utils.py:279\u001b[39m, in \u001b[36mrequired_args.<locals>.inner.<locals>.wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 277\u001b[39m msg = \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mMissing required argument: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mquote(missing[\u001b[32m0\u001b[39m])\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 278\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(msg)\n\u001b[32m--> \u001b[39m\u001b[32m279\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
146
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/resources/chat/completions/completions.py:914\u001b[39m, in \u001b[36mCompletions.create\u001b[39m\u001b[34m(self, messages, model, audio, frequency_penalty, function_call, functions, logit_bias, logprobs, max_completion_tokens, max_tokens, metadata, modalities, n, parallel_tool_calls, prediction, presence_penalty, reasoning_effort, response_format, seed, service_tier, stop, store, stream, stream_options, temperature, tool_choice, tools, top_logprobs, top_p, user, web_search_options, extra_headers, extra_query, extra_body, timeout)\u001b[39m\n\u001b[32m 871\u001b[39m \u001b[38;5;129m@required_args\u001b[39m([\u001b[33m\"\u001b[39m\u001b[33mmessages\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mmodel\u001b[39m\u001b[33m\"\u001b[39m], [\u001b[33m\"\u001b[39m\u001b[33mmessages\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mmodel\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mstream\u001b[39m\u001b[33m\"\u001b[39m])\n\u001b[32m 872\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcreate\u001b[39m(\n\u001b[32m 873\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 911\u001b[39m timeout: \u001b[38;5;28mfloat\u001b[39m | httpx.Timeout | \u001b[38;5;28;01mNone\u001b[39;00m | NotGiven = NOT_GIVEN,\n\u001b[32m 912\u001b[39m ) -> ChatCompletion | Stream[ChatCompletionChunk]:\n\u001b[32m 913\u001b[39m validate_response_format(response_format)\n\u001b[32m--> \u001b[39m\u001b[32m914\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_post\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 915\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43m/chat/completions\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 916\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmaybe_transform\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 917\u001b[39m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[32m 918\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmessages\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 919\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmodel\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 920\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43maudio\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43maudio\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 921\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mfrequency_penalty\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfrequency_penalty\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 922\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mfunction_call\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunction_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 923\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mfunctions\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunctions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 924\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mlogit_bias\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mlogit_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 925\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mlogprobs\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mlogprobs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 926\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmax_completion_tokens\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_completion_tokens\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 927\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmax_tokens\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_tokens\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 928\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmetadata\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 929\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmodalities\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodalities\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 930\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mn\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 931\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mparallel_tool_calls\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mparallel_tool_calls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 932\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mprediction\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mprediction\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 933\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mpresence_penalty\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mpresence_penalty\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 934\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mreasoning_effort\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mreasoning_effort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 935\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mresponse_format\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mresponse_format\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 936\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mseed\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mseed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 937\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mservice_tier\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mservice_tier\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 938\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstop\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 939\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstore\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 940\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstream\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 941\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstream_options\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 942\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtemperature\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtemperature\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 943\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtool_choice\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtool_choice\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 944\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtools\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtools\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 945\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtop_logprobs\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtop_logprobs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 946\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtop_p\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtop_p\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 947\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43muser\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43muser\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 948\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mweb_search_options\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mweb_search_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 949\u001b[39m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 950\u001b[39m \u001b[43m \u001b[49m\u001b[43mcompletion_create_params\u001b[49m\u001b[43m.\u001b[49m\u001b[43mCompletionCreateParams\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 951\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 952\u001b[39m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmake_request_options\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 953\u001b[39m \u001b[43m \u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[43m=\u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextra_query\u001b[49m\u001b[43m=\u001b[49m\u001b[43mextra_query\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextra_body\u001b[49m\u001b[43m=\u001b[49m\u001b[43mextra_body\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\n\u001b[32m 954\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 955\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m=\u001b[49m\u001b[43mChatCompletion\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 956\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 957\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mStream\u001b[49m\u001b[43m[\u001b[49m\u001b[43mChatCompletionChunk\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 958\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
147
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:1242\u001b[39m, in \u001b[36mSyncAPIClient.post\u001b[39m\u001b[34m(self, path, cast_to, body, options, files, stream, stream_cls)\u001b[39m\n\u001b[32m 1228\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpost\u001b[39m(\n\u001b[32m 1229\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 1230\u001b[39m path: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 1237\u001b[39m stream_cls: \u001b[38;5;28mtype\u001b[39m[_StreamT] | \u001b[38;5;28;01mNone\u001b[39;00m = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 1238\u001b[39m ) -> ResponseT | _StreamT:\n\u001b[32m 1239\u001b[39m opts = FinalRequestOptions.construct(\n\u001b[32m 1240\u001b[39m method=\u001b[33m\"\u001b[39m\u001b[33mpost\u001b[39m\u001b[33m\"\u001b[39m, url=path, json_data=body, files=to_httpx_files(files), **options\n\u001b[32m 1241\u001b[39m )\n\u001b[32m-> \u001b[39m\u001b[32m1242\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m cast(ResponseT, \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m)\u001b[49m)\n",
148
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:919\u001b[39m, in \u001b[36mSyncAPIClient.request\u001b[39m\u001b[34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[39m\n\u001b[32m 916\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 917\u001b[39m retries_taken = \u001b[32m0\u001b[39m\n\u001b[32m--> \u001b[39m\u001b[32m919\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 920\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 921\u001b[39m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[43m=\u001b[49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 922\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 923\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 924\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 925\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
149
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:1008\u001b[39m, in \u001b[36mSyncAPIClient._request\u001b[39m\u001b[34m(self, cast_to, options, retries_taken, stream, stream_cls)\u001b[39m\n\u001b[32m 1006\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m remaining_retries > \u001b[32m0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._should_retry(err.response):\n\u001b[32m 1007\u001b[39m err.response.close()\n\u001b[32m-> \u001b[39m\u001b[32m1008\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_retry_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1009\u001b[39m \u001b[43m \u001b[49m\u001b[43minput_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1010\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1011\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1012\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_headers\u001b[49m\u001b[43m=\u001b[49m\u001b[43merr\u001b[49m\u001b[43m.\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1013\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1014\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1015\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1017\u001b[39m \u001b[38;5;66;03m# If the response is streamed then we need to explicitly read the response\u001b[39;00m\n\u001b[32m 1018\u001b[39m \u001b[38;5;66;03m# to completion before attempting to access the response text.\u001b[39;00m\n\u001b[32m 1019\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m err.response.is_closed:\n",
150
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:1057\u001b[39m, in \u001b[36mSyncAPIClient._retry_request\u001b[39m\u001b[34m(self, options, cast_to, retries_taken, response_headers, stream, stream_cls)\u001b[39m\n\u001b[32m 1053\u001b[39m \u001b[38;5;66;03m# In a synchronous context we are blocking the entire thread. Up to the library user to run the client in a\u001b[39;00m\n\u001b[32m 1054\u001b[39m \u001b[38;5;66;03m# different thread if necessary.\u001b[39;00m\n\u001b[32m 1055\u001b[39m time.sleep(timeout)\n\u001b[32m-> \u001b[39m\u001b[32m1057\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1058\u001b[39m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[43m=\u001b[49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1059\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1060\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 1061\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1062\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1063\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
151
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:1008\u001b[39m, in \u001b[36mSyncAPIClient._request\u001b[39m\u001b[34m(self, cast_to, options, retries_taken, stream, stream_cls)\u001b[39m\n\u001b[32m 1006\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m remaining_retries > \u001b[32m0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._should_retry(err.response):\n\u001b[32m 1007\u001b[39m err.response.close()\n\u001b[32m-> \u001b[39m\u001b[32m1008\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_retry_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1009\u001b[39m \u001b[43m \u001b[49m\u001b[43minput_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1010\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1011\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1012\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_headers\u001b[49m\u001b[43m=\u001b[49m\u001b[43merr\u001b[49m\u001b[43m.\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1013\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1014\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1015\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1017\u001b[39m \u001b[38;5;66;03m# If the response is streamed then we need to explicitly read the response\u001b[39;00m\n\u001b[32m 1018\u001b[39m \u001b[38;5;66;03m# to completion before attempting to access the response text.\u001b[39;00m\n\u001b[32m 1019\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m err.response.is_closed:\n",
152
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:1057\u001b[39m, in \u001b[36mSyncAPIClient._retry_request\u001b[39m\u001b[34m(self, options, cast_to, retries_taken, response_headers, stream, stream_cls)\u001b[39m\n\u001b[32m 1053\u001b[39m \u001b[38;5;66;03m# In a synchronous context we are blocking the entire thread. Up to the library user to run the client in a\u001b[39;00m\n\u001b[32m 1054\u001b[39m \u001b[38;5;66;03m# different thread if necessary.\u001b[39;00m\n\u001b[32m 1055\u001b[39m time.sleep(timeout)\n\u001b[32m-> \u001b[39m\u001b[32m1057\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1058\u001b[39m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[43m=\u001b[49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1059\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1060\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 1061\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1062\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1063\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
153
+ "\u001b[36mFile \u001b[39m\u001b[32m~/.cache/pypoetry/virtualenvs/sciences-poc-Bw010oVJ-py3.11/lib/python3.11/site-packages/openai/_base_client.py:1023\u001b[39m, in \u001b[36mSyncAPIClient._request\u001b[39m\u001b[34m(self, cast_to, options, retries_taken, stream, stream_cls)\u001b[39m\n\u001b[32m 1020\u001b[39m err.response.read()\n\u001b[32m 1022\u001b[39m log.debug(\u001b[33m\"\u001b[39m\u001b[33mRe-raising status error\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1023\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m._make_status_error_from_response(err.response) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1025\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._process_response(\n\u001b[32m 1026\u001b[39m cast_to=cast_to,\n\u001b[32m 1027\u001b[39m options=options,\n\u001b[32m (...)\u001b[39m\u001b[32m 1031\u001b[39m retries_taken=retries_taken,\n\u001b[32m 1032\u001b[39m )\n",
154
+ "\u001b[31mRateLimitError\u001b[39m: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}"
155
+ ]
156
+ }
157
+ ],
158
+ "source": [
159
+ "with open('/home/sagemaker-user/Sciences-POC/config/mapping_prompts.txt', 'r') as f : \n",
160
+ " mapping = json.loads(f.read())\n",
161
+ "\n",
162
+ "for name in mapping.keys():\n",
163
+ " print(name)\n",
164
+ " retrieve_classifications(name, mapping)"
165
+ ]
166
+ },
167
+ {
168
+ "cell_type": "markdown",
169
+ "metadata": {},
170
+ "source": [
171
+ "#### Ajouter images"
172
+ ]
173
+ },
174
+ {
175
+ "cell_type": "code",
176
+ "execution_count": null,
177
+ "metadata": {},
178
+ "outputs": [],
179
+ "source": []
180
+ },
181
+ {
182
+ "cell_type": "code",
183
+ "execution_count": null,
184
+ "metadata": {},
185
+ "outputs": [],
186
+ "source": []
187
+ }
188
+ ],
189
+ "metadata": {
190
+ "kernelspec": {
191
+ "display_name": ".venv",
192
+ "language": "python",
193
+ "name": "python3"
194
+ },
195
+ "language_info": {
196
+ "codemirror_mode": {
197
+ "name": "ipython",
198
+ "version": 3
199
+ },
200
+ "file_extension": ".py",
201
+ "mimetype": "text/x-python",
202
+ "name": "python",
203
+ "nbconvert_exporter": "python",
204
+ "pygments_lexer": "ipython3",
205
+ "version": "3.11.11"
206
+ }
207
+ },
208
+ "nbformat": 4,
209
+ "nbformat_minor": 2
210
+ }
notebooks/execution.ipynb DELETED
@@ -1,210 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 3,
6
- "metadata": {},
7
- "outputs": [],
8
- "source": [
9
- "import pandas as pd \n",
10
- "import requests \n",
11
- "import datetime as dt\n",
12
- "import re\n",
13
- "import json\n",
14
- "from tqdm import tqdm\n",
15
- "import os\n",
16
- "\n",
17
- "from openai import OpenAI"
18
- ]
19
- },
20
- {
21
- "cell_type": "markdown",
22
- "metadata": {},
23
- "source": [
24
- "#### Calculate"
25
- ]
26
- },
27
- {
28
- "cell_type": "code",
29
- "execution_count": 12,
30
- "metadata": {},
31
- "outputs": [],
32
- "source": [
33
- "if \"OPENAI_API_KEY\" not in os.environ:\n",
34
- " with open('secrets/keys.txt', 'r') as f:\n",
35
- " keys = json.loads(f.read())\n",
36
- "else : \n",
37
- " keys=os.environ"
38
- ]
39
- },
40
- {
41
- "cell_type": "code",
42
- "execution_count": 15,
43
- "metadata": {},
44
- "outputs": [],
45
- "source": [
46
- "save_path = 'save'\n",
47
- "content_path = 'data/extract_sciences_po'\n",
48
- "\n",
49
- "\n",
50
- "def retrieve_classifications(name, mapping_prompt):\n",
51
- "\n",
52
- " df = pd.read_csv('extract_sciences_po.csv')\n",
53
- "\n",
54
- "\n",
55
- " if os.path.exists(f\"{save_path}/output_{name}.txt\"):\n",
56
- " with open(f\"{save_path}/output_{name}.txt\", 'r') as f : \n",
57
- " out_dict = json.loads(f.read())\n",
58
- " out_df = pd.DataFrame.from_dict(out_dict)\n",
59
- " out = out_dict\n",
60
- " else : \n",
61
- " out_df = pd.DataFrame(columns = ['item_id', 'categorie_principale', 'categorie_secondaire'])\n",
62
- " out = []\n",
63
- "\n",
64
- " df_to_process = df.loc[~df.item_id.isin(out_df.item_id)]\n",
65
- "\n",
66
- " if mapping_prompt[name]['client']=='deepseek':\n",
67
- " client = OpenAI(api_key=keys[\"DEEPSEEK_API_KEY\"], base_url=\"https://api.deepseek.com\")\n",
68
- " model=\"deepseek-chat\"\n",
69
- " else:\n",
70
- " client=OpenAI(api_key=keys['OPENAI_API_KEY'])\n",
71
- " model=\"gpt-4o\"\n",
72
- "\n",
73
- " df_to_process = df.loc[~df.item_id.isin(out_df.item_id)]\n",
74
- "\n",
75
- "\n",
76
- " with open(mapping_prompt[name]['path_prompt'], 'r') as f:\n",
77
- " prompt = f.read()\n",
78
- "\n",
79
- " with tqdm(total=df_to_process.shape[0]) as pbar:\n",
80
- " for i, row in df_to_process.iterrows():\n",
81
- " titre_brut = f\"{row.item_id}_\"+row.titre.lower().strip().replace(f\"\\xa0\", ' ').replace(' : ', ':').replace(' ', '_').replace('/', '')\n",
82
- " \n",
83
- " with open(f'{content_path}/{titre_brut}.txt', 'r') as f:\n",
84
- " text = f.read()\n",
85
- "\n",
86
- " messages = [{\"role\": \"system\", \"content\": prompt},\n",
87
- " {\"role\": \"user\", \"content\": text}]\n",
88
- "\n",
89
- " response = client.chat.completions.create(\n",
90
- " model=model,\n",
91
- " messages=messages,\n",
92
- " response_format={\n",
93
- " 'type': 'json_object'\n",
94
- " }\n",
95
- " )\n",
96
- " try : \n",
97
- " cat_json = json.loads(response.choices[0].message.content)\n",
98
- "\n",
99
- " out.append({\n",
100
- " 'item_id':row.item_id, \n",
101
- " 'categorie_principale': cat_json['categorie_principale'],\n",
102
- " 'categorie_secondaire': cat_json['categorie_secondaire'],\n",
103
- " })\n",
104
- " \n",
105
- " with open(f'{save_path}/output_{name}.txt', 'w+') as f : \n",
106
- " f.write(json.dumps(out))\n",
107
- "\n",
108
- " except Exception as e : \n",
109
- " print(f'Error with article {row.item_id}')\n",
110
- " pass\n",
111
- "\n",
112
- " \n",
113
- " pbar.update(1)\n",
114
- "\n"
115
- ]
116
- },
117
- {
118
- "cell_type": "code",
119
- "execution_count": 20,
120
- "metadata": {},
121
- "outputs": [
122
- {
123
- "name": "stdout",
124
- "output_type": "stream",
125
- "text": [
126
- "sans_titre_1\n"
127
- ]
128
- },
129
- {
130
- "name": "stderr",
131
- "output_type": "stream",
132
- "text": [
133
- "0it [00:00, ?it/s]"
134
- ]
135
- },
136
- {
137
- "name": "stderr",
138
- "output_type": "stream",
139
- "text": [
140
- "0it [00:00, ?it/s]\n"
141
- ]
142
- },
143
- {
144
- "name": "stdout",
145
- "output_type": "stream",
146
- "text": [
147
- "favarel_et_al\n"
148
- ]
149
- },
150
- {
151
- "name": "stderr",
152
- "output_type": "stream",
153
- "text": [
154
- " 21%|██▏ | 41/191 [05:28<16:54, 6.76s/it]"
155
- ]
156
- }
157
- ],
158
- "source": [
159
- "with open('mapping_prompts.txt', 'r') as f : \n",
160
- " mapping = json.loads(f.read())\n",
161
- "\n",
162
- "for name in mapping.keys():\n",
163
- " print(name)\n",
164
- " retrieve_classifications(name, mapping)"
165
- ]
166
- },
167
- {
168
- "cell_type": "markdown",
169
- "metadata": {},
170
- "source": [
171
- "#### Ajouter images"
172
- ]
173
- },
174
- {
175
- "cell_type": "code",
176
- "execution_count": null,
177
- "metadata": {},
178
- "outputs": [],
179
- "source": []
180
- },
181
- {
182
- "cell_type": "code",
183
- "execution_count": null,
184
- "metadata": {},
185
- "outputs": [],
186
- "source": []
187
- }
188
- ],
189
- "metadata": {
190
- "kernelspec": {
191
- "display_name": ".venv",
192
- "language": "python",
193
- "name": "python3"
194
- },
195
- "language_info": {
196
- "codemirror_mode": {
197
- "name": "ipython",
198
- "version": 3
199
- },
200
- "file_extension": ".py",
201
- "mimetype": "text/x-python",
202
- "name": "python",
203
- "nbconvert_exporter": "python",
204
- "pygments_lexer": "ipython3",
205
- "version": "3.11.11"
206
- }
207
- },
208
- "nbformat": 4,
209
- "nbformat_minor": 2
210
- }