Spaces:
Sleeping
Sleeping
Commit
·
55f834a
1
Parent(s):
35228e8
first commit
Browse files- .gitignore +1 -0
- app.py +375 -0
- const.py +265 -0
- faute_style.py +558 -0
- pattern_adverbe_ment.py +134 -0
- pattern_ce_qui_explique.py +133 -0
- pattern_connecteur_cependant.py +135 -0
- pattern_decision.py +128 -0
- pattern_detection_permettre.py +51 -0
- pattern_en_plus.py +108 -0
- pattern_epoque.py +135 -0
- pattern_est_une_etape.py +141 -0
- pattern_il_existe.py +133 -0
- pattern_il_faut.py +129 -0
- pattern_il_suffit_de.py +102 -0
- pattern_imaginez.py +129 -0
- pattern_important_crucial.py +128 -0
- pattern_look.py +128 -0
- pattern_outre.py +133 -0
- pattern_permettre.py +125 -0
- pattern_voici_decouvrez.py +104 -0
- pattern_vous_pouvez.py +129 -0
- requirements.txt +101 -0
.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
|