Spaces:
Runtime error
Runtime error
Commit
·
8c7c295
1
Parent(s):
d088434
adding the remaining prompts
Browse files- app.py +115 -0
- pattern_en_plus.py +108 -0
- pattern_il_suffit_de.py +102 -0
- pattern_important_crucial.py +128 -0
- pattern_outre.py +133 -0
- pattern_permettre.py +125 -0
- pattern_voici_decouvrez.py +104 -0
app.py
CHANGED
@@ -15,6 +15,13 @@ 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 |
# Interface Streamlit
|
19 |
st.title("Analyse du texte")
|
20 |
|
@@ -31,6 +38,12 @@ List_prompt = {
|
|
31 |
"< Détection du pattern 'il faut' >": il_faut_prompt_template(),
|
32 |
"< Détection du pattern 'vous pouvez' >": vous_pouvez_prompt_template(),
|
33 |
"< Détection du pattern 'imaginez' >": imaginez_prompt_template(),
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
}
|
35 |
|
36 |
# Menu déroulant pour sélectionner l'analyse
|
@@ -237,5 +250,107 @@ if st.button("Lancer l'analyse"):
|
|
237 |
logging.error(f"Error during analysis: {e}")
|
238 |
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
239 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
240 |
else:
|
241 |
st.error("Veuillez entrer du texte pour lancer l'analyse.")
|
|
|
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 |
+
|
25 |
# Interface Streamlit
|
26 |
st.title("Analyse du texte")
|
27 |
|
|
|
38 |
"< Détection du pattern 'il faut' >": il_faut_prompt_template(),
|
39 |
"< Détection du pattern 'vous pouvez' >": vous_pouvez_prompt_template(),
|
40 |
"< Détection du pattern 'imaginez' >": imaginez_prompt_template(),
|
41 |
+
"< Détection du pattern 'en plus' >": en_plus_prompt_template(),
|
42 |
+
"< Détection du pattern 'outre' >": outre_prompt_template(),
|
43 |
+
"< Détection du pattern 'il suffit de' >": il_suffit_de_prompt_template(),
|
44 |
+
"< Détection du pattern 'important crucial' >": importance_prompt_template(),
|
45 |
+
"< Détection du pattern 'permettre' >": permettre_prompt_template(),
|
46 |
+
"< Détection du pattern 'voici découvrez' >": voici_decouvrez_prompt_template(),
|
47 |
}
|
48 |
|
49 |
# Menu déroulant pour sélectionner l'analyse
|
|
|
250 |
logging.error(f"Error during analysis: {e}")
|
251 |
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
252 |
|
253 |
+
elif option == "< Détection du pattern 'en plus' >":
|
254 |
+
try:
|
255 |
+
# Analyser le texte pour les fautes de style
|
256 |
+
result = detect_en_plus(input_text)
|
257 |
+
|
258 |
+
# Afficher les résultats en JSON formaté
|
259 |
+
st.subheader("Résultats de l'analyse du pattern 'en plus'")
|
260 |
+
st.json(result['result'], expanded=True)
|
261 |
+
|
262 |
+
# Afficher le prompt final
|
263 |
+
st.subheader("Prompt final envoyé au modèle")
|
264 |
+
st.write(result['prompt'])
|
265 |
+
|
266 |
+
except Exception as e:
|
267 |
+
logging.error(f"Error during analysis: {e}")
|
268 |
+
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
269 |
+
|
270 |
+
elif option == "< Détection du pattern 'outre' >":
|
271 |
+
try:
|
272 |
+
# Analyser le texte pour les fautes de style
|
273 |
+
result = detect_outre(input_text)
|
274 |
+
|
275 |
+
# Afficher les résultats en JSON formaté
|
276 |
+
st.subheader("Résultats de l'analyse du pattern 'outre'")
|
277 |
+
st.json(result['result'], expanded=True)
|
278 |
+
|
279 |
+
# Afficher le prompt final
|
280 |
+
st.subheader("Prompt final envoyé au modèle")
|
281 |
+
st.write(result['prompt'])
|
282 |
+
|
283 |
+
except Exception as e:
|
284 |
+
logging.error(f"Error during analysis: {e}")
|
285 |
+
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
286 |
+
|
287 |
+
elif option == "< Détection du pattern 'il suffit de' >":
|
288 |
+
try:
|
289 |
+
# Analyser le texte pour les fautes de style
|
290 |
+
result = detect_il_suffit_de(input_text)
|
291 |
+
|
292 |
+
# Afficher les résultats en JSON formaté
|
293 |
+
st.subheader("Résultats de l'analyse du pattern 'il suffit de'")
|
294 |
+
st.json(result['result'], expanded=True)
|
295 |
+
|
296 |
+
# Afficher le prompt final
|
297 |
+
st.subheader("Prompt final envoyé au modèle")
|
298 |
+
st.write(result['prompt'])
|
299 |
+
|
300 |
+
except Exception as e:
|
301 |
+
logging.error(f"Error during analysis: {e}")
|
302 |
+
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
303 |
+
|
304 |
+
elif option == "< Détection du pattern 'important crucial' >":
|
305 |
+
try:
|
306 |
+
# Analyser le texte pour les fautes de style
|
307 |
+
result = importance_detection(input_text)
|
308 |
+
|
309 |
+
# Afficher les résultats en JSON formaté
|
310 |
+
st.subheader("Résultats de l'analyse du pattern 'important crucial'")
|
311 |
+
st.json(result['result'], expanded=True)
|
312 |
+
|
313 |
+
# Afficher le prompt final
|
314 |
+
st.subheader("Prompt final envoyé au modèle")
|
315 |
+
st.write(result['prompt'])
|
316 |
+
|
317 |
+
except Exception as e:
|
318 |
+
logging.error(f"Error during analysis: {e}")
|
319 |
+
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
320 |
+
|
321 |
+
elif option == "< Détection du pattern 'permettre' >":
|
322 |
+
try:
|
323 |
+
# Analyser le texte pour les fautes de style
|
324 |
+
result = permettre_detection(input_text)
|
325 |
+
|
326 |
+
# Afficher les résultats en JSON formaté
|
327 |
+
st.subheader("Résultats de l'analyse du pattern 'permettre'")
|
328 |
+
st.json(result['result'], expanded=True)
|
329 |
+
|
330 |
+
# Afficher le prompt final
|
331 |
+
st.subheader("Prompt final envoyé au modèle")
|
332 |
+
st.write(result['prompt'])
|
333 |
+
|
334 |
+
except Exception as e:
|
335 |
+
logging.error(f"Error during analysis: {e}")
|
336 |
+
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
337 |
+
|
338 |
+
elif option == "< Détection du pattern 'voici découvrez' >":
|
339 |
+
try:
|
340 |
+
# Analyser le texte pour les fautes de style
|
341 |
+
result = detect_voici_decouvrez(input_text)
|
342 |
+
|
343 |
+
# Afficher les résultats en JSON formaté
|
344 |
+
st.subheader("Résultats de l'analyse du pattern 'voici découvrez'")
|
345 |
+
st.json(result['result'], expanded=True)
|
346 |
+
|
347 |
+
# Afficher le prompt final
|
348 |
+
st.subheader("Prompt final envoyé au modèle")
|
349 |
+
st.write(result['prompt'])
|
350 |
+
|
351 |
+
except Exception as e:
|
352 |
+
logging.error(f"Error during analysis: {e}")
|
353 |
+
st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
|
354 |
+
|
355 |
else:
|
356 |
st.error("Veuillez entrer du texte pour lancer l'analyse.")
|
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="sk-your-api-key")
|
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_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="sk-your-api-key")
|
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_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="sk-your-api-key")
|
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_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="sk-your-api-key")
|
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="sk-your-api-key")
|
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 |
+
}
|