FerdinandPyCode commited on
Commit
55f834a
·
1 Parent(s): 35228e8

first commit

Browse files
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ venv/
app.py ADDED
@@ -0,0 +1,375 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ import logging
4
+ from langchain.chat_models import ChatOpenAI
5
+
6
+ # Import the function for detecting the "est une étape" pattern
7
+ from pattern_ce_qui_explique import explication, explication_prompt_template
8
+ from pattern_epoque import epoque, epoque_prompt_template
9
+ from pattern_est_une_etape import une_etape, est_une_etape_prompt_template
10
+ from pattern_adverbe_ment import adverbement, adverbement_prompt_template
11
+ from pattern_connecteur_cependant import connecteur, connecteur_prompt_template
12
+ from pattern_decision import decision, decision_prompt_template
13
+ from pattern_look import look, look_prompt_template
14
+ from pattern_il_existe import il_existe, il_existe_prompt_template
15
+ from pattern_il_faut import il_faut, il_faut_prompt_template
16
+ from pattern_vous_pouvez import vous_pouvez, vous_pouvez_prompt_template
17
+ from pattern_imaginez import imaginez, imaginez_prompt_template
18
+ from pattern_en_plus import en_plus_prompt_template, detect_en_plus
19
+ from pattern_outre import detect_outre, outre_prompt_template
20
+ from pattern_il_suffit_de import detect_il_suffit_de, il_suffit_de_prompt_template
21
+ from pattern_important_crucial import importance_prompt_template, importance_detection
22
+ from pattern_permettre import permettre_detection, permettre_prompt_template
23
+ from pattern_voici_decouvrez import detect_voici_decouvrez, voici_decouvrez_prompt_template
24
+ from faute_style import detect_errors, academie_prompt_template
25
+
26
+ # Interface Streamlit
27
+ st.title("Analyse du texte")
28
+
29
+ # Liste des templates de prompt
30
+ List_prompt = {
31
+ "< Détection du pattern 'est une étape' >": est_une_etape_prompt_template(),
32
+ "< Détection du pattern 'epoque de, à l'ère de' >": epoque_prompt_template(),
33
+ "< Détection du pattern 'ce qui explique' >": explication_prompt_template(),
34
+ "< Détection des adverbes en -ment >": adverbement_prompt_template(),
35
+ "< Détection des connecteurs 'cependant' >": connecteur_prompt_template(),
36
+ "< Détection des decision 'éclairée...' >": decision_prompt_template(),
37
+ "< Détection du pattern 'look' >": look_prompt_template(),
38
+ "< Détection du pattern 'il existe' >": il_existe_prompt_template(),
39
+ "< Détection du pattern 'il faut' >": il_faut_prompt_template(),
40
+ "< Détection du pattern 'vous pouvez' >": vous_pouvez_prompt_template(),
41
+ "< Détection du pattern 'imaginez' >": imaginez_prompt_template(),
42
+ "< Détection du pattern 'en plus' >": en_plus_prompt_template(),
43
+ "< Détection du pattern 'outre' >": outre_prompt_template(),
44
+ "< Détection du pattern 'il suffit de' >": il_suffit_de_prompt_template(),
45
+ "< Détection du pattern 'important crucial' >": importance_prompt_template(),
46
+ "< Détection du pattern 'permettre' >": permettre_prompt_template(),
47
+ "< Détection du pattern 'voici découvrez' >": voici_decouvrez_prompt_template(),
48
+ "< Détection des erreurs de style" : academie_prompt_template()
49
+ }
50
+
51
+ # Menu déroulant pour sélectionner l'analyse
52
+ option = st.selectbox(
53
+ "Choisissez l'analyse à effectuer :",
54
+ List_prompt.keys()
55
+ )
56
+
57
+ # Afficher le prompt correspondant à l'option sélectionnée
58
+ selected_prompt = List_prompt.get(option, "")
59
+ st.subheader(f"Prompt : {option}")
60
+ st.text_area("Voici le prompt utilisé pour cette analyse :", value=selected_prompt, height=300, disabled=True)
61
+
62
+ # Champ de saisie du texte
63
+ input_text = st.text_area("Entrez votre texte ici :", height=200)
64
+
65
+ # Bouton d'analyse
66
+ if st.button("Lancer l'analyse"):
67
+ if input_text:
68
+ if option == "< Détection du pattern 'est une étape' >":
69
+ try:
70
+ # Analyser le texte pour les fautes de style
71
+ result = une_etape(input_text)
72
+
73
+ # Afficher les résultats en JSON formaté
74
+ st.subheader("Résultats de l'analyse du pattern 'est une étape'")
75
+ st.json(result['result'], expanded=True)
76
+
77
+ # Afficher le prompt final
78
+ # st.subheader("Prompt final envoyé au modèle")
79
+ # st.write(result['prompt'])
80
+
81
+ except Exception as e:
82
+ logging.error(f"Error during analysis: {e}")
83
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
84
+
85
+ elif option == "< Détection du pattern 'epoque de, à l'ère de' >":
86
+ try:
87
+ # Analyser le texte pour les fautes de style
88
+ result = epoque(input_text)
89
+
90
+ # Afficher les résultats en JSON formaté
91
+ st.subheader("Résultats de l'analyse du pattern 'epoque de, à l'ère de'")
92
+ st.json(result['result'], expanded=True)
93
+
94
+ # Afficher le prompt final
95
+ # st.subheader("Prompt final envoyé au modèle")
96
+ # st.write(result['prompt'])
97
+
98
+ except Exception as e:
99
+ logging.error(f"Error during analysis: {e}")
100
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
101
+
102
+ elif option == "< Détection du pattern 'ce qui explique' >":
103
+ try:
104
+ # Analyser le texte pour les fautes de style
105
+ result = explication(input_text)
106
+
107
+ # Afficher les résultats en JSON formaté
108
+ st.subheader("Résultats de l'analyse du pattern 'ce qui explique'")
109
+ st.json(result['result'], expanded=True)
110
+
111
+ # Afficher le prompt final
112
+ # st.subheader("Prompt final envoyé au modèle")
113
+ # st.write(result['prompt'])
114
+
115
+ except Exception as e:
116
+ logging.error(f"Error during analysis: {e}")
117
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
118
+
119
+ elif option == "< Détection des adverbes en -ment >":
120
+ try:
121
+ # Analyser le texte pour les fautes de style
122
+ result = adverbement(input_text)
123
+
124
+ # Afficher les résultats en JSON formaté
125
+ st.subheader("Résultats de l'analyse des adverbes en -ment")
126
+ st.json(result['result'], expanded=True)
127
+
128
+ # Afficher le prompt final
129
+ # st.subheader("Prompt final envoyé au modèle")
130
+ # st.write(result['prompt'])
131
+
132
+ except Exception as e:
133
+ logging.error(f"Error during analysis: {e}")
134
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
135
+
136
+ elif option == "< Détection des connecteurs 'cependant' >":
137
+ try:
138
+ # Analyser le texte pour les fautes de style
139
+ result = connecteur(input_text)
140
+
141
+ # Afficher les résultats en JSON formaté
142
+ st.subheader("Résultats de l'analyse des connecteurs 'cependant'")
143
+ st.json(result['result'], expanded=True)
144
+
145
+ # Afficher le prompt final
146
+ # st.subheader("Prompt final envoyé au modèle")
147
+ # st.write(result['prompt'])
148
+
149
+ except Exception as e:
150
+ logging.error(f"Error during analysis: {e}")
151
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
152
+
153
+ elif option == "< Détection des decision 'éclairée...' >":
154
+ try:
155
+ # Analyser le texte pour les fautes de style
156
+ result = decision(input_text)
157
+
158
+ # Afficher les résultats en JSON formaté
159
+ st.subheader("Résultats de l'analyse des decision 'éclairée...'")
160
+ st.json(result['result'], expanded=True)
161
+
162
+ # Afficher le prompt final
163
+ # st.subheader("Prompt final envoyé au modèle")
164
+ # st.write(result['prompt'])
165
+
166
+ except Exception as e:
167
+ logging.error(f"Error during analysis: {e}")
168
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
169
+
170
+ elif option == "< Détection du pattern 'look' >":
171
+ try:
172
+ # Analyser le texte pour les fautes de style
173
+ result = look(input_text)
174
+
175
+ # Afficher les résultats en JSON formaté
176
+ st.subheader("Résultats de l'analyse du pattern 'look'")
177
+ st.json(result['result'], expanded=True)
178
+
179
+ # Afficher le prompt final
180
+ # st.subheader("Prompt final envoyé au modèle")
181
+ # st.write(result['prompt'])
182
+
183
+ except Exception as e:
184
+ logging.error(f"Error during analysis: {e}")
185
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
186
+
187
+ elif option == "< Détection du pattern 'il existe' >":
188
+ try:
189
+ # Analyser le texte pour les fautes de style
190
+ result = il_existe(input_text)
191
+
192
+ # Afficher les résultats en JSON formaté
193
+ st.subheader("Résultats de l'analyse du pattern 'il existe'")
194
+ st.json(result['result'], expanded=True)
195
+
196
+ # Afficher le prompt final
197
+ # st.subheader("Prompt final envoyé au modèle")
198
+ # st.write(result['prompt'])
199
+
200
+ except Exception as e:
201
+ logging.error(f"Error during analysis: {e}")
202
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
203
+
204
+ elif option == "< Détection du pattern 'il faut' >":
205
+ try:
206
+ # Analyser le texte pour les fautes de style
207
+ result = il_faut(input_text)
208
+
209
+ # Afficher les résultats en JSON formaté
210
+ st.subheader("Résultats de l'analyse du pattern 'il faut'")
211
+ st.json(result['result'], expanded=True)
212
+
213
+ # Afficher le prompt final
214
+ # st.subheader("Prompt final envoyé au modèle")
215
+ # st.write(result['prompt'])
216
+
217
+ except Exception as e:
218
+ logging.error(f"Error during analysis: {e}")
219
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
220
+
221
+ elif option == "< Détection du pattern 'vous pouvez' >":
222
+ try:
223
+ # Analyser le texte pour les fautes de style
224
+ result = vous_pouvez(input_text)
225
+
226
+ # Afficher les résultats en JSON formaté
227
+ st.subheader("Résultats de l'analyse du pattern 'vous pouvez'")
228
+ st.json(result['result'], expanded=True)
229
+
230
+ # Afficher le prompt final
231
+ # st.subheader("Prompt final envoyé au modèle")
232
+ # st.write(result['prompt'])
233
+
234
+ except Exception as e:
235
+ logging.error(f"Error during analysis: {e}")
236
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
237
+
238
+ elif option == "< Détection du pattern 'imaginez' >":
239
+ try:
240
+ # Analyser le texte pour les fautes de style
241
+ result = imaginez(input_text)
242
+
243
+ # Afficher les résultats en JSON formaté
244
+ st.subheader("Résultats de l'analyse du pattern 'imaginez'")
245
+ st.json(result['result'], expanded=True)
246
+
247
+ # Afficher le prompt final
248
+ # st.subheader("Prompt final envoyé au modèle")
249
+ # st.write(result['prompt'])
250
+
251
+ except Exception as e:
252
+ logging.error(f"Error during analysis: {e}")
253
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
254
+
255
+ elif option == "< Détection du pattern 'en plus' >":
256
+ try:
257
+ # Analyser le texte pour les fautes de style
258
+ result = detect_en_plus(input_text)
259
+
260
+ # Afficher les résultats en JSON formaté
261
+ st.subheader("Résultats de l'analyse du pattern 'en plus'")
262
+ st.json(result['result'], expanded=True)
263
+
264
+ # Afficher le prompt final
265
+ # st.subheader("Prompt final envoyé au modèle")
266
+ # st.write(result['prompt'])
267
+
268
+ except Exception as e:
269
+ logging.error(f"Error during analysis: {e}")
270
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
271
+
272
+ elif option == "< Détection du pattern 'outre' >":
273
+ try:
274
+ # Analyser le texte pour les fautes de style
275
+ result = detect_outre(input_text)
276
+
277
+ # Afficher les résultats en JSON formaté
278
+ st.subheader("Résultats de l'analyse du pattern 'outre'")
279
+ st.json(result['result'], expanded=True)
280
+
281
+ # Afficher le prompt final
282
+ # st.subheader("Prompt final envoyé au modèle")
283
+ # st.write(result['prompt'])
284
+
285
+ except Exception as e:
286
+ logging.error(f"Error during analysis: {e}")
287
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
288
+
289
+ elif option == "< Détection du pattern 'il suffit de' >":
290
+ try:
291
+ # Analyser le texte pour les fautes de style
292
+ result = detect_il_suffit_de(input_text)
293
+
294
+ # Afficher les résultats en JSON formaté
295
+ st.subheader("Résultats de l'analyse du pattern 'il suffit de'")
296
+ st.json(result['result'], expanded=True)
297
+
298
+ # Afficher le prompt final
299
+ # st.subheader("Prompt final envoyé au modèle")
300
+ # st.write(result['prompt'])
301
+
302
+ except Exception as e:
303
+ logging.error(f"Error during analysis: {e}")
304
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
305
+
306
+ elif option == "< Détection du pattern 'important crucial' >":
307
+ try:
308
+ # Analyser le texte pour les fautes de style
309
+ result = importance_detection(input_text)
310
+
311
+ # Afficher les résultats en JSON formaté
312
+ st.subheader("Résultats de l'analyse du pattern 'important crucial'")
313
+ st.json(result['result'], expanded=True)
314
+
315
+ # Afficher le prompt final
316
+ # st.subheader("Prompt final envoyé au modèle")
317
+ # st.write(result['prompt'])
318
+
319
+ except Exception as e:
320
+ logging.error(f"Error during analysis: {e}")
321
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
322
+
323
+ elif option == "< Détection du pattern 'permettre' >":
324
+ try:
325
+ # Analyser le texte pour les fautes de style
326
+ result = permettre_detection(input_text)
327
+
328
+ # Afficher les résultats en JSON formaté
329
+ st.subheader("Résultats de l'analyse du pattern 'permettre'")
330
+ st.json(result['result'], expanded=True)
331
+
332
+ # Afficher le prompt final
333
+ # st.subheader("Prompt final envoyé au modèle")
334
+ # st.write(result['prompt'])
335
+
336
+ except Exception as e:
337
+ logging.error(f"Error during analysis: {e}")
338
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
339
+
340
+ elif option == "< Détection du pattern 'voici découvrez' >":
341
+ try:
342
+ # Analyser le texte pour les fautes de style
343
+ result = detect_voici_decouvrez(input_text)
344
+
345
+ # Afficher les résultats en JSON formaté
346
+ st.subheader("Résultats de l'analyse du pattern 'voici découvrez'")
347
+ st.json(result['result'], expanded=True)
348
+
349
+ # Afficher le prompt final
350
+ # st.subheader("Prompt final envoyé au modèle")
351
+ # st.write(result['prompt'])
352
+
353
+ except Exception as e:
354
+ logging.error(f"Error during analysis: {e}")
355
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
356
+
357
+ elif option == "< Détection des erreurs de style" :
358
+ try:
359
+ # Analyser le texte pour les fautes de style
360
+ result = detect_errors(input_text)
361
+
362
+ # Afficher les résultats en JSON formaté
363
+ st.subheader("Résultats de l'analyse des erreurs de style")
364
+ st.json(result['result'], expanded=True)
365
+
366
+ # Afficher le prompt final
367
+ st.subheader("Prompt final envoyé au modèle")
368
+ st.write(result['prompt'])
369
+
370
+ except Exception as e:
371
+ logging.error(f"Error during analysis: {e}")
372
+ st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
373
+
374
+ else:
375
+ st.error("Veuillez entrer du texte pour lancer l'analyse.")
const.py ADDED
@@ -0,0 +1,265 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ from typing import List
3
+ from pydantic import BaseModel, Field
4
+ from pydantic import BaseModel, ValidationError, conint
5
+
6
+ # Version 0.0.2
7
+ class PhraseDetail(BaseModel):
8
+ texte: str
9
+ indice_debut: int
10
+ indice_fin: int
11
+
12
+ class Erreur(BaseModel):
13
+ expression: str
14
+ indice_debut: int
15
+ indice_fin: int
16
+
17
+ class Reformulation(BaseModel):
18
+ texte: str
19
+
20
+ class DetectedPhrase(BaseModel):
21
+ phrase: PhraseDetail
22
+ erreurs: List[Erreur]
23
+ reformulations: List[Reformulation]
24
+ justification: str
25
+
26
+ class Summary(BaseModel):
27
+ total_erreurs: conint(ge=0)
28
+ total_phrases: conint(ge=0)
29
+ total_reformulations: conint(ge=0)
30
+
31
+
32
+ class DetectionResult(BaseModel):
33
+ phrases_detectees: List[DetectedPhrase] = Field(..., description="Liste des phrases contenant des erreurs avec leurs détails.")
34
+ summary: Summary = Field(..., description="Résumé des détections.")
35
+
36
+ def to_dict(self):
37
+ return {
38
+ "phrases_detectees": [phrase_detectee.model_dump() for phrase_detectee in self.phrases_detectees],
39
+ "summary": self.summary.model_dump()
40
+ }
41
+
42
+
43
+ def academie_prompt_template():
44
+ return """
45
+ Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de {mission}.
46
+
47
+ Voici quelques exemples d'erreurs que tu dois détecter et corriger :
48
+ - {Exemple d'erreur 1}, mais on dit {Correction 1}
49
+ - {Exemple d'erreur 2}, mais on dit {Correction 2}
50
+ - {Exemple d'erreur 3}, mais on dit {Correction 3}
51
+
52
+ Pour chaque occurrence trouvée, veille à :
53
+
54
+ - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
55
+ - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
56
+ - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
57
+ - Fournir **une justification unique** expliquant pourquoi les cinq reformulations proposées améliorent la phrase originale.
58
+
59
+ Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
60
+ - Évitez les anglicismes et les formulations informelles.
61
+ - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
62
+ - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
63
+ - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
64
+ - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
65
+ - "En plus" ne doit pas être utilisé seul en début de phrase.
66
+
67
+ Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
68
+
69
+ Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
70
+
71
+ Voici le texte à analyser :
72
+ {text}
73
+
74
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
75
+
76
+ ```json
77
+ {
78
+ "phrases_detectees": [
79
+ {
80
+ "phrase": {
81
+ "texte": "La phrase complète contenant les erreurs.",
82
+ "indice_debut": indice_debut_de_la_phrase,
83
+ "indice_fin": indice_fin_de_la_phrase
84
+ },
85
+ "erreurs": [
86
+ {
87
+ "expression": "L'expression erronée",
88
+ "indice_debut": indice_debut_de_l_expression,
89
+ "indice_fin": indice_fin_de_l_expression
90
+ }
91
+ // ... Autres erreurs éventuelles
92
+ ],
93
+ "reformulations": [
94
+ {
95
+ "texte": "Première reformulation de la phrase en tenant compte de toutes les erreurs détectées."
96
+ },
97
+ {
98
+ "texte": "Deuxième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
99
+ },
100
+ {
101
+ "texte": "Troisième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
102
+ },
103
+ {
104
+ "texte": "Quatrième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
105
+ },
106
+ {
107
+ "texte": "Cinquième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
108
+ }
109
+ ],
110
+ "justification": "Explication de pourquoi les cinq reformulations proposées sont plus correctes ou meilleures en tenant compte des erreurs détectées."
111
+ }
112
+ // ... Autres phrases détectées
113
+ ],
114
+ "summary": {
115
+ "total_erreurs": nombre_total_d_erreurs_detectées,
116
+ "total_phrases": nombre_total_de_phrases_contenant_des_erreurs,
117
+ "total_reformulations": nombre_total_de_reformulations_proposées
118
+ }
119
+ }
120
+ ```
121
+
122
+ - Assurez-vous que chaque indice correspond aux positions exactes dans le texte original.
123
+ - Le JSON doit être bien formé et respecter la structure indiquée.
124
+ - Les clés sont écrites en minuscules et suivent la structure spécifiée.
125
+ """
126
+
127
+
128
+ # Version 0.0.1
129
+ # class Phrase(BaseModel):
130
+ # texte: str = Field(..., description="La phrase complète contenant les erreurs.")
131
+ # indice_debut: int = Field(..., description="Indice de début de la phrase dans le texte.")
132
+ # indice_fin: int = Field(..., description="Indice de fin de la phrase dans le texte.")
133
+
134
+ # class Erreur(BaseModel):
135
+ # expression: str = Field(..., description="L'expression erronée.")
136
+ # indice_debut: int = Field(..., description="Indice de début de l'expression dans le texte.")
137
+ # indice_fin: int = Field(..., description="Indice de fin de l'expression dans le texte.")
138
+
139
+ # class Reformulation(BaseModel):
140
+ # texte: str = Field(..., description="Reformulation prenant en compte toutes les erreurs.")
141
+ # justification: str = Field(..., description="Explication de pourquoi cette reformulation est meilleure en tenant compte des erreurs détectées.")
142
+
143
+ # class PhraseDetection(BaseModel):
144
+ # phrase: Phrase = Field(..., description="Informations sur la phrase contenant les erreurs.")
145
+ # erreurs: List[Erreur] = Field(..., description="Liste des erreurs détectées dans la phrase.")
146
+ # reformulations: List[Reformulation] = Field(..., description="Liste des cinq reformulations proposées.")
147
+
148
+ # class Summary(BaseModel):
149
+ # total_erreurs: int = Field(..., description="Nombre total d'erreurs détectées.")
150
+ # total_phrases: int = Field(..., description="Nombre total de phrases contenant des erreurs.")
151
+ # total_reformulations: int = Field(..., description="Nombre total de reformulations proposées.")
152
+
153
+ # class DetectionResult(BaseModel):
154
+ # phrases_detectees: List[PhraseDetection] = Field(..., description="Liste des phrases contenant des erreurs avec leurs détails.")
155
+ # summary: Summary = Field(..., description="Résumé des détections.")
156
+
157
+ # def to_dict(self):
158
+ # return {
159
+ # "phrases_detectees": [phrase_detection.dict() for phrase_detection in self.phrases_detectees],
160
+ # "summary": self.summary.dict()
161
+ # }
162
+
163
+ # def academie_prompt_template():
164
+ # class Phrase(BaseModel):
165
+ # texte: str = Field(..., description="La phrase complète contenant les erreurs.")
166
+ # indice_debut: int = Field(..., description="Indice de début de la phrase dans le texte.")
167
+ # indice_fin: int = Field(..., description="Indice de fin de la phrase dans le texte.")
168
+
169
+ # class Erreur(BaseModel):
170
+ # expression: str = Field(..., description="L'expression erronée.")
171
+ # indice_debut: int = Field(..., description="Indice de début de l'expression dans le texte.")
172
+ # indice_fin: int = Field(..., description="Indice de fin de l'expression dans le texte.")
173
+
174
+ # class Reformulation(BaseModel):
175
+ # texte: str = Field(..., description="Reformulation proposée.")
176
+
177
+ # class PhraseDetection(BaseModel):
178
+ # phrase: Phrase = Field(..., description="Informations sur la phrase contenant les erreurs.")
179
+ # erreurs: List[Erreur] = Field(..., description="Liste des erreurs détectées dans la phrase.")
180
+ # reformulations: List[Reformulation] = Field(..., description="Liste des cinq reformulations proposées.")
181
+ # justification_unique: str = Field(..., description="Justification unique expliquant pourquoi ces reformulations améliorent la phrase.")
182
+
183
+ # class Summary(BaseModel):
184
+ # total_erreurs: int = Field(..., description="Nombre total d'erreurs détectées.")
185
+ # total_phrases: int = Field(..., description="Nombre total de phrases contenant des erreurs.")
186
+ # total_reformulations: int = Field(..., description="Nombre total de reformulations proposées.")
187
+
188
+ # class DetectionResult(BaseModel):
189
+ # phrases_detectees: List[PhraseDetection] = Field(..., description="Liste des phrases contenant des erreurs avec leurs détails.")
190
+ # summary: Summary = Field(..., description="Résumé des détections.")
191
+
192
+ # def to_dict(self):
193
+ # return {
194
+ # "phrases_detectees": [phrase_detection.dict() for phrase_detection in self.phrases_detectees],
195
+ # "summary": self.summary.model_dump()
196
+ # }
197
+
198
+
199
+ # """Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de {mission}.
200
+
201
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
202
+ # - {Exemple d'erreur 1}, mais on dit {Correction 1}
203
+ # - {Exemple d'erreur 2}, mais on dit {Correction 2}
204
+ # - {Exemple d'erreur 3}, mais on dit {Correction 3}
205
+
206
+ # Pour chaque occurrence trouvée, veille à :
207
+
208
+ # - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
209
+ # - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
210
+ # - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
211
+ # - Fournir **une justification unique** expliquant pourquoi les cinq reformulations proposées améliorent la phrase originale.
212
+
213
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
214
+ # - Évitez les anglicismes et les formulations informelles.
215
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
216
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
217
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
218
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
219
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
220
+
221
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
222
+
223
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
224
+
225
+ # Voici le texte à analyser :
226
+ # {text}
227
+
228
+
229
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
230
+
231
+ # \n{format_instruction}
232
+ # """
233
+
234
+ # """Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de {mission}.
235
+
236
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
237
+ # - {Exemple d'erreur 1}, mais on dit {Correction 1}
238
+ # - {Exemple d'erreur 2}, mais on dit {Correction 2}
239
+ # - {Exemple d'erreur 3}, mais on dit {Correction 3}
240
+
241
+ # Pour chaque occurrence trouvée, veille à :
242
+
243
+ # - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
244
+ # - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
245
+ # - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
246
+ # - Fournir une justification pour expliquer pourquoi la reformulation est plus correcte ou meilleure.
247
+
248
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
249
+ # - Évitez les anglicismes et les formulations informelles.
250
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
251
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
252
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
253
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
254
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
255
+
256
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
257
+
258
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
259
+
260
+ # Voici le texte à analyser :
261
+ # {text}
262
+
263
+
264
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
265
+ # \n{format_instruction}>>"""
faute_style.py ADDED
@@ -0,0 +1,558 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field, field_validator
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+ # Last version Yet
10
+
11
+ class PhraseDetail(BaseModel):
12
+ texte: str
13
+ indice_debut: int
14
+ indice_fin: int
15
+
16
+ class Erreur(BaseModel):
17
+ expression: str
18
+ indice_debut: int
19
+ indice_fin: int
20
+
21
+ class Reformulation(BaseModel):
22
+ texte: str
23
+
24
+ class DetectedPhrase(BaseModel):
25
+ phrase: PhraseDetail
26
+ erreurs: List[Erreur]
27
+ reformulations: List[Reformulation]
28
+ justification: str
29
+
30
+ class Summary(BaseModel):
31
+ total_erreurs: int
32
+ total_phrases: int
33
+ total_reformulations: int
34
+
35
+ @field_validator('total_erreurs', 'total_phrases', 'total_reformulations')
36
+ def non_negative(cls, v, field):
37
+ if v < 0:
38
+ raise ValueError(f"{field.name} doit être non négatif")
39
+ return v
40
+
41
+
42
+ class DetectionResult(BaseModel):
43
+ phrases_detectees: List[DetectedPhrase] = Field(..., description="Liste des phrases contenant des erreurs avec leurs détails.")
44
+ summary: Summary = Field(..., description="Résumé des détections.")
45
+
46
+ def to_dict(self):
47
+ return {
48
+ "phrases_detectees": [phrase_detectee.model_dump() for phrase_detectee in self.phrases_detectees],
49
+ "summary": self.summary.model_dump()
50
+ }
51
+
52
+
53
+ def academie_prompt_template():
54
+ return """Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de repérer des erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
55
+
56
+ Voici quelques exemples d'erreurs que tu dois détecter et corriger :
57
+ - On ne dit pas "Faire recours", mais on dit "Avoir recours" ou "Recourir"
58
+ - On ne dit pas "Souscrire à un contrat", mais on dit "Souscrire un contrat"
59
+ - On ne dit pas "Dans ce sens" (pour parler d'un raisonnement), mais on dit "En ce sens"
60
+ - On ne dit pas "En termes de" pour parler de "En matière de"
61
+ - On ne dit pas "Palier à", mais on dit "Palier" tout court
62
+ - On ne dit pas "code de la route", mais "Code de la route"
63
+
64
+ Pour chaque occurrence trouvée, veille à :
65
+
66
+ - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
67
+ - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
68
+ - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
69
+ - Fournir **une justification unique** expliquant pourquoi les cinq reformulations proposées améliorent la phrase originale.
70
+
71
+ Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
72
+ - Évitez les anglicismes et les formulations informelles.
73
+ - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
74
+ - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
75
+ - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
76
+ - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
77
+ - "En plus" ne doit pas être utilisé seul en début de phrase.
78
+
79
+ Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
80
+
81
+ Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
82
+
83
+ Voici le texte à analyser :
84
+
85
+ ```{text}```
86
+
87
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
88
+ ```json
89
+ {{
90
+ "phrases_detectees": [
91
+ {{
92
+ "phrase": {{
93
+ "texte": "La phrase complète contenant les erreurs.",
94
+ "indice_debut": indice_debut_de_la_phrase,
95
+ "indice_fin": indice_fin_de_la_phrase
96
+ }},
97
+ "erreurs": [
98
+ {{
99
+ "expression": "L'expression erronée",
100
+ "indice_debut": indice_debut_de_l_expression,
101
+ "indice_fin": indice_fin_de_l_expression
102
+ }}
103
+
104
+ ],
105
+ "reformulations": [
106
+ {{
107
+ "texte": "Première reformulation de la phrase en tenant compte de toutes les erreurs détectées."
108
+ }},
109
+ {{
110
+ "texte": "Deuxième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
111
+ }},
112
+ {{
113
+ "texte": "Troisième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
114
+ }},
115
+ {{
116
+ "texte": "Quatrième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
117
+ }},
118
+ {{
119
+ "texte": "Cinquième reformulation de la phrase en tenant compte de toutes les erreurs détectées."
120
+ }}
121
+ ],
122
+ "justification": "Explication de pourquoi les cinq reformulations proposées sont plus correctes ou meilleures en tenant compte des erreurs détectées."
123
+ }}
124
+
125
+ ],
126
+ "summary": {{
127
+ "total_erreurs": nombre_total_d_erreurs_detectées,
128
+ "total_phrases": nombre_total_de_phrases_contenant_des_erreurs,
129
+ "total_reformulations": nombre_total_de_reformulations_proposées
130
+ }}
131
+ }}
132
+ ```
133
+ \n{format_instruction}
134
+ """
135
+
136
+ def detect_errors(text):
137
+ # Créer le template avec la variable text intégrée directement
138
+ prompt_template = academie_prompt_template()
139
+
140
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
141
+
142
+ # Créer le prompt avec le texte intégré
143
+ gen_prompt_template = PromptTemplate(
144
+ input_variables=["text"],
145
+ template=prompt_template,
146
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
147
+ )
148
+
149
+ # Créer une instance du modèle de langage
150
+ llm = ChatOpenAI(model='gpt-4', temperature=0.5, api_key="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")
151
+
152
+ # Exécuter la chaîne avec le LLM
153
+ llm_chain = gen_prompt_template | llm | output_parser
154
+
155
+ # Appel du modèle avec le texte fourni
156
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
157
+
158
+ # Parsing de la réponse JSON
159
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
160
+
161
+ # Générer le prompt final
162
+ final_prompt = gen_prompt_template.format(text=text)
163
+
164
+ # Retourne les suggestions ou les erreurs de parsing
165
+ return {
166
+ "result": json_result,
167
+ "prompt": final_prompt
168
+ }
169
+
170
+
171
+ # Version 0.0.1
172
+ # class Phrase(BaseModel):
173
+ # texte: str = Field(..., description="La phrase complète contenant les erreurs.")
174
+ # indice_debut: int = Field(..., description="Indice de début de la phrase dans le texte.")
175
+ # indice_fin: int = Field(..., description="Indice de fin de la phrase dans le texte.")
176
+
177
+ # class Erreur(BaseModel):
178
+ # expression: str = Field(..., description="L'expression erronée.")
179
+ # indice_debut: int = Field(..., description="Indice de début de l'expression dans le texte.")
180
+ # indice_fin: int = Field(..., description="Indice de fin de l'expression dans le texte.")
181
+
182
+ # class Reformulation(BaseModel):
183
+ # texte: str = Field(..., description="Reformulation prenant en compte toutes les erreurs.")
184
+ # justification: str = Field(..., description="Explication de pourquoi cette reformulation est meilleure en tenant compte des erreurs détectées.")
185
+
186
+ # class PhraseDetection(BaseModel):
187
+ # phrase: Phrase = Field(..., description="Informations sur la phrase contenant les erreurs.")
188
+ # erreurs: List[Erreur] = Field(..., description="Liste des erreurs détectées dans la phrase.")
189
+ # reformulations: List[Reformulation] = Field(..., description="Liste des cinq reformulations proposées.")
190
+
191
+ # class Summary(BaseModel):
192
+ # total_erreurs: int = Field(..., description="Nombre total d'erreurs détectées.")
193
+ # total_phrases: int = Field(..., description="Nombre total de phrases contenant des erreurs.")
194
+ # total_reformulations: int = Field(..., description="Nombre total de reformulations proposées.")
195
+
196
+ # class DetectionResult(BaseModel):
197
+ # phrases_detectees: List[PhraseDetection] = Field(..., description="Liste des phrases contenant des erreurs avec leurs détails.")
198
+ # summary: Summary = Field(..., description="Résumé des détections.")
199
+
200
+ # def to_dict(self):
201
+ # return {
202
+ # "phrases_detectees": [phrase_detection.model_dump() for phrase_detection in self.phrases_detectees],
203
+ # "summary": self.summary.model_dump()
204
+ # }
205
+
206
+
207
+ # def academie_prompt_template():
208
+ # return """
209
+ # Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de repérer des erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
210
+
211
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
212
+ # - On ne dit pas "Faire recours", mais on dit "Avoir recours" ou "Recourir"
213
+ # - On ne dit pas "Souscrire à un contrat", mais on dit "Souscrire un contrat"
214
+ # - On ne dit pas "Dans ce sens" (pour parler d'un raisonnement), mais on dit "En ce sens"
215
+ # - On ne dit pas "En termes de" pour parler de "En matière de"
216
+ # - On ne dit pas "Palier à", mais on dit "Palier" tout court
217
+ # - On ne dit pas "code de la route", mais "Code de la route"
218
+
219
+ # Pour chaque occurrence trouvée, veille à :
220
+
221
+ # - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
222
+ # - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
223
+ # - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
224
+ # - Fournir **une justification unique** expliquant pourquoi les cinq reformulations proposées améliorent la phrase originale.
225
+
226
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
227
+ # - Évitez les anglicismes et les formulations informelles.
228
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
229
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
230
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
231
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
232
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
233
+
234
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
235
+
236
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
237
+
238
+ # Voici le texte à analyser :
239
+
240
+ # ```{text}```
241
+
242
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
243
+
244
+ # - "phrase_avec_erreur": {
245
+ # "contenu": "<contenu_de_la_phrase>",
246
+ # "indices_phrase": "<indices_debut_fin_phrase>"
247
+ # },
248
+ # - "erreurs": [
249
+ # {
250
+ # "expression_erreur": "<expression_erronee>",
251
+ # "indices_expression": "<indices_debut_fin_expression>",
252
+ # "reformulations": [
253
+ # "<reformulation_1>",
254
+ # "<reformulation_2>",
255
+ # "<reformulation_3>",
256
+ # "<reformulation_4>",
257
+ # "<reformulation_5>"
258
+ # ],
259
+ # "justification": "<justification_pour_les_reformulations>"
260
+ # }
261
+ # ]
262
+ # \n{format_instruction}
263
+ # """
264
+
265
+ # def detect_errors(text):
266
+ # # Créer le template avec la variable text intégrée directement
267
+ # prompt_template = academie_prompt_template()
268
+
269
+ # output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
270
+
271
+ # # Créer le prompt avec le texte intégré
272
+ # gen_prompt_template = PromptTemplate(
273
+ # input_variables=["text"],
274
+ # template=prompt_template,
275
+ # partial_variables={'format_instruction': output_parser.get_format_instructions()}
276
+ # )
277
+
278
+ # # Créer une instance du modèle de langage
279
+ # llm = ChatOpenAI(model='gpt-4', temperature=0.5, api_key="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")
280
+
281
+ # # Exécuter la chaîne avec le LLM
282
+ # llm_chain = gen_prompt_template | llm | output_parser
283
+
284
+ # # Appel du modèle avec le texte fourni
285
+ # result_dict = llm_chain.invoke({"text": text}).to_dict()
286
+
287
+ # # Parsing de la réponse JSON
288
+ # json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
289
+
290
+ # # Générer le prompt final
291
+ # final_prompt = gen_prompt_template.format(text=text)
292
+
293
+ # # Retourne les suggestions ou les erreurs de parsing
294
+ # return {
295
+ # "result": json_result,
296
+ # "prompt": final_prompt
297
+ # }
298
+
299
+ # # Modèles Pydantic pour structurer la réponse
300
+ # class AlternativeSuggestion(BaseModel):
301
+ # suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
302
+ # suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
303
+ # suggestion_3: str = Field(..., description="Troisième suggestion de reformulation.")
304
+ # suggestion_4: str = Field(..., description="Quatrième suggestion de reformulation.")
305
+ # suggestion_5: str = Field(..., description="Cinquième suggestion de reformulation.")
306
+ # justification: str = Field(..., description="Justification de la suggestion.")
307
+
308
+
309
+ # class PatternDetail(BaseModel):
310
+ # pattern: str = Field(..., description="Mot ou expression détectée.")
311
+ # indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence de l'expression dans le texte.")
312
+ # sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
313
+ # sentence_indices: Tuple[int, int] = Field(..., description="Indices de début et de fin de la phrase complète dans le texte.")
314
+ # alternative_suggestions: AlternativeSuggestion = Field(..., description="Cinq suggestions de reformulation avec justification. La phrase complète peut être modifiée.")
315
+
316
+ # def to_dict(self):
317
+ # return {
318
+ # "pattern": self.pattern,
319
+ # "indices": self.indices,
320
+ # "sentence": self.sentence,
321
+ # "sentence_indices": self.sentence_indices,
322
+ # "alternative_suggestions": {
323
+ # "suggestion_1": self.alternative_suggestions.suggestion_1,
324
+ # "suggestion_2": self.alternative_suggestions.suggestion_2,
325
+ # "suggestion_3": self.alternative_suggestions.suggestion_3,
326
+ # "suggestion_4": self.alternative_suggestions.suggestion_4,
327
+ # "suggestion_5": self.alternative_suggestions.suggestion_5,
328
+ # "justification": self.alternative_suggestions.justification
329
+ # }
330
+ # }
331
+
332
+
333
+ # class Summary(BaseModel):
334
+ # total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
335
+ # alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
336
+ # occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
337
+
338
+ # def to_dict(self):
339
+ # return {
340
+ # "total_patterns_detected": self.total_patterns_detected,
341
+ # "alternative_suggestions_provided": self.alternative_suggestions_provided,
342
+ # "occurrences": self.occurrences
343
+ # }
344
+
345
+
346
+ # class DetectionResult(BaseModel):
347
+ # patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
348
+ # summary: Summary = Field(..., description="Résumé de la détection.")
349
+
350
+ # def to_dict(self):
351
+ # return {
352
+ # "patterns": [pattern.to_dict() for pattern in self.patterns],
353
+ # "summary": self.summary.to_dict()
354
+ # }
355
+
356
+
357
+ # def academie_prompt_template():
358
+ # return """
359
+ # Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de repérer des erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
360
+
361
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
362
+ # - On ne dit pas "Faire recours", mais on dit "Avoir recours" ou "Recourir"
363
+ # - On ne dit pas "Souscrire à un contrat", mais on dit "Souscrire un contrat"
364
+ # - On ne dit pas "Dans ce sens" (pour parler d’un raisonnement), mais on dit "En ce sens"
365
+ # - On ne dit pas "En termes de" pour parler de "En matière de"
366
+ # - On ne dit pas "Palier à", mais on dit "Palier" tout court
367
+ # - On ne dit pas "code de la route", mais "Code de la route"
368
+
369
+ # Pour chaque occurrence trouvée, veille à :
370
+
371
+ # - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
372
+ # - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
373
+ # - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
374
+ # - Fournir une justification pour expliquer pourquoi la reformulation est plus correcte ou meilleure.
375
+
376
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
377
+ # - Évitez les anglicismes et les formulations informelles.
378
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
379
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
380
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
381
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
382
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
383
+
384
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
385
+
386
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
387
+
388
+ # Voici le texte à analyser :
389
+ # ```{text}```
390
+
391
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
392
+ # \n{format_instruction}
393
+ # """
394
+
395
+
396
+
397
+
398
+ # """Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de {mission}.
399
+
400
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
401
+ # - {Exemple d'erreur 1}, mais on dit {Correction 1}
402
+ # - {Exemple d'erreur 2}, mais on dit {Correction 2}
403
+ # - {Exemple d'erreur 3}, mais on dit {Correction 3}
404
+
405
+ # Pour chaque occurrence trouvée, veille à :
406
+
407
+ # - Citer la phrase complète où l'expression apparaît, avec les **indices de début et de fin** de cette phrase dans le texte.
408
+ # - Indiquer l'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
409
+ # - Proposer 5 reformulations. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
410
+ # - Fournir une justification pour expliquer pourquoi la reformulation est plus correcte ou meilleure.
411
+
412
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
413
+ # - Évitez les anglicismes et les formulations informelles.
414
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
415
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
416
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
417
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
418
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
419
+
420
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
421
+
422
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
423
+
424
+ # Voici le texte à analyser :
425
+ # ```{text}```
426
+
427
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
428
+ # \n{format_instruction}
429
+ # """
430
+
431
+ # """<<Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de {mission}.
432
+
433
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
434
+ # - {Exemple d'erreur 1}, mais on dit {Correction 1}
435
+ # - {Exemple d'erreur 2}, mais on dit {Correction 2}
436
+ # - {Exemple d'erreur 3}, mais on dit {Correction 3}
437
+
438
+ # Pour chaque phrase contenant une ou plusieurs erreurs, veille à :
439
+
440
+ # - Citer la phrase complète où les erreurs apparaissent, avec les **indices de début et de fin** de cette phrase dans le texte.
441
+ # - Indiquer pour chaque erreur dans la phrase :
442
+ # - L'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
443
+ # - Proposer 5 reformulations de la phrase en prenant en compte toutes les erreurs détectées. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
444
+ # - Fournir une justification pour expliquer pourquoi chaque reformulation est plus correcte ou meilleure.
445
+
446
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
447
+ # - Évitez les anglicismes et les formulations informelles.
448
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
449
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
450
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
451
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
452
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
453
+
454
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
455
+
456
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
457
+
458
+ # Voici le texte à analyser :
459
+ # ```{text}```
460
+
461
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque phrase contenant des erreurs :
462
+ # \n{format_instruction}>>"""
463
+
464
+
465
+
466
+ # def academie_prompt_template():
467
+ # return """
468
+ # Tu es un rédacteur web expérimenté et pointilleux qui fait attention aux moindres détails. Je vais te donner un texte, et ta mission est de repérer des erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
469
+
470
+ # Voici quelques exemples d'erreurs que tu dois détecter et corriger :
471
+ # - On ne dit pas "Faire recours", mais on dit "Avoir recours" ou "Recourir"
472
+ # - On ne dit pas "Souscrire à un contrat", mais on dit "Souscrire un contrat"
473
+ # - On ne dit pas "Dans ce sens" (pour parler d’un raisonnement), mais on dit "En ce sens"
474
+ # - On ne dit pas "En termes de" pour parler de "En matière de"
475
+ # - On ne dit pas "Palier à", mais on dit "Palier" tout court
476
+ # - On ne dit pas "code de la route", mais "Code de la route"
477
+
478
+ # Pour chaque phrase contenant une ou plusieurs erreurs, veille à :
479
+
480
+ # - Citer la phrase complète où les erreurs apparaissent, avec les **indices de début et de fin** de cette phrase dans le texte.
481
+ # - Indiquer pour chaque erreur dans la phrase :
482
+ # - L'expression exacte utilisée dans le texte, avec ses **indices de début et de fin** pour chaque occurrence.
483
+ # - Proposer 5 reformulations de la phrase en prenant en compte toutes les erreurs détectées. Vous pouvez modifier toute la phrase si nécessaire pour améliorer le style tout en conservant le sens original et en prenant en compte le **contexte global** de la phrase dans le texte.
484
+ # - Fournir une justification pour expliquer pourquoi chaque reformulation est plus correcte ou meilleure en tenant compte des erreurs détectées.
485
+
486
+ # Les reformulations proposées doivent être fluides, naturelles, et respecter les règles suivantes :
487
+ # - Évitez les anglicismes et les formulations informelles.
488
+ # - Utilisez des termes et expressions appropriés pour un contexte formel ou professionnel.
489
+ # - Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
490
+ # - Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
491
+ # - Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
492
+ # - "En plus" ne doit pas être utilisé seul en début de phrase.
493
+
494
+ # Les reformulations doivent également éviter les erreurs de langue courantes, notamment celles répertoriées par l'Académie Française (site : https://www.academie-francaise.fr/dire-ne-pas-dire/).
495
+
496
+ # Assurez-vous que chaque reformulation tient compte du **contexte sémantique** et logique de la phrase et du paragraphe dans lequel elle apparaît. Les reformulations doivent préserver le sens global de la phrase et son intention originale, même si la structure de la phrase change.
497
+
498
+ # Voici le texte à analyser :
499
+ # ```{text}```
500
+
501
+ # Le format de sortie doit être un JSON structuré avec les éléments suivants :
502
+
503
+ # ```json
504
+ # {
505
+ # "phrases_detectees": [
506
+ # {
507
+ # "phrase": {
508
+ # "texte": "La phrase complète contenant les erreurs.",
509
+ # "indice_debut": indice_debut_de_la_phrase,
510
+ # "indice_fin": indice_fin_de_la_phrase
511
+ # },
512
+ # "erreurs": [
513
+ # {
514
+ # "expression": "L'expression erronée",
515
+ # "indice_debut": indice_debut_de_l_expression,
516
+ # "indice_fin": indice_fin_de_l_expression
517
+ # }
518
+ # // ... Autres erreurs éventuelles
519
+ # ],
520
+ # "reformulations": [
521
+ # {
522
+ # "texte": "Première reformulation de la phrase en tenant compte de toutes les erreurs détectées.",
523
+ # "justification": "Explication de pourquoi cette reformulation est plus correcte ou meilleure en tenant compte des erreurs détectées."
524
+ # },
525
+ # {
526
+ # "texte": "Deuxième reformulation de la phrase en tenant compte de toutes les erreurs détectées.",
527
+ # "justification": "Explication de pourquoi cette reformulation est plus correcte ou meilleure en tenant compte des erreurs détectées."
528
+ # },
529
+ # {
530
+ # "texte": "Troisième reformulation de la phrase en tenant compte de toutes les erreurs détectées.",
531
+ # "justification": "Explication de pourquoi cette reformulation est plus correcte ou meilleure en tenant compte des erreurs détectées."
532
+ # },
533
+ # {
534
+ # "texte": "Quatrième reformulation de la phrase en tenant compte de toutes les erreurs détectées.",
535
+ # "justification": "Explication de pourquoi cette reformulation est plus correcte ou meilleure en tenant compte des erreurs détectées."
536
+ # },
537
+ # {
538
+ # "texte": "Cinquième reformulation de la phrase en tenant compte de toutes les erreurs détectées.",
539
+ # "justification": "Explication de pourquoi cette reformulation est plus correcte ou meilleure en tenant compte des erreurs détectées."
540
+ # }
541
+ # ]
542
+ # }
543
+ # // ... Autres phrases détectées
544
+ # ],
545
+ # "summary": {
546
+ # "total_erreurs": nombre_total_d_erreurs_detectées,
547
+ # "total_phrases": nombre_total_de_phrases_contenant_des_erreurs,
548
+ # "total_reformulations": nombre_total_de_reformulations_proposées
549
+ # }
550
+ # }
551
+ # ```
552
+
553
+ # Assurez-vous que :
554
+
555
+ # - Chaque indice correspond aux positions exactes dans le texte original.
556
+ # - Le JSON est bien formé et respecte la structure indiquée.
557
+ # - Les clés sont écrites en minuscules et suivent la structure spécifiée.
558
+ # """
pattern_adverbe_ment.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+ justification: str = Field(..., description="Justification de la suggestion.")
15
+
16
+
17
+ class PatternDetail(BaseModel):
18
+ pattern: str = Field(..., description="Mot ou expression détectée.")
19
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
20
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
21
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation avec justification.")
22
+
23
+ def to_dict(self):
24
+ return {
25
+ "pattern": self.pattern,
26
+ "indices": self.indices,
27
+ "sentence": self.sentence,
28
+ "alternative_suggestions": {
29
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
30
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
31
+ "justification": self.alternative_suggestions.justification
32
+ }
33
+ }
34
+
35
+
36
+ class Summary(BaseModel):
37
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
38
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
39
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
40
+
41
+ def to_dict(self):
42
+ return {
43
+ "total_patterns_detected": self.total_patterns_detected,
44
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
45
+ "occurrences": self.occurrences
46
+ }
47
+
48
+
49
+ class DetectionResult(BaseModel):
50
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
51
+ summary: Summary = Field(..., description="Résumé de la détection.")
52
+
53
+ def to_dict(self):
54
+ return {
55
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
56
+ "summary": self.summary.to_dict()
57
+ }
58
+
59
+
60
+ def adverbement_prompt_template():
61
+ return """
62
+ Veuillez analyser le texte suivant et identifier tous les adverbes se terminant par "-ment".
63
+ Regroupe ces patterns par phrase afin de les reformuler ensemble dans la seule phrase.
64
+
65
+ Pour chaque occurrence trouvée, veuillez :
66
+
67
+ - Citer la phrase complète où l'expression apparaît.
68
+ - Indiquer l'expression exacte utilisée dans le texte.
69
+ - Proposer deux reformulations de la phrase en supprimant les adverbes redondants ou superflus, ou en les remplaçant par des verbes plus précis pour améliorer le style, tout en conservant le sens original.
70
+ - Fournir une justification de la suggestion, expliquant en quoi elle améliore la clarté ou le style.
71
+
72
+ Assurez-vous de respecter les règles suivantes :
73
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées dans les phrases.
74
+ 2. Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
75
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
76
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
77
+
78
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
79
+
80
+ - "pattern": "mot ou expression détectée",
81
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
82
+ - "sentence": "phrase où l'expression est utilisée",
83
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"],
84
+ - "justification": "justification de la suggestion"
85
+
86
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
87
+ - "pattern0": "",
88
+ - "occurrences": 0,
89
+
90
+ À la fin, ajoutez un résumé avec :
91
+ - "total_patterns_detected": nombre total de patterns détectés,
92
+ - "alternative_suggestions_provided": nombre de suggestions données,
93
+ - "occurrences": nombre d'occurrences.
94
+
95
+ Voici le texte à analyser :
96
+ ```{text}```
97
+
98
+ \n{format_instruction}
99
+ """
100
+
101
+
102
+ def adverbement(text):
103
+ # Créer le template avec la variable text intégrée directement
104
+ prompt_template = adverbement_prompt_template()
105
+
106
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
107
+
108
+ # Créer le prompt avec le texte intégré
109
+ gen_prompt_template = PromptTemplate(
110
+ input_variables=["text"],
111
+ template=prompt_template,
112
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
113
+ )
114
+
115
+ # Créer une instance du modèle de langage
116
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
117
+
118
+ # Exécuter la chaîne avec le LLM
119
+ llm_chain = gen_prompt_template | llm | output_parser
120
+
121
+ # Appel du modèle avec le texte fourni
122
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
123
+
124
+ # Parsing de la réponse JSON
125
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
126
+
127
+ # Générer le prompt final
128
+ final_prompt = gen_prompt_template.format(text=text)
129
+
130
+ # Retourne les suggestions ou les erreurs de parsing
131
+ return {
132
+ "result": json_result,
133
+ "prompt": final_prompt
134
+ }
pattern_ce_qui_explique.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ }
31
+ }
32
+
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+
47
+ class DetectionResult(BaseModel):
48
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
49
+ summary: Summary = Field(..., description="Résumé de la détection.")
50
+
51
+ def to_dict(self):
52
+ return {
53
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
54
+ "summary": self.summary.to_dict()
55
+ }
56
+
57
+
58
+ def explication_prompt_template():
59
+ return """
60
+ Analyse le texte suivant et identifie toutes les occurrences de l'expression "Ce qui" et ses variantes, telles que :
61
+ "Ce qui signifie que", "Ce qui implique que", "Ce qui veut dire que", "Ce qui fait que", "Ce qui entraîne",
62
+ "Ce qui conduit à", "Ce qui permet de", "Ce qui résulte en", "Ce qui cause", "Ce qui représente".
63
+
64
+ Incluez également toute autre expression similaire commençant par "Ce qui" et introduisant une conséquence, une explication ou une clarification.
65
+
66
+ Pour chaque occurrence trouvée, veuillez :
67
+
68
+ - Citer la phrase complète où l'expression apparaît.
69
+ - Indiquer l'expression exacte utilisée dans le texte.
70
+ - Proposer deux reformulations de la phrase pour changer l'expression détectée, en évitant les répétitions, et rendre la phrase plus précise et claire.
71
+ - Assurez-vous de respecter les règles suivantes :
72
+ 1. Ne pas utiliser plus d'une fois dans l'introduction des expressions comme "crucial", "essentiel", "important", "fondamental", etc.
73
+ 2. Ne pas utiliser "il existe", "il faut", "cependant", "de plus", etc., en début de phrase.
74
+ 3. Les expressions comme "Joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des mots comme "important", "essentiel", etc.
75
+ 4. "En plus" ne doit pas être seul en début de phrase.
76
+
77
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
78
+
79
+ - "pattern": "mot ou expression détectée",
80
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
81
+ - "sentence": "phrase où l'expression est utilisée",
82
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
83
+
84
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
85
+
86
+ - "pattern0": "",
87
+ - "occurrences": 0,
88
+
89
+ À la fin, ajoutez un résumé avec :
90
+ - "total_patterns_detected": nombre total de patterns détectés,
91
+ - "alternative_suggestions_provided": nombre de suggestions fournies,
92
+ - "occurrences": nombre d'occurrences.
93
+
94
+ Voici le texte à analyser :
95
+ ```{text}```
96
+
97
+ \n{format_instruction}
98
+ """
99
+
100
+
101
+ def explication(text):
102
+ # Créer le template avec la variable text intégrée directement
103
+ prompt_template = explication_prompt_template()
104
+
105
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
106
+
107
+ # Créer le prompt avec le texte intégré
108
+ gen_prompt_template = PromptTemplate(
109
+ input_variables=["text"],
110
+ template=prompt_template,
111
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
112
+ )
113
+
114
+ # Créer une instance du modèle de langage
115
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
116
+
117
+ # Exécuter la chaîne avec le LLM
118
+ llm_chain = gen_prompt_template | llm | output_parser
119
+
120
+ # Appel du modèle avec le texte fourni
121
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
122
+
123
+ # Parsing de la réponse JSON
124
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
125
+
126
+ # Générer le prompt final
127
+ final_prompt = gen_prompt_template.format(text=text)
128
+
129
+ # Retourne les suggestions ou les erreurs de parsing
130
+ return {
131
+ "result": json_result,
132
+ "prompt": final_prompt
133
+ }
pattern_connecteur_cependant.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+ justification: str = Field(..., description="Justification de la suggestion.")
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation avec justification.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ "justification": self.alternative_suggestions.justification
31
+ }
32
+ }
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+ class DetectionResult(BaseModel):
47
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
48
+ summary: Summary = Field(..., description="Résumé de la détection.")
49
+
50
+ def to_dict(self):
51
+ return {
52
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
53
+ "summary": self.summary.to_dict()
54
+ }
55
+
56
+ def connecteur_prompt_template():
57
+ return """
58
+ Veuillez analyser le texte suivant et identifier toutes les phrases qui commencent par des connecteurs ou des adverbes tels que :
59
+
60
+ Opposition/Concession : "Cependant", "Toutefois", "Néanmoins", "Pourtant", "En revanche", "Or", "Mais", "Malgré tout", "En dépit de cela", "Au demeurant", "Bien que", "Quoique"
61
+ Addition : "De plus", "En outre", "Par ailleurs", "D'ailleurs", "De surcroît", "En addition", "Par-dessus le marché", "En plus de cela"
62
+ Conséquence : "Ainsi", "Donc", "Alors", "Par conséquent", "En effet", "C'est pourquoi", "Par suite", "En conséquence", "Il en résulte que", "D'où"
63
+ Chronologie : "Ensuite", "Puis", "D'abord", "Premièrement", "Deuxièmement", "Enfin", "Par la suite"
64
+ Exemple : "Par exemple", "Notamment", "En particulier", "Comme"
65
+ Conclusion/Synthèse : "Finalement", "Au final", "En conclusion", "Pour finir", "En résumé", "Somme toute"
66
+
67
+ Pour chaque occurrence trouvée, veuillez :
68
+
69
+ - Citer la phrase complète où l'expression apparaît.
70
+ - Indiquer l'expression exacte utilisée dans le texte.
71
+ - Proposer deux reformulations de la phrase, en déplaçant le connecteur vers le milieu ou la fin de la phrase si approprié, ou en intégrant le connecteur dans une phrase précédente ou suivante pour améliorer la fluidité.
72
+ - Fournir une justification de la suggestion, expliquant en quoi elle améliore la clarté ou le style.
73
+
74
+ Assurez-vous de respecter les règles suivantes :
75
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées plus d'une fois dans l'introduction.
76
+ 2. Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
77
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
78
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
79
+
80
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
81
+
82
+ - "pattern": "mot ou expression détectée",
83
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
84
+ - "sentence": "phrase où l'expression est utilisée",
85
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"],
86
+ - "justification": "justification de la suggestion"
87
+
88
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
89
+ - "pattern0": "",
90
+ - "occurrences": 0,
91
+
92
+ À la fin, ajoutez un résumé avec :
93
+ - "total_patterns_detected": nombre total de patterns détectés,
94
+ - "alternative_suggestions_provided": nombre de suggestions données,
95
+ - "occurrences": nombre d'occurrences.
96
+
97
+ Voici le texte à analyser :
98
+ ```{text}```
99
+
100
+ \n{format_instruction}
101
+ """
102
+
103
+ def connecteur(text):
104
+ # Créer le template avec la variable text intégrée directement
105
+ prompt_template = connecteur_prompt_template()
106
+
107
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
108
+
109
+ # Créer le prompt avec le texte intégré
110
+ gen_prompt_template = PromptTemplate(
111
+ input_variables=["text"],
112
+ template=prompt_template,
113
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
114
+ )
115
+
116
+ # Créer une instance du modèle de langage
117
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
118
+
119
+ # Exécuter la chaîne avec le LLM
120
+ llm_chain = gen_prompt_template | llm | output_parser
121
+
122
+ # Appel du modèle avec le texte fourni
123
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
124
+
125
+ # Parsing de la réponse JSON
126
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
127
+
128
+ # Générer le prompt final
129
+ final_prompt = gen_prompt_template.format(text=text)
130
+
131
+ # Retourne les suggestions ou les erreurs de parsing
132
+ return {
133
+ "result": json_result,
134
+ "prompt": final_prompt
135
+ }
pattern_decision.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+ justification: str = Field(..., description="Justification de la suggestion.")
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation avec justification.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ "justification": self.alternative_suggestions.justification
31
+ }
32
+ }
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+ class DetectionResult(BaseModel):
47
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
48
+ summary: Summary = Field(..., description="Résumé de la détection.")
49
+
50
+ def to_dict(self):
51
+ return {
52
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
53
+ "summary": self.summary.to_dict()
54
+ }
55
+
56
+ def decision_prompt_template():
57
+ return """
58
+ Veuillez analyser le texte suivant et identifier toutes les occurrences des expressions liées à la prise de décision comportant des adjectifs tels que "éclairée", "avisée", "judicieuse", "réfléchie", "sage", "pertinente", "optimale", "sensée", etc.
59
+
60
+ Pour chaque occurrence trouvée, veuillez :
61
+
62
+ - Citer la phrase complète où l'expression apparaît.
63
+ - Indiquer l'expression exacte utilisée dans le texte.
64
+ - Proposer deux reformulations de la phrase, en supprimant l'expression ou en la reformulant pour améliorer le style, tout en conservant le sens général.
65
+ - Assurez-vous que la phrase reformulée est grammaticalement correcte, naturelle et adaptée au contexte.
66
+
67
+ Assurez-vous également de respecter les règles suivantes :
68
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées plus d'une fois dans l'introduction.
69
+ 2. Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
70
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
71
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
72
+
73
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
74
+
75
+ - "pattern": "mot ou expression détectée",
76
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
77
+ - "sentence": "phrase où l'expression est utilisée",
78
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"],
79
+ - "justification": "justification de la suggestion"
80
+
81
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
82
+ - "pattern0": "",
83
+ - "occurrences": 0,
84
+
85
+ À la fin, ajoutez un résumé avec :
86
+ - "total_patterns_detected": nombre total de patterns détectés,
87
+ - "alternative_suggestions_provided": nombre de suggestions données,
88
+ - "occurrences": nombre d'occurrences.
89
+
90
+ Voici le texte à analyser :
91
+ ```{text}```
92
+
93
+ \n{format_instruction}
94
+ """
95
+
96
+ def decision(text):
97
+ # Créer le template avec la variable text intégrée directement
98
+ prompt_template = decision_prompt_template()
99
+
100
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
101
+
102
+ # Créer le prompt avec le texte intégré
103
+ gen_prompt_template = PromptTemplate(
104
+ input_variables=["text"],
105
+ template=prompt_template,
106
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
107
+ )
108
+
109
+ # Créer une instance du modèle de langage
110
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
111
+
112
+ # Exécuter la chaîne avec le LLM
113
+ llm_chain = gen_prompt_template | llm | output_parser
114
+
115
+ # Appel du modèle avec le texte fourni
116
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
117
+
118
+ # Parsing de la réponse JSON
119
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
120
+
121
+ # Générer le prompt final
122
+ final_prompt = gen_prompt_template.format(text=text)
123
+
124
+ # Retourne les suggestions ou les erreurs de parsing
125
+ return {
126
+ "result": json_result,
127
+ "prompt": final_prompt
128
+ }
pattern_detection_permettre.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spacy
2
+
3
+ # Charger le modèle de langue française
4
+ nlp = spacy.load('fr_core_news_md') # Utilisez 'fr_core_news_sm' si 'md' n'est pas disponible
5
+
6
+ def est_auxiliaire(token):
7
+ return token.pos_ == "AUX" or (token.pos_ == "VERB" and token.tag_ and "Aux" in token.tag_)
8
+
9
+ def est_infinitif(token):
10
+ return token.pos_ == "VERB" and "Inf" in token.tag_
11
+
12
+ def trouver_formes_permettre(texte):
13
+ doc = nlp(texte)
14
+ resultats = []
15
+ for i, token in enumerate(doc):
16
+ # Vérifier si le lemme est "permettre" et que le mot est un verbe (autre que "permis")
17
+ if token.lemma_ == "permettre" and token.pos_ == "VERB" and token.text.lower() != "permis":
18
+ resultats.append((token.text, token.idx))
19
+ # Traiter spécifiquement le mot "permis"
20
+ elif token.text.lower() == "permis":
21
+ est_verbe = False
22
+ # Vérifier si le mot précédent est un auxiliaire
23
+ if i > 0 and est_auxiliaire(doc[i - 1]):
24
+ est_verbe = True
25
+ # Vérifier si le mot suivant est "de" suivi d'un verbe à l'infinitif
26
+ elif i + 2 < len(doc) and doc[i + 1].text.lower() == "de" and est_infinitif(doc[i + 2]):
27
+ est_verbe = True
28
+ # Vérifier si le mot précédent est un déterminant (le, la, un, une, etc.)
29
+ elif i > 0 and doc[i - 1].pos_ == "DET":
30
+ est_verbe = False
31
+ else:
32
+ # Autres vérifications possibles si nécessaire
33
+ est_verbe = False
34
+
35
+ if est_verbe:
36
+ resultats.append((token.text, token.idx))
37
+ else:
38
+ continue # C'est un nom, on l'exclut
39
+ return resultats
40
+
41
+ # Exemple d'utilisation
42
+ texte = """
43
+ Il m'a permis de partir. J'ai besoin d'un permis de conduire.
44
+ Cela permet de comprendre. La loi permettra des changements.
45
+ Le permis de construire a été accordé. Nous avons permis cette action.
46
+ """
47
+
48
+ formes_permettre = trouver_formes_permettre(texte)
49
+ print("Les formes du verbe 'permettre' trouvées dans le texte avec leurs index sont :")
50
+ for mot, index in formes_permettre:
51
+ print(f"Mot : '{mot}' à l'index {index}")
pattern_en_plus.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from langchain.output_parsers import PydanticOutputParser
3
+ from pydantic import BaseModel, Field
4
+ from typing import List
5
+ import json
6
+ from langchain.chat_models import ChatOpenAI
7
+
8
+
9
+ # Modèle de sortie pour la détection de l'expression "en plus" en début de phrase
10
+ class ReformulationDetail(BaseModel):
11
+ original: str = Field(..., description="Phrase originale contenant 'en plus' en début de phrase.")
12
+ explanation: str = Field(..., description="Explication sur pourquoi l'expression 'en plus' est mal placée en début de phrase.")
13
+ reformulation_1: str = Field(..., description="Reformulation de la phrase avec 'en plus' déplacé.")
14
+ reformulation_2: str = Field(..., description="Seconde reformulation de la phrase.")
15
+ reformulation_3: str = Field(..., description="Troisième reformulation de la phrase.")
16
+
17
+ def to_dict(self):
18
+ return {
19
+ "original": self.original,
20
+ "explanation": self.explanation,
21
+ "reformulation_1": self.reformulation_1,
22
+ "reformulation_2": self.reformulation_2,
23
+ "reformulation_3": self.reformulation_3
24
+ }
25
+
26
+ class Summary(BaseModel):
27
+ total_occurrences: int = Field(..., description="Nombre total d'occurrences de 'en plus' détectées.")
28
+ reformulations_provided: int = Field(..., description="Nombre de reformulations fournies.")
29
+
30
+ def to_dict(self):
31
+ return {
32
+ "total_occurrences": self.total_occurrences,
33
+ "reformulations_provided": self.reformulations_provided
34
+ }
35
+
36
+ class DetectionResult(BaseModel):
37
+ reformulations: List[ReformulationDetail] = Field(..., description="Liste des reformulations proposées.")
38
+ summary: Summary = Field(..., description="Résumé de la détection.")
39
+
40
+ def to_dict(self):
41
+ return {
42
+ "reformulations": [reformulation.to_dict() for reformulation in self.reformulations],
43
+ "summary": self.summary.to_dict()
44
+ }
45
+
46
+ # Création du template pour la détection de l'utilisation de "en plus" en début de phrase
47
+ def en_plus_prompt_template():
48
+ return """
49
+ Vous êtes un éditeur de texte IA extrêmement rigoureux. Votre tâche est d'analyser **précisément** le texte fourni pour détecter **toutes les occurrences** de l'expression **"en plus"** utilisée **en début de phrase**, sans "de".
50
+
51
+ Pour chaque phrase trouvée, vous devez impérativement :
52
+
53
+ 1. **Citer exactement** la phrase originale contenant "en plus".
54
+ 2. **Expliquer brièvement et clairement** pourquoi "en plus" est mal placé en début de phrase et préciser qu'il doit être reformulé au cœur de la phrase.
55
+ 3. **Proposer trois alternatives plus correctes**, telles que "de plus", "en outre", "par ailleurs", "aussi", mais **placées au milieu de la phrase**.
56
+ 4. **Assurer** que chaque reformulation est **fluide**, **naturelle** et que l'alternative n'est pas placée au début ou à la fin de la phrase.
57
+
58
+ **Consignes supplémentaires :**
59
+
60
+ - **Ne pas ajouter** d'informations ou de commentaires non demandés.
61
+ - Présenter les résultats de manière **claire**, **structurée** et en respectant le format indiqué.
62
+ - **Ne pas analyser** ou modifier d'autres parties du texte que les phrases contenant "en plus" en début de phrase.
63
+
64
+ ### Format attendu pour chaque occurrence :
65
+
66
+ - **Original** : "[Phrase originale]"
67
+ - **Explication** : "[Explication concise]"
68
+ - **Reformulation 1** : "[Reformulation ici]"
69
+ - **Reformulation 2** : "[Reformulation ici]"
70
+ - **Reformulation 3** : "[Reformulation ici]"
71
+
72
+ Le texte à analyser est le suivant :
73
+ ```{text}```
74
+
75
+ {format_instruction}
76
+ """
77
+
78
+ def detect_en_plus(text):
79
+ # Création du modèle de sortie avec Pydantic
80
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
81
+
82
+ # Génération du prompt à partir du modèle
83
+ gen_prompt_template = PromptTemplate(
84
+ input_variables=["text"],
85
+ template=en_plus_prompt_template(),
86
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
87
+ )
88
+
89
+ # Création du modèle de langage (avec LLM)
90
+ llm = ChatOpenAI(model='gpt-4', temperature=0.5, api_key="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")
91
+
92
+ # Chaîne de traitement du prompt avec le modèle et le parseur
93
+ llm_chain = gen_prompt_template | llm | output_parser
94
+
95
+ # Appel du modèle avec le texte fourni
96
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
97
+
98
+ # Conversion du résultat en JSON
99
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
100
+
101
+ # Génération du prompt final
102
+ final_prompt = gen_prompt_template.format(text=text)
103
+
104
+ # Retour des résultats
105
+ return {
106
+ "result": json_result,
107
+ "prompt": final_prompt
108
+ }
pattern_epoque.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ }
31
+ }
32
+
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+
47
+ class DetectionResult(BaseModel):
48
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
49
+ summary: Summary = Field(..., description="Résumé de la détection.")
50
+
51
+ def to_dict(self):
52
+ return {
53
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
54
+ "summary": self.summary.to_dict()
55
+ }
56
+
57
+
58
+ def epoque_prompt_template():
59
+ return """
60
+ Analyse le texte suivant et identifie toutes les occurrences des expressions suivantes et de leurs variantes :
61
+ "Le monde de", "L’univers de", "À l’ère de", "Le domaine de", "À l'époque de", "Au temps de", "À l'aube de",
62
+ "Dans le cadre de", "Au cœur de", "En matière de", "Dans l'univers de".
63
+
64
+ Incluez également toute autre expression similaire qui introduit un contexte général ou un cadre temporel ou spatial.
65
+
66
+ Pour chaque occurrence trouvée, veuillez :
67
+
68
+ - Citer la phrase complète où l'expression apparaît.
69
+ - Indiquer l'expression exacte utilisée dans le texte.
70
+ - Proposer deux reformulations de la phrase, de sorte à remplacer l'expression détectée par une formulation plus précise ou stylistiquement améliorée, sans utiliser d'expressions équivalentes.
71
+ - Justifiez brièvement chaque reformulation en expliquant comment elle améliore le style ou la clarté.
72
+
73
+ Assurez-vous de respecter également les règles suivantes :
74
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental", et d'autres ne doivent être utilisées qu'une fois dans l'introduction (premier paragraphe).
75
+ 2. Les expressions comme "Il existe", "Il faut", "cependant", "De plus", "en revanche", "Néanmoins", "toutefois", "imaginez" ne doivent pas être utilisées en début de phrase.
76
+ 3. "Joue un rôle", "il est", ou "est une étape" ne doivent pas être associés à des mots tels que "important", "essentiel", etc.
77
+ 4. "En plus" (et ses variantes) ne doit pas être seul en début de phrase.
78
+
79
+ Votre analyse doit être retournée en JSON avec les éléments suivants :
80
+
81
+ Pour chaque pattern détecté :
82
+ - "pattern": "mot ou expression détectée",
83
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
84
+ - "sentence": "phrase où l'expression est utilisée",
85
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"] (si applicable)
86
+
87
+ Si aucun pattern n'est trouvé, renvoyez :
88
+ - "pattern0": "",
89
+ - "occurrences": 0,
90
+
91
+ À la fin, ajoutez un résumé avec :
92
+ - "total_patterns_detected": nombre total de patterns détectés,
93
+ - "alternative_suggestions_provided": nombre de suggestions fournies,
94
+ - "occurrences": nombre d'occurrences.
95
+
96
+ Voici le texte à analyser :
97
+ ```{text}```
98
+
99
+ \n{format_instruction}
100
+ """
101
+
102
+
103
+ def epoque(text):
104
+ # Créer le template avec la variable text intégrée directement
105
+ prompt_template = epoque_prompt_template()
106
+
107
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
108
+
109
+ # Créer le prompt avec le texte intégré
110
+ gen_prompt_template = PromptTemplate(
111
+ input_variables=["text"],
112
+ template=prompt_template,
113
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
114
+ )
115
+
116
+ # Créer une instance du modèle de langage
117
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
118
+
119
+ # Exécuter la chaîne avec le LLM
120
+ llm_chain = gen_prompt_template | llm | output_parser # LLMChain(prompt=prompt, llm=llm, verbose=True)
121
+
122
+ # Appel du modèle avec le texte fourni
123
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
124
+
125
+ # Parsing de la réponse JSON
126
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
127
+
128
+ # Générer le prompt final
129
+ final_prompt = gen_prompt_template.format(text=text)
130
+
131
+ # Retourne les suggestions ou les erreurs de parsing
132
+ return {
133
+ "result": json_result,
134
+ "prompt": final_prompt
135
+ }
pattern_est_une_etape.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ class AlternativeSuggestion(BaseModel):
11
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
12
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
13
+
14
+
15
+ class PatternDetail(BaseModel):
16
+ pattern: str = Field(..., description="Mot ou expression détectée.")
17
+ adjectif: str = Field(..., description="Adjectif associé à l'expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "adjectif": self.adjectif,
26
+ "indices": self.indices,
27
+ "sentence": self.sentence,
28
+ "alternative_suggestions": {
29
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
30
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
31
+ }
32
+ }
33
+
34
+
35
+ class Summary(BaseModel):
36
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
37
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
38
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
39
+
40
+ def to_dict(self):
41
+ return {
42
+ "total_patterns_detected": self.total_patterns_detected,
43
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
44
+ "occurrences": self.occurrences
45
+ }
46
+
47
+
48
+ class DetectionResult(BaseModel):
49
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
50
+ summary: Summary = Field(..., description="Résumé de la détection.")
51
+
52
+ def to_dict(self):
53
+ return {
54
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
55
+ "summary": self.summary.to_dict()
56
+ }
57
+
58
+ def est_une_etape_prompt_template() :
59
+
60
+ return """
61
+ Analyser le texte suivant et identifier toutes les phrases où une expression similaire à "est une étape" est utilisée,
62
+ y compris des variantes comme "est une étape", "constitue une étape", "représente une étape", "marque une étape",
63
+ "signifie une étape", "symbolise une étape", etc.
64
+
65
+ Recherche particulièrement ces expressions lorsqu'elles sont associées à des adjectifs exprimant l'importance
66
+ (par exemple, "important", "essentiel", "crucial", "primordial", "fondamental", "indispensable", "déterminant",
67
+ "vital", "majeur", "clé", "nécessaire", "stratégique", "significatif", etc.), que l'adjectif se trouve avant ou après le mot "étape".
68
+
69
+ Pour chaque occurrence trouvée, veuillez :
70
+
71
+ - Citer la phrase complète où l'expression apparaît.
72
+ - Indiquer l'expression exacte utilisée dans le texte.
73
+ - Mentionner l'adjectif d'importance associé.
74
+ - Proposer deux reformulations de la phrase pour changer l'expression détectée et l'adjectif associé,
75
+ sans employer d'expression équivalente.
76
+ - Assurez-vous de respecter les règles suivantes :
77
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" doivent être utilisées une seule fois
78
+ dans l'introduction (premier paragraphe).
79
+ 2. Évitez l'usage de mots comme "il existe", "il faut", "cependant", "de plus", "en revanche", "toutefois" en début de phrase.
80
+ 3. N'utilisez pas "joue un rôle", "il est", ou "est une étape" avec des adjectifs tels qu'"important", "essentiel", etc.
81
+
82
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
83
+
84
+ - "pattern": "mot ou expression détectée",
85
+ - "adjectif": "adjectif associé",
86
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
87
+ - "sentence": "phrase où l'expression est utilisée",
88
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
89
+
90
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
91
+
92
+ - "pattern0": "",
93
+ - "occurrences": 0,
94
+
95
+ Ajoutez également un résumé à la fin :
96
+
97
+ - "total_patterns_detected": nombre total de patterns détectés,
98
+ - "alternative_suggestions_provided": nombre de suggestions données
99
+ - "occurrences": nombre d'occurrences.
100
+
101
+ Voici le texte à analyser :
102
+ ```{text}```
103
+
104
+ \n{format_instruction}
105
+ """
106
+
107
+ def une_etape(text):
108
+ # Créer le template avec la variable text intégrée directement
109
+ prompt_template = est_une_etape_prompt_template()
110
+
111
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
112
+
113
+ # Créer le prompt avec le texte intégré
114
+ # prompt = PromptTemplate(template=template, input_variables=["text"])
115
+
116
+ gen_prompt_template = PromptTemplate(
117
+ input_variables=["text"],
118
+ template=prompt_template,
119
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
120
+ )
121
+
122
+ # Créer une instance du modèle de langage
123
+ llm = ChatOpenAI(model='gpt-4o',temperature=0.5, api_key="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")
124
+
125
+ # Exécuter la chaîne avec le LLM
126
+ llm_chain = gen_prompt_template | llm | output_parser # LLMChain(prompt=prompt, llm=llm, verbose=True)
127
+
128
+ # Appel du modèle avec le texte fourni
129
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
130
+
131
+ # Parsing de la réponse JSON
132
+
133
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii= False)
134
+
135
+ final_prompt = gen_prompt_template.format(text=text)
136
+ # Retourne les suggestions ou les erreurs de parsing
137
+
138
+ return {
139
+ "result": json_result,
140
+ "prompt": final_prompt
141
+ }
pattern_il_existe.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+ # Modèles Pydantic pour structurer la réponse
10
+ class AlternativeSuggestion(BaseModel):
11
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
12
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
13
+
14
+ class PatternDetail(BaseModel):
15
+ pattern: str = Field(..., description="Mot ou expression détectée.")
16
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
17
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
18
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation.")
19
+
20
+ def to_dict(self):
21
+ return {
22
+ "pattern": self.pattern,
23
+ "indices": self.indices,
24
+ "sentence": self.sentence,
25
+ "alternative_suggestions": {
26
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
27
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
28
+ }
29
+ }
30
+
31
+ class Summary(BaseModel):
32
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
33
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
34
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
35
+
36
+ def to_dict(self):
37
+ return {
38
+ "total_patterns_detected": self.total_patterns_detected,
39
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
40
+ "occurrences": self.occurrences
41
+ }
42
+
43
+ class DetectionResult(BaseModel):
44
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
45
+ summary: Summary = Field(..., description="Résumé de la détection.")
46
+
47
+ def to_dict(self):
48
+ return {
49
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
50
+ "summary": self.summary.to_dict()
51
+ }
52
+
53
+ # Fonction pour générer le prompt template
54
+ def il_existe_prompt_template():
55
+ return """
56
+ Analyser le texte suivant et détecter toutes les occurrences de l'expression "il existe" et ses variantes, telles que :
57
+
58
+ "il existe"
59
+ "il y a"
60
+ "on trouve"
61
+ "on peut trouver"
62
+ "il est possible de trouver"
63
+ "on découvre"
64
+ "il est possible de découvrir"
65
+
66
+ Pour chaque occurrence trouvée, veuillez :
67
+
68
+ - Citer la phrase complète où l'expression apparaît.
69
+ - Indiquer l'expression exacte utilisée dans le texte.
70
+ - Expliquer pourquoi l'expression "il existe" peut être lourde, formelle ou inutilement descriptive dans certains contextes.
71
+ - Proposer deux reformulations plus simples, fluides et naturelles pour rendre la phrase plus concise ou directe, en évitant d'utiliser "il existe" ou ses variantes.
72
+
73
+ Assurez-vous également de respecter les règles suivantes :
74
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" ne doivent pas être utilisées plus d'une fois dans l'introduction.
75
+ 2. Les expressions comme "il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
76
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs tels qu'"important", "essentiel", etc.
77
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
78
+
79
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
80
+
81
+ - "pattern": "mot ou expression détectée",
82
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
83
+ - "sentence": "phrase où l'expression est utilisée",
84
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
85
+
86
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
87
+ - "pattern0": "",
88
+ - "occurrences": 0,
89
+
90
+ À la fin, ajoutez un résumé avec :
91
+ - "total_patterns_detected": nombre total de patterns détectés,
92
+ - "alternative_suggestions_provided": nombre de suggestions données,
93
+ - "occurrences": nombre d'occurrences.
94
+
95
+ Voici le texte à analyser :
96
+ ```{text}```
97
+
98
+ \n{format_instruction}
99
+ """
100
+
101
+ def il_existe(text):
102
+ # Créer le template avec la variable text intégrée directement
103
+ prompt_template = il_existe_prompt_template()
104
+
105
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
106
+
107
+ # Créer le prompt avec le texte intégré
108
+ gen_prompt_template = PromptTemplate(
109
+ input_variables=["text"],
110
+ template=prompt_template,
111
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
112
+ )
113
+
114
+ # Créer une instance du modèle de langage
115
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
116
+
117
+ # Exécuter la chaîne avec le LLM
118
+ llm_chain = gen_prompt_template | llm | output_parser
119
+
120
+ # Appel du modèle avec le texte fourni
121
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
122
+
123
+ # Parsing de la réponse JSON
124
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
125
+
126
+ # Générer le prompt final
127
+ final_prompt = gen_prompt_template.format(text=text)
128
+
129
+ # Retourne les suggestions ou les erreurs de parsing
130
+ return {
131
+ "result": json_result,
132
+ "prompt": final_prompt
133
+ }
pattern_il_faut.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+ justification: str = Field(..., description="Justification de la suggestion.")
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation avec justification.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ "justification": self.alternative_suggestions.justification
31
+ }
32
+ }
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+ class DetectionResult(BaseModel):
47
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
48
+ summary: Summary = Field(..., description="Résumé de la détection.")
49
+
50
+ def to_dict(self):
51
+ return {
52
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
53
+ "summary": self.summary.to_dict()
54
+ }
55
+
56
+ def il_faut_prompt_template():
57
+ return """
58
+ Analyse le texte suivant et détecte toutes les occurrences de l'expression "il faut".
59
+
60
+ Pour chaque occurrence trouvée, veuillez :
61
+
62
+ - Citer la phrase complète où l'expression apparaît.
63
+ - Indiquer l'expression exacte utilisée dans le texte.
64
+ - Expliquer pourquoi l'expression "il faut" peut paraître trop directive ou informelle dans un contexte formel ou professionnel.
65
+ - Proposer deux reformulations de la phrase sans utiliser d'expressions ou de mots qui soulignent l'importance, comme "il est nécessaire de", "il est important de", ou "il convient de".
66
+ - Utilisez des formulations à l'impératif pour rendre la phrase plus directe et fluide.
67
+ - Assurez-vous que la phrase reformulée est fluide, naturelle, et préserve le sens original.
68
+
69
+ Assurez-vous également de respecter les règles suivantes :
70
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées plus d'une fois dans l'introduction.
71
+ 2. Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
72
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
73
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
74
+
75
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
76
+
77
+ - "pattern": "mot ou expression détectée",
78
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
79
+ - "sentence": "phrase où l'expression est utilisée",
80
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
81
+
82
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
83
+ - "pattern0": "",
84
+ - "occurrences": 0,
85
+
86
+ À la fin, ajoutez un résumé avec :
87
+ - "total_patterns_detected": nombre total de patterns détectés,
88
+ - "alternative_suggestions_provided": nombre de suggestions données,
89
+ - "occurrences": nombre d'occurrences.
90
+
91
+ Voici le texte à analyser :
92
+ ```{text}```
93
+
94
+ \n{format_instruction}
95
+ """
96
+
97
+ def il_faut(text):
98
+ # Créer le template avec la variable text intégrée directement
99
+ prompt_template = il_faut_prompt_template()
100
+
101
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
102
+
103
+ # Créer le prompt avec le texte intégré
104
+ gen_prompt_template = PromptTemplate(
105
+ input_variables=["text"],
106
+ template=prompt_template,
107
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
108
+ )
109
+
110
+ # Créer une instance du modèle de langage
111
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
112
+
113
+ # Exécuter la chaîne avec le LLM
114
+ llm_chain = gen_prompt_template | llm | output_parser
115
+
116
+ # Appel du modèle avec le texte fourni
117
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
118
+
119
+ # Parsing de la réponse JSON
120
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
121
+
122
+ # Générer le prompt final
123
+ final_prompt = gen_prompt_template.format(text=text)
124
+
125
+ # Retourne les suggestions ou les erreurs de parsing
126
+ return {
127
+ "result": json_result,
128
+ "prompt": final_prompt
129
+ }
pattern_il_suffit_de.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from langchain.output_parsers import PydanticOutputParser
3
+ from pydantic import BaseModel, Field
4
+ from typing import List
5
+ import json
6
+ from langchain.chat_models import ChatOpenAI
7
+
8
+
9
+ # Modèle de sortie pour la détection de l'expression "il suffit de"
10
+ class ReformulationDetail(BaseModel):
11
+ original: str = Field(..., description="Phrase originale contenant 'il suffit de'.")
12
+ explanation: str = Field(..., description="Explication sur pourquoi l'expression 'il suffit de' est inadaptée.")
13
+ reformulation_1: str = Field(..., description="Première reformulation de la phrase.")
14
+ reformulation_2: str = Field(..., description="Seconde reformulation de la phrase.")
15
+ reformulation_3: str = Field(..., description="Troisième reformulation de la phrase.")
16
+
17
+ def to_dict(self):
18
+ return {
19
+ "original": self.original,
20
+ "explanation": self.explanation,
21
+ "reformulation_1": self.reformulation_1,
22
+ "reformulation_2": self.reformulation_2,
23
+ "reformulation_3": self.reformulation_3
24
+ }
25
+
26
+ class Summary(BaseModel):
27
+ total_occurrences: int = Field(..., description="Nombre total d'occurrences de 'il suffit de' détectées.")
28
+ reformulations_provided: int = Field(..., description="Nombre de reformulations fournies.")
29
+
30
+ def to_dict(self):
31
+ return {
32
+ "total_occurrences": self.total_occurrences,
33
+ "reformulations_provided": self.reformulations_provided
34
+ }
35
+
36
+ class DetectionResult(BaseModel):
37
+ reformulations: List[ReformulationDetail] = Field(..., description="Liste des reformulations proposées.")
38
+ summary: Summary = Field(..., description="Résumé de la détection.")
39
+
40
+ def to_dict(self):
41
+ return {
42
+ "reformulations": [reformulation.to_dict() for reformulation in self.reformulations],
43
+ "summary": self.summary.to_dict()
44
+ }
45
+
46
+ # Génération du prompt pour la détection de "il suffit de"
47
+ def il_suffit_de_prompt_template():
48
+ return """
49
+ Veuillez analyser le texte ci-dessous pour détecter toutes les occurrences de l'expression "il suffit de".
50
+
51
+ Pour chaque phrase trouvée :
52
+
53
+ 1. **Citez exactement** la phrase originale contenant "il suffit de".
54
+ 2. **Expliquez** pourquoi l'expression "il suffit de" est inadaptée dans un contexte professionnel ou formel, et pourquoi elle simplifie à l'excès ou n'indique pas assez d'importance.
55
+ 3. **Proposez trois reformulations** de la phrase, sans utiliser des expressions qui soulignent l'importance (comme "il est nécessaire de", "il est important de", etc.). Utilisez des formulations à l'impératif pour rendre les instructions plus directes, précises, et professionnelles.
56
+ 4. **Assurez-vous** que chaque reformulation est naturelle, fluide et conserve le sens original sans insister sur l'importance de l'action.
57
+
58
+ **Format attendu pour chaque occurrence** :
59
+
60
+ - **Original** : "[Phrase originale]"
61
+ - **Explication** : "[Explication concise sur l'inadéquation de 'il suffit de']"
62
+ - **Reformulation 1** : "[Première reformulation]"
63
+ - **Reformulation 2** : "[Seconde reformulation]"
64
+ - **Reformulation 3** : "[Troisième reformulation]"
65
+
66
+ Le texte à analyser est le suivant :
67
+ ```{text}```
68
+
69
+ {format_instruction}
70
+ """
71
+
72
+ def detect_il_suffit_de(text):
73
+ # Création du modèle de sortie avec Pydantic
74
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
75
+
76
+ # Génération du prompt à partir du modèle
77
+ gen_prompt_template = PromptTemplate(
78
+ input_variables=["text"],
79
+ template=il_suffit_de_prompt_template(),
80
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
81
+ )
82
+
83
+ # Création du modèle de langage (avec LLM)
84
+ llm = ChatOpenAI(model='gpt-4', temperature=0.5, api_key="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")
85
+
86
+ # Chaîne de traitement du prompt avec le modèle et le parseur
87
+ llm_chain = gen_prompt_template | llm | output_parser
88
+
89
+ # Appel du modèle avec le texte fourni
90
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
91
+
92
+ # Conversion du résultat en JSON
93
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
94
+
95
+ # Génération du prompt final
96
+ final_prompt = gen_prompt_template.format(text=text)
97
+
98
+ # Retour des résultats
99
+ return {
100
+ "result": json_result,
101
+ "prompt": final_prompt
102
+ }
pattern_imaginez.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+ # Modèles Pydantic pour structurer la réponse
10
+ class AlternativeSuggestion(BaseModel):
11
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
12
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
13
+
14
+ class PatternDetail(BaseModel):
15
+ pattern: str = Field(..., description="Mot ou expression détectée.")
16
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
17
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
18
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation.")
19
+
20
+ def to_dict(self):
21
+ return {
22
+ "pattern": self.pattern,
23
+ "indices": self.indices,
24
+ "sentence": self.sentence,
25
+ "alternative_suggestions": {
26
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
27
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
28
+ }
29
+ }
30
+
31
+ class Summary(BaseModel):
32
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
33
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
34
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
35
+
36
+ def to_dict(self):
37
+ return {
38
+ "total_patterns_detected": self.total_patterns_detected,
39
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
40
+ "occurrences": self.occurrences
41
+ }
42
+
43
+ class DetectionResult(BaseModel):
44
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
45
+ summary: Summary = Field(..., description="Résumé de la détection.")
46
+
47
+ def to_dict(self):
48
+ return {
49
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
50
+ "summary": self.summary.to_dict()
51
+ }
52
+
53
+ # Fonction pour générer le prompt template
54
+ def imaginez_prompt_template():
55
+ return """
56
+ Analyser le texte suivant et détecter toutes les occurrences de l'expression "Imaginez" et ses variantes telles que :
57
+
58
+ "Visualisez", "Envisagez", "Concevez", "Supposez", "Pensez à", "Représentez-vous", "Imaginez-vous"
59
+
60
+ Pour chaque occurrence trouvée, veuillez :
61
+
62
+ - Citer la phrase complète où l'expression apparaît.
63
+ - Indiquer l'expression exacte utilisée dans le texte.
64
+ - Expliquer pourquoi ces expressions peuvent alourdir ou rendre l'introduction trop familière, directe ou directive.
65
+ - Proposer deux reformulations plus simples, fluides et naturelles pour rendre la phrase plus concise ou directe,
66
+ en évitant d'utiliser l'expression "Imaginez" ou ses variantes. Assurez-vous que la reformulation conserve le sens original
67
+ tout en étant plus formelle et professionnelle.
68
+
69
+ Assurez-vous également de respecter les règles suivantes :
70
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" ne doivent pas être utilisées plus d'une fois dans l'introduction.
71
+ 2. Les expressions comme "il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
72
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs tels qu'"important", "essentiel", etc.
73
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
74
+
75
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
76
+
77
+ - "pattern": "mot ou expression détectée",
78
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
79
+ - "sentence": "phrase où l'expression est utilisée",
80
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
81
+
82
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
83
+ - "pattern0": "",
84
+ - "occurrences": 0,
85
+
86
+ À la fin, ajoutez un résumé avec :
87
+ - "total_patterns_detected": nombre total de patterns détectés,
88
+ - "alternative_suggestions_provided": nombre de suggestions données,
89
+ - "occurrences": nombre d'occurrences.
90
+
91
+ Voici le texte à analyser :
92
+ ```{text}```
93
+
94
+ \n{format_instruction}
95
+ """
96
+
97
+ def imaginez(text):
98
+ # Créer le template avec la variable text intégrée directement
99
+ prompt_template = imaginez_prompt_template()
100
+
101
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
102
+
103
+ # Créer le prompt avec le texte intégré
104
+ gen_prompt_template = PromptTemplate(
105
+ input_variables=["text"],
106
+ template=prompt_template,
107
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
108
+ )
109
+
110
+ # Créer une instance du modèle de langage
111
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
112
+
113
+ # Exécuter la chaîne avec le LLM
114
+ llm_chain = gen_prompt_template | llm | output_parser
115
+
116
+ # Appel du modèle avec le texte fourni
117
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
118
+
119
+ # Parsing de la réponse JSON
120
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
121
+
122
+ # Générer le prompt final
123
+ final_prompt = gen_prompt_template.format(text=text)
124
+
125
+ # Retourne les suggestions ou les erreurs de parsing
126
+ return {
127
+ "result": json_result,
128
+ "prompt": final_prompt
129
+ }
pattern_important_crucial.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from langchain.output_parsers import PydanticOutputParser
3
+ from pydantic import BaseModel, Field
4
+ from typing import List, Tuple
5
+ import json
6
+ from langchain.chat_models import ChatOpenAI
7
+
8
+ # Modèle de sortie pour la détection des expressions exprimant l'importance, la nécessité, ou l'urgence
9
+ class ImportanceDetection(BaseModel):
10
+ pattern: str = Field(..., description="Mot ou expression détectée exprimant l'importance, la nécessité ou l'urgence.")
11
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
12
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
13
+ meaning: str = Field(..., description="Sens exprimé par l'expression.")
14
+ alternative_suggestions: List[str] = Field(..., description="Suggestions alternatives pour reformuler la phrase.")
15
+
16
+ def to_dict(self):
17
+ return {
18
+ "pattern": self.pattern,
19
+ "indices": self.indices,
20
+ "sentence": self.sentence,
21
+ "meaning": self.meaning,
22
+ "alternative_suggestions": self.alternative_suggestions
23
+ }
24
+
25
+ class Summary(BaseModel):
26
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
27
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
28
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
29
+
30
+ def to_dict(self):
31
+ return {
32
+ "total_patterns_detected": self.total_patterns_detected,
33
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
34
+ "occurrences": self.occurrences
35
+ }
36
+
37
+ class DetectionResult(BaseModel):
38
+ patterns: List[ImportanceDetection] = Field(..., description="Liste des mots ou expressions détectés.")
39
+ summary: Summary = Field(..., description="Résumé de la détection.")
40
+
41
+ def to_dict(self):
42
+ return {
43
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
44
+ "summary": self.summary.to_dict()
45
+ }
46
+
47
+ # Création du template pour la détection des expressions d'importance, de nécessité ou d'urgence
48
+ def importance_prompt_template():
49
+ return """
50
+ Vous êtes un détecteur de texte IA extrêmement rigoureux. Votre tâche consiste à analyser le texte suivant et à identifier **toutes** les occurrences de mots, expressions, ou locutions exprimant **l'importance**, **la nécessité**, **l'urgence**, ou **le caractère indispensable** d'un élément.
51
+
52
+ Vous devez inclure :
53
+
54
+ 1. **Adjectifs** (tels que) : "crucial", "essentiel", "important", "fondamental", "primordial", "indispensable", "nécessaire", "vital", "pivotal", "majeur", "clé", "significatif", "déterminant", "incontournable", "impératif", "obligatoire", "capital", "prépondérant", "stratégique", "marquant", "décisif", "inévitable", "urgent", etc.
55
+
56
+ 2. **Adverbes** (tels que) : "essentiellement", "crucialement", "fondamentalement", "nécessairement", "impérativement", "urgemment", etc.
57
+
58
+ 3. **Locutions et expressions** (telles que) : "de la plus haute importance", "d'une importance capitale", "de première nécessité", "il est urgent de", "il est vital que", "à ne pas négliger", "absolument nécessaire", "infiniment précieux", etc.
59
+
60
+ 4. **Variations grammaticales** : toutes les formes grammaticales, incluant le féminin, masculin, singulier, pluriel, et les variations de temps, doivent être prises en compte.
61
+
62
+ Pour chaque occurrence trouvée, veuillez :
63
+ - Citer la phrase complète où l'expression apparaît.
64
+ - Indiquer l'expression exacte utilisée dans le texte.
65
+ - Expliquer pourquoi ces expressions peuvent alourdir ou rendre l'introduction trop familière, directe ou directive.
66
+ - Proposer deux reformulations plus simples, fluides et naturelles pour rendre la phrase plus concise ou directe,
67
+ en évitant d'utiliser l'expression ou ses variantes. Assurez-vous que la reformulation conserve le sens original
68
+ tout en étant plus formelle et professionnelle.
69
+
70
+ Assurez-vous également de respecter les règles suivantes :
71
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" ne doivent pas être utilisées plus d'une fois dans l'introduction.
72
+ 2. Les expressions comme "il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
73
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs tels qu'"important", "essentiel", etc.
74
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
75
+
76
+ **Format de sortie requis :**
77
+ - "pattern": "mot ou expression détectée",
78
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
79
+ - "sentence": "phrase où l'expression est utilisée",
80
+ - "meaning": "Sens exprimé",
81
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
82
+
83
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
84
+ - "pattern0": "",
85
+ - "occurrences": 0,
86
+
87
+ À la fin, ajoutez un résumé avec :
88
+ - "total_patterns_detected": nombre total de patterns détectés,
89
+ - "alternative_suggestions_provided": nombre de suggestions données,
90
+ - "occurrences": nombre d'occurrences.
91
+
92
+ Le texte à analyser est :
93
+ ```{text}```
94
+
95
+ {format_instruction}
96
+ """
97
+
98
+ def importance_detection(text):
99
+ # Création du modèle de sortie avec Pydantic
100
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
101
+
102
+ # Génération du prompt à partir du modèle
103
+ gen_prompt_template = PromptTemplate(
104
+ input_variables=["text"],
105
+ template=importance_prompt_template(),
106
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
107
+ )
108
+
109
+ # Création du modèle de langage (avec LLM)
110
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
111
+
112
+ # Chaîne de traitement du prompt avec le modèle et le parseur
113
+ llm_chain = gen_prompt_template | llm | output_parser
114
+
115
+ # Appel du modèle avec le texte fourni
116
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
117
+
118
+ # Conversion du résultat en JSON
119
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
120
+
121
+ # Génération du prompt final
122
+ final_prompt = gen_prompt_template.format(text=text)
123
+
124
+ # Retour des résultats
125
+ return {
126
+ "result": json_result,
127
+ "prompt": final_prompt
128
+ }
pattern_look.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+ justification: str = Field(..., description="Justification de la suggestion.")
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation avec justification.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ "justification": self.alternative_suggestions.justification
31
+ }
32
+ }
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+ class DetectionResult(BaseModel):
47
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
48
+ summary: Summary = Field(..., description="Résumé de la détection.")
49
+
50
+ def to_dict(self):
51
+ return {
52
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
53
+ "summary": self.summary.to_dict()
54
+ }
55
+
56
+ def look_prompt_template():
57
+ return """
58
+ Analyse le texte suivant et détecte strictement toutes les occurrences du mot "look" utilisées dans le contexte de la décoration et de l'aménagement des espaces de vie ou de travail.
59
+
60
+ Pour chaque occurrence trouvée, veuillez :
61
+
62
+ - Citer la phrase complète où l'expression apparaît.
63
+ - Indiquer l'expression exacte utilisée dans le texte.
64
+ - Expliquer pourquoi l'utilisation de "look" est inappropriée dans ce contexte décoratif en français, en précisant qu'il s'agit d'un anglicisme.
65
+ - Proposer deux reformulations de la phrase en utilisant un terme ou une expression plus correcte en français, comme "style", "allure", "ambiance", "aspect", ou "touche", en tenant compte du contexte de la décoration.
66
+ - Assurez-vous que la phrase reformulée soit fluide, naturelle et préserve le sens original.
67
+
68
+ Assurez-vous également de respecter les règles suivantes :
69
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental", etc., ne doivent pas être utilisées plus d'une fois dans l'introduction.
70
+ 2. Les expressions comme "Il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
71
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs comme "important", "essentiel", etc.
72
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
73
+
74
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
75
+
76
+ - "pattern": "mot ou expression détectée",
77
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
78
+ - "sentence": "phrase où l'expression est utilisée",
79
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
80
+
81
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
82
+ - "pattern0": "",
83
+ - "occurrences": 0,
84
+
85
+ À la fin, ajoutez un résumé avec :
86
+ - "total_patterns_detected": nombre total de patterns détectés,
87
+ - "alternative_suggestions_provided": nombre de suggestions données,
88
+ - "occurrences": nombre d'occurrences.
89
+
90
+ Voici le texte à analyser :
91
+ ```{text}```
92
+
93
+ \n{format_instruction}
94
+ """
95
+
96
+ def look(text):
97
+ # Créer le template avec la variable text intégrée directement
98
+ prompt_template = look_prompt_template()
99
+
100
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
101
+
102
+ # Créer le prompt avec le texte intégré
103
+ gen_prompt_template = PromptTemplate(
104
+ input_variables=["text"],
105
+ template=prompt_template,
106
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
107
+ )
108
+
109
+ # Créer une instance du modèle de langage
110
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
111
+
112
+ # Exécuter la chaîne avec le LLM
113
+ llm_chain = gen_prompt_template | llm | output_parser
114
+
115
+ # Appel du modèle avec le texte fourni
116
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
117
+
118
+ # Parsing de la réponse JSON
119
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
120
+
121
+ # Générer le prompt final
122
+ final_prompt = gen_prompt_template.format(text=text)
123
+
124
+ # Retourne les suggestions ou les erreurs de parsing
125
+ return {
126
+ "result": json_result,
127
+ "prompt": final_prompt
128
+ }
pattern_outre.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from langchain.output_parsers import PydanticOutputParser
3
+ from langchain.chat_models import ChatOpenAI
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ import json
7
+
8
+ # Modèle de sortie pour la détection de l'utilisation incorrecte de "Outre"
9
+ class OutreDetection(BaseModel):
10
+ pattern: str = Field(..., description="Mot ou expression détectée, ici 'Outre'.")
11
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
12
+ sentence: str = Field(..., description="Phrase complète où 'Outre' est utilisé.")
13
+ explanation: str = Field(..., description="Explication de pourquoi l'utilisation de 'Outre' est incorrecte.")
14
+ alternative_suggestions: List[str] = Field(..., description="Suggestions alternatives pour reformuler la phrase.")
15
+
16
+ def to_dict(self):
17
+ return {
18
+ "pattern": self.pattern,
19
+ "indices": self.indices,
20
+ "sentence": self.sentence,
21
+ "explanation": self.explanation,
22
+ "alternative_suggestions": self.alternative_suggestions
23
+ }
24
+
25
+ class Summary(BaseModel):
26
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
27
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
28
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
29
+
30
+ def to_dict(self):
31
+ return {
32
+ "total_patterns_detected": self.total_patterns_detected,
33
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
34
+ "occurrences": self.occurrences
35
+ }
36
+
37
+ class DetectionResult(BaseModel):
38
+ patterns: List[OutreDetection] = Field(..., description="Liste des occurrences incorrectes de 'Outre'.")
39
+ summary: Summary = Field(..., description="Résumé de la détection.")
40
+
41
+ def to_dict(self):
42
+ return {
43
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
44
+ "summary": self.summary.to_dict()
45
+ }
46
+
47
+ # Création du template pour la détection de l'utilisation incorrecte de "Outre"
48
+ def outre_prompt_template():
49
+ return """
50
+ Veuillez analyser le texte suivant pour détecter les phrases où "Outre" est utilisé en début de phrase, sans être suivi d'un complément approprié.
51
+
52
+ Pour chaque phrase trouvée :
53
+
54
+ - Citez la phrase originale contenant "Outre" en début de phrase.
55
+ - Expliquez pourquoi l'utilisation de "Outre" est incorrecte et précisez qu'il s'agit d'une préposition qui doit être suivie d'un complément.
56
+ - Proposez une correction en remplaçant "Outre" par "En outre" ou en réécrivant la phrase de manière correcte.
57
+ - Assurez-vous que la phrase reformulée soit naturelle, fluide et correcte.
58
+
59
+ Voici l'explication à afficher : "Outre" est une préposition en français qui signifie "en plus de" ou "en dehors de", et doit être suivie d'un complément. Par exemple :
60
+
61
+ - Correct : "Outre ses compétences en gestion, il est également un excellent communicateur."
62
+ - Incorrect : "Outre, il est également un excellent communicateur."
63
+
64
+ Par contre, "En outre" est une locution adverbiale qui signifie "de plus" ou "en plus", et elle est correctement utilisée pour introduire une nouvelle idée ou information, souvent au début d'une phrase. Exemple :
65
+
66
+ - Correct : "En outre, il a une grande expérience dans ce domaine."
67
+
68
+ En résumé :
69
+ - "Outre" est une préposition et doit être suivi d'un complément.
70
+ - "En outre" est une locution adverbiale et peut être utilisée seule au début d'une phrase pour introduire une nouvelle idée.
71
+
72
+ Analysez le texte ci-dessous et détectez toutes les occurrences de "cela signifie que".
73
+
74
+ Pour chaque phrase :
75
+
76
+ - Citez la phrase originale.
77
+ - Supprimez "cela signifie que" et proposez une reformulation concise et élégante qui maintient le sens de la phrase.
78
+ - Assurez-vous que la phrase reformulée soit naturelle, fluide et correcte.
79
+
80
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
81
+
82
+ - "pattern": "mot ou expression détectée",
83
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
84
+ - "sentence": "phrase où l'expression est utilisée",
85
+ - "explanation": "explication de pourquoi l'expression est incorrecte",
86
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
87
+
88
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
89
+ - "pattern0": "",
90
+ - "occurrences": 0,
91
+
92
+ À la fin, ajoutez un résumé avec :
93
+ - "total_patterns_detected": nombre total de patterns détectés,
94
+ - "alternative_suggestions_provided": nombre de suggestions données,
95
+ - "occurrences": nombre d'occurrences.
96
+
97
+ Le texte à analyser est :
98
+ ```{text}```
99
+
100
+ {format_instruction}
101
+ """
102
+
103
+ def detect_outre(text):
104
+ # Création du modèle de sortie avec Pydantic
105
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
106
+
107
+ # Génération du prompt à partir du modèle
108
+ gen_prompt_template = PromptTemplate(
109
+ input_variables=["text"],
110
+ template=outre_prompt_template(),
111
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
112
+ )
113
+
114
+ # Création du modèle de langage (avec LLM)
115
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
116
+
117
+ # Chaîne de traitement du prompt avec le modèle et le parseur
118
+ llm_chain = gen_prompt_template | llm | output_parser
119
+
120
+ # Appel du modèle avec le texte fourni
121
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
122
+
123
+ # Conversion du résultat en JSON
124
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
125
+
126
+ # Génération du prompt final
127
+ final_prompt = gen_prompt_template.format(text=text)
128
+
129
+ # Retour des résultats
130
+ return {
131
+ "result": json_result,
132
+ "prompt": final_prompt
133
+ }
pattern_permettre.py ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from langchain.output_parsers import PydanticOutputParser
3
+ from pydantic import BaseModel, Field
4
+ from typing import List, Tuple
5
+ from langchain.chat_models import ChatOpenAI
6
+ import json
7
+
8
+ # Modèle de sortie (adapté pour la détection des formes du verbe "permettre" avec reformulations)
9
+ class PermettreDetection(BaseModel):
10
+ pattern: str = Field(..., description="Forme verbale du verbe 'permettre' détectée.")
11
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
12
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
13
+ alternative_suggestions: List[str] = Field(..., description="Suggestions alternatives pour la reformulation de la phrase.")
14
+
15
+ def to_dict(self):
16
+ return {
17
+ "pattern": self.pattern,
18
+ "indices": self.indices,
19
+ "sentence": self.sentence,
20
+ "alternative_suggestions": self.alternative_suggestions
21
+ }
22
+
23
+ class Summary(BaseModel):
24
+ total_patterns_detected: int = Field(..., description="Nombre total de formes du verbe 'permettre' détectées.")
25
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
26
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
27
+
28
+ def to_dict(self):
29
+ return {
30
+ "total_patterns_detected": self.total_patterns_detected,
31
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
32
+ "occurrences": self.occurrences
33
+ }
34
+
35
+ class DetectionResult(BaseModel):
36
+ patterns: List[PermettreDetection] = Field(..., description="Liste des formes verbales détectées.")
37
+ summary: Summary = Field(..., description="Résumé de la détection.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
42
+ "summary": self.summary.to_dict()
43
+ }
44
+
45
+ # Création du template pour la détection avec reformulations
46
+ def permettre_prompt_template():
47
+ return """
48
+ Tu es un détecteur de texte AI très performant et précis. Ta mission est la suivante :
49
+
50
+ - **Objectif :** Identifier toutes les formes conjuguées du verbe **"permettre"** dans le texte ci-dessous (ex : **"permet"**, **"permettra"**, **"permis"** en tant que verbe, etc.).
51
+
52
+ - **Exclusions :** Ignore les cas où **"permis"** est utilisé comme **nom commun** (ex : **"permis de conduire"**, **"permis de construire"**, etc.).
53
+
54
+ **Instructions supplémentaires :**
55
+ - Analyse grammaticale : identifie les mots dont le **lemme** est **"permettre"**.
56
+ - Ne pas considérer **"permis"** comme nom commun, mais bien comme verbe uniquement.
57
+ - Couvre toutes les formes verbales, y compris les participes passés, infinitifs, et les temps futurs, présents, etc.
58
+ - Ne pas dupliquer les détections des mêmes formes verbales.
59
+
60
+ Pour chaque occurrence trouvée, veuillez :
61
+ - Citer la phrase complète où l'expression apparaît.
62
+ - Indiquer l'expression exacte utilisée dans le texte.
63
+ - Expliquer pourquoi ces expressions peuvent alourdir ou rendre l'introduction trop familière, directe ou directive.
64
+ - Proposer deux reformulations plus simples, fluides et naturelles pour rendre la phrase plus concise ou directe,
65
+ en évitant d'utiliser l'expression "permettre" ou ses variantes. Assurez-vous que la reformulation conserve le sens original
66
+ tout en étant plus formelle et professionnelle.
67
+
68
+ Assurez-vous également de respecter les règles suivantes :
69
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" ne doivent pas être utilisées plus d'une fois dans l'introduction.
70
+ 2. Les expressions comme "il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
71
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs tels qu'"important", "essentiel", etc.
72
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
73
+
74
+ **Format de sortie requis :**
75
+ - "pattern": "mot ou expression détectée",
76
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
77
+ - "sentence": "phrase où l'expression est utilisée",
78
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
79
+
80
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
81
+ - "pattern0": "",
82
+ - "occurrences": 0,
83
+
84
+ À la fin, ajoutez un résumé avec :
85
+ - "total_patterns_detected": nombre total de patterns détectés,
86
+ - "alternative_suggestions_provided": nombre de suggestions données,
87
+ - "occurrences": nombre d'occurrences.
88
+
89
+ Le texte à analyser est le suivant :
90
+ ```{text}```
91
+
92
+ \n{format_instruction}
93
+ """
94
+
95
+ def permettre_detection(text):
96
+ # Création du modèle de sortie avec Pydantic
97
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
98
+
99
+ # Génération du prompt à partir du modèle
100
+ gen_prompt_template = PromptTemplate(
101
+ input_variables=["text"],
102
+ template=permettre_prompt_template(),
103
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
104
+ )
105
+
106
+ # Création du modèle de langage (avec LLM)
107
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
108
+
109
+ # Chaîne de traitement du prompt avec le modèle et le parseur
110
+ llm_chain = gen_prompt_template | llm | output_parser
111
+
112
+ # Appel du modèle avec le texte fourni
113
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
114
+
115
+ # Conversion du résultat en JSON
116
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
117
+
118
+ # Génération du prompt final
119
+ final_prompt = gen_prompt_template.format(text=text)
120
+
121
+ # Retour des résultats
122
+ return {
123
+ "result": json_result,
124
+ "prompt": final_prompt
125
+ }
pattern_voici_decouvrez.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts import PromptTemplate
2
+ from langchain.output_parsers import PydanticOutputParser
3
+ from pydantic import BaseModel, Field
4
+ from typing import List, Tuple
5
+ import json
6
+ from langchain.chat_models import ChatOpenAI
7
+
8
+
9
+ # Modèle de sortie pour la détection des expressions "VOICI" et "DÉCOUVREZ"
10
+ class ReformulationDetail(BaseModel):
11
+ original: str = Field(..., description="Phrase originale contenant 'VOICI' ou 'DÉCOUVREZ'.")
12
+ explanation: str = Field(..., description="Explication sur pourquoi l'expression alourdit la phrase.")
13
+ reformulation_1: str = Field(..., description="Reformulation basée sur l'approche Anticipation/Intrigue.")
14
+ reformulation_2: str = Field(..., description="Reformulation basée sur l'approche Conversationnel.")
15
+ reformulation_3: str = Field(..., description="Reformulation basée sur l'approche Accompagnement doux.")
16
+
17
+ def to_dict(self):
18
+ return {
19
+ "original": self.original,
20
+ "explanation": self.explanation,
21
+ "reformulation_1": self.reformulation_1,
22
+ "reformulation_2": self.reformulation_2,
23
+ "reformulation_3": self.reformulation_3,
24
+ }
25
+
26
+ class Summary(BaseModel):
27
+ total_occurrences: int = Field(..., description="Nombre total d'occurrences de 'VOICI' et 'DÉCOUVREZ'.")
28
+ reformulations_provided: int = Field(..., description="Nombre de reformulations proposées.")
29
+
30
+ def to_dict(self):
31
+ return {
32
+ "total_occurrences": self.total_occurrences,
33
+ "reformulations_provided": self.reformulations_provided,
34
+ }
35
+
36
+ class DetectionResult(BaseModel):
37
+ reformulations: List[ReformulationDetail] = Field(..., description="Liste des reformulations proposées pour chaque occurrence.")
38
+ summary: Summary = Field(..., description="Résumé de la détection.")
39
+
40
+ def to_dict(self):
41
+ return {
42
+ "reformulations": [reformulation.to_dict() for reformulation in self.reformulations],
43
+ "summary": self.summary.to_dict()
44
+ }
45
+
46
+ # Création du template pour la détection de l'utilisation de "VOICI" et "DÉCOUVREZ" à la fin d'une introduction
47
+ def voici_decouvrez_prompt_template():
48
+ return """
49
+ Tu es un éditeur de texte IA extrêmement performant et rigoureux. Ta tâche est d'analyser **précisément** le texte fourni pour détecter **toutes les occurrences** des expressions **"VOICI"** et **"DÉCOUVREZ"** situées **à la fin d'une introduction**.
50
+ L'introduction , c'est le premier paragraphe.
51
+ Pour chaque occurrence identifiée, tu dois obligatoirement :
52
+
53
+ 1. **Citer exactement** la phrase originale contenant "VOICI" ou "DÉCOUVREZ".
54
+ 2. **Expliquer brièvement et clairement** pourquoi l'utilisation de ce terme peut alourdir ou rendre la transition vers le contenu moins fluide.
55
+ 3. **Proposer trois reformulations distinctes**, selon les approches suivantes :
56
+ - **Anticipation/Intrigue** : Créer de l'attente ou de l'intrigue pour susciter l'intérêt du lecteur.
57
+ - **Conversationnel** : Formuler la phrase de manière plus engageante et naturelle.
58
+ - **Accompagnement doux** : Offrir une transition progressive et moins directive vers le contenu.
59
+
60
+ ### Format attendu pour chaque occurrence :
61
+
62
+ - **Original** : "[Phrase originale]"
63
+ - **Explication** : "[Explication concise]"
64
+ - **Reformulation 1 (Anticipation/Intrigue)** : "[Reformulation ici]"
65
+ - **Reformulation 2 (Conversationnel)** : "[Reformulation ici]"
66
+ - **Reformulation 3 (Accompagnement doux)** : "[Reformulation ici]"
67
+
68
+ Le texte à analyser est le suivant :
69
+ ```{text}```
70
+ Le format de la sortie doit être en JSON.
71
+ ```{format_instruction}```
72
+ """
73
+
74
+ def detect_voici_decouvrez(text):
75
+ # Création du modèle de sortie avec Pydantic
76
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
77
+
78
+ # Génération du prompt à partir du modèle
79
+ gen_prompt_template = PromptTemplate(
80
+ input_variables=["text"],
81
+ template=voici_decouvrez_prompt_template(),
82
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
83
+ )
84
+
85
+ # Création du modèle de langage (avec LLM)
86
+ llm = ChatOpenAI(model='gpt-4', temperature=0.5, api_key="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")
87
+
88
+ # Chaîne de traitement du prompt avec le modèle et le parseur
89
+ llm_chain = gen_prompt_template | llm | output_parser
90
+
91
+ # Appel du modèle avec le texte fourni
92
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
93
+
94
+ # Conversion du résultat en JSON
95
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
96
+
97
+ # Génération du prompt final
98
+ final_prompt = gen_prompt_template.format(text=text)
99
+
100
+ # Retour des résultats
101
+ return {
102
+ "result": json_result,
103
+ "prompt": final_prompt
104
+ }
pattern_vous_pouvez.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from langchain.prompts import PromptTemplate
3
+ from langchain.chains import LLMChain
4
+ from pydantic import BaseModel, Field
5
+ from typing import List, Tuple
6
+ from langchain.chat_models import ChatOpenAI
7
+ from langchain.output_parsers import PydanticOutputParser
8
+
9
+
10
+ # Modèles Pydantic pour structurer la réponse
11
+ class AlternativeSuggestion(BaseModel):
12
+ suggestion_1: str = Field(..., description="Première suggestion de reformulation.")
13
+ suggestion_2: str = Field(..., description="Deuxième suggestion de reformulation.")
14
+ justification: str = Field(..., description="Justification de la suggestion.")
15
+
16
+ class PatternDetail(BaseModel):
17
+ pattern: str = Field(..., description="Mot ou expression détectée.")
18
+ indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence dans le texte.")
19
+ sentence: str = Field(..., description="Phrase complète où l'expression apparaît.")
20
+ alternative_suggestions: AlternativeSuggestion = Field(..., description="Deux suggestions de reformulation avec justification.")
21
+
22
+ def to_dict(self):
23
+ return {
24
+ "pattern": self.pattern,
25
+ "indices": self.indices,
26
+ "sentence": self.sentence,
27
+ "alternative_suggestions": {
28
+ "suggestion_1": self.alternative_suggestions.suggestion_1,
29
+ "suggestion_2": self.alternative_suggestions.suggestion_2,
30
+ "justification": self.alternative_suggestions.justification
31
+ }
32
+ }
33
+
34
+ class Summary(BaseModel):
35
+ total_patterns_detected: int = Field(..., description="Nombre total de patterns détectés.")
36
+ alternative_suggestions_provided: int = Field(..., description="Nombre total de suggestions fournies.")
37
+ occurrences: int = Field(..., description="Nombre total d'occurrences trouvées dans le texte.")
38
+
39
+ def to_dict(self):
40
+ return {
41
+ "total_patterns_detected": self.total_patterns_detected,
42
+ "alternative_suggestions_provided": self.alternative_suggestions_provided,
43
+ "occurrences": self.occurrences
44
+ }
45
+
46
+ class DetectionResult(BaseModel):
47
+ patterns: List[PatternDetail] = Field(..., description="Liste des patterns détectés avec détails.")
48
+ summary: Summary = Field(..., description="Résumé de la détection.")
49
+
50
+ def to_dict(self):
51
+ return {
52
+ "patterns": [pattern.to_dict() for pattern in self.patterns],
53
+ "summary": self.summary.to_dict()
54
+ }
55
+
56
+ def vous_pouvez_prompt_template():
57
+ return """
58
+ Analyser le texte ci-dessous pour détecter les expressions "vous pouvez", "vous devez", "il vous faut",
59
+ "vous avez à", "il est nécessaire que vous", "vous avez la possibilité de", "vous êtes prié de" et autres formules similaires.
60
+
61
+ Pour chaque occurrence trouvée, veuillez :
62
+
63
+ - Citer la phrase complète où l'expression apparaît.
64
+ - Indiquer l'expression exacte utilisée dans le texte.
65
+ - Expliquer pourquoi ces expressions peuvent alourdir le texte ou donner un ton trop directif ou permissif.
66
+ - Proposer deux reformulations de la phrase plus fluides, en évitant d'insister sur la permission ou l'autorité, en privilégiant des tournures neutres ou à l'impératif.
67
+ - Assurez-vous que la phrase reformulée est fluide, naturelle, et conserve le sens original sans insister sur l'importance de l'action.
68
+
69
+ Assurez-vous également de respecter les règles suivantes :
70
+ 1. Les expressions comme "crucial", "essentiel", "important", "fondamental" ne doivent pas être utilisées plus d'une fois dans l'introduction.
71
+ 2. Les expressions comme "il existe", "il faut", "cependant", "de plus", "en revanche", "néanmoins", "toutefois" ne doivent pas être utilisées en début de phrase.
72
+ 3. Les expressions comme "joue un rôle", "il est", ou "est une étape" ne doivent pas être associées à des adjectifs tels qu'"important", "essentiel", etc.
73
+ 4. "En plus" ne doit pas être utilisé seul en début de phrase.
74
+
75
+ Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
76
+
77
+ - "pattern": "mot ou expression détectée",
78
+ - "indices": [[index de début, index de fin pour chaque occurrence]],
79
+ - "sentence": "phrase où l'expression est utilisée",
80
+ - "alternative_suggestions": ["suggestion 1", "suggestion 2"]
81
+
82
+ Si aucun pattern n'est trouvé, retournez un JSON avec :
83
+ - "pattern0": "",
84
+ - "occurrences": 0,
85
+
86
+ À la fin, ajoutez un résumé avec :
87
+ - "total_patterns_detected": nombre total de patterns détectés,
88
+ - "alternative_suggestions_provided": nombre de suggestions données,
89
+ - "occurrences": nombre d'occurrences.
90
+
91
+ Voici le texte à analyser :
92
+ ```{text}```
93
+
94
+ \n{format_instruction}
95
+ """
96
+
97
+ def vous_pouvez(text):
98
+ # Créer le template avec la variable text intégrée directement
99
+ prompt_template = vous_pouvez_prompt_template()
100
+
101
+ output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
102
+
103
+ # Créer le prompt avec le texte intégré
104
+ gen_prompt_template = PromptTemplate(
105
+ input_variables=["text"],
106
+ template=prompt_template,
107
+ partial_variables={'format_instruction': output_parser.get_format_instructions()}
108
+ )
109
+
110
+ # Créer une instance du modèle de langage
111
+ llm = ChatOpenAI(model='gpt-4o', temperature=0.5, api_key="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")
112
+
113
+ # Exécuter la chaîne avec le LLM
114
+ llm_chain = gen_prompt_template | llm | output_parser
115
+
116
+ # Appel du modèle avec le texte fourni
117
+ result_dict = llm_chain.invoke({"text": text}).to_dict()
118
+
119
+ # Parsing de la réponse JSON
120
+ json_result = json.dumps(result_dict, indent=8, ensure_ascii=False)
121
+
122
+ # Générer le prompt final
123
+ final_prompt = gen_prompt_template.format(text=text)
124
+
125
+ # Retourne les suggestions ou les erreurs de parsing
126
+ return {
127
+ "result": json_result,
128
+ "prompt": final_prompt
129
+ }
requirements.txt ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiohappyeyeballs==2.4.0
2
+ aiohttp==3.10.5
3
+ aiosignal==1.3.1
4
+ altair==5.4.1
5
+ annotated-types==0.7.0
6
+ anyio==4.4.0
7
+ attrs==24.2.0
8
+ blinker==1.8.2
9
+ blis==0.7.11
10
+ cachetools==5.5.0
11
+ catalogue==2.0.10
12
+ certifi==2024.8.30
13
+ charset-normalizer==3.3.2
14
+ click==8.1.7
15
+ cloudpathlib==0.19.0
16
+ confection==0.1.5
17
+ cymem==2.0.8
18
+ dataclasses-json==0.6.7
19
+ distro==1.9.0
20
+ fr-core-news-md @ https://github.com/explosion/spacy-models/releases/download/fr_core_news_md-3.7.0/fr_core_news_md-3.7.0-py3-none-any.whl#sha256=f6a4fa799b1daf2a635fe55a7de6b344379dc542d54d4c490113f0bc94bed4b8
21
+ fr-core-news-sm @ https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-3.7.0/fr_core_news_sm-3.7.0-py3-none-any.whl#sha256=37e9f1f6a278a5138fabdabcc92cc559da917f9b24c76f0adf6758720d7eab10
22
+ frozenlist==1.4.1
23
+ gitdb==4.0.11
24
+ GitPython==3.1.43
25
+ greenlet==3.1.0
26
+ h11==0.14.0
27
+ httpcore==1.0.5
28
+ httpx==0.27.2
29
+ idna==3.8
30
+ Jinja2==3.1.4
31
+ jiter==0.5.0
32
+ jsonpatch==1.33
33
+ jsonpointer==3.0.0
34
+ jsonschema==4.23.0
35
+ jsonschema-specifications==2023.12.1
36
+ langchain==0.2.16
37
+ langchain-community==0.2.17
38
+ langchain-core==0.2.39
39
+ langchain-openai==0.1.24
40
+ langchain-text-splitters==0.2.4
41
+ langcodes==3.4.0
42
+ langsmith==0.1.120
43
+ language_data==1.2.0
44
+ marisa-trie==1.2.0
45
+ markdown-it-py==3.0.0
46
+ MarkupSafe==2.1.5
47
+ marshmallow==3.22.0
48
+ mdurl==0.1.2
49
+ multidict==6.1.0
50
+ murmurhash==1.0.10
51
+ mypy-extensions==1.0.0
52
+ narwhals==1.8.0
53
+ numpy==1.26.4
54
+ openai==1.45.0
55
+ orjson==3.10.7
56
+ packaging==24.1
57
+ pandas==2.2.2
58
+ pillow==10.4.0
59
+ preshed==3.0.9
60
+ protobuf==5.28.1
61
+ pyarrow==17.0.0
62
+ pydantic==2.9.1
63
+ pydantic_core==2.23.3
64
+ pydeck==0.9.1
65
+ Pygments==2.18.0
66
+ python-dateutil==2.9.0.post0
67
+ pytz==2024.2
68
+ PyYAML==6.0.2
69
+ referencing==0.35.1
70
+ regex==2024.9.11
71
+ requests==2.32.3
72
+ rich==13.8.1
73
+ rpds-py==0.20.0
74
+ setuptools==75.0.0
75
+ shellingham==1.5.4
76
+ six==1.16.0
77
+ smart-open==7.0.4
78
+ smmap==5.0.1
79
+ sniffio==1.3.1
80
+ spacy==3.7.6
81
+ spacy-legacy==3.0.12
82
+ spacy-loggers==1.0.5
83
+ SQLAlchemy==2.0.34
84
+ srsly==2.4.8
85
+ streamlit==1.38.0
86
+ tenacity==8.5.0
87
+ thinc==8.2.5
88
+ tiktoken==0.7.0
89
+ toml==0.10.2
90
+ tornado==6.4.1
91
+ tqdm==4.66.5
92
+ typer==0.12.5
93
+ typing-inspect==0.9.0
94
+ typing_extensions==4.12.2
95
+ tzdata==2024.1
96
+ urllib3==2.2.3
97
+ wasabi==1.1.3
98
+ watchdog==4.0.2
99
+ weasel==0.4.1
100
+ wrapt==1.16.0
101
+ yarl==1.11.1