Spaces:
Runtime error
Runtime error
Commit
·
86e1f99
1
Parent(s):
3d7b5ca
update pour ajouter est une étape
Browse files- app.py +6 -4
- const.py +0 -0
- est_une_etape.py +174 -0
app.py
CHANGED
|
@@ -3,13 +3,15 @@ import json
|
|
| 3 |
import logging
|
| 4 |
import os
|
| 5 |
import spacy
|
| 6 |
-
|
| 7 |
from typing import List, Tuple
|
| 8 |
from pydantic import BaseModel, Field
|
| 9 |
from langchain.output_parsers import PydanticOutputParser
|
| 10 |
from langchain.prompts import PromptTemplate
|
| 11 |
from langchain.chat_models import ChatOpenAI
|
| 12 |
|
|
|
|
|
|
|
|
|
|
| 13 |
# Configure logging
|
| 14 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 15 |
|
|
@@ -109,7 +111,7 @@ st.title("Analyse du texte")
|
|
| 109 |
# Menu déroulant pour sélectionner l'analyse
|
| 110 |
option = st.selectbox(
|
| 111 |
"Choisissez l'analyse à effectuer :",
|
| 112 |
-
("Détection
|
| 113 |
)
|
| 114 |
|
| 115 |
# Champ de saisie du texte
|
|
@@ -118,10 +120,10 @@ input_text = st.text_area("Entrez votre texte ici :", height=200)
|
|
| 118 |
# Bouton d'analyse
|
| 119 |
if st.button("Lancer l'analyse"):
|
| 120 |
if input_text:
|
| 121 |
-
if option == "Détection
|
| 122 |
try:
|
| 123 |
# Analyser le texte pour les fautes de style
|
| 124 |
-
result =
|
| 125 |
|
| 126 |
# Afficher les résultats en JSON formaté
|
| 127 |
st.subheader("Résultats de l'analyse des fautes de style")
|
|
|
|
| 3 |
import logging
|
| 4 |
import os
|
| 5 |
import spacy
|
|
|
|
| 6 |
from typing import List, Tuple
|
| 7 |
from pydantic import BaseModel, Field
|
| 8 |
from langchain.output_parsers import PydanticOutputParser
|
| 9 |
from langchain.prompts import PromptTemplate
|
| 10 |
from langchain.chat_models import ChatOpenAI
|
| 11 |
|
| 12 |
+
# Import the function for detecting the "est une étape" pattern
|
| 13 |
+
from est_une_etape import une_etape
|
| 14 |
+
|
| 15 |
# Configure logging
|
| 16 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 17 |
|
|
|
|
| 111 |
# Menu déroulant pour sélectionner l'analyse
|
| 112 |
option = st.selectbox(
|
| 113 |
"Choisissez l'analyse à effectuer :",
|
| 114 |
+
("< Détection du pattern 'est une étape' >")# , "Détection du verbe 'permettre'"
|
| 115 |
)
|
| 116 |
|
| 117 |
# Champ de saisie du texte
|
|
|
|
| 120 |
# Bouton d'analyse
|
| 121 |
if st.button("Lancer l'analyse"):
|
| 122 |
if input_text:
|
| 123 |
+
if option == "< Détection du pattern 'est une étape' >":
|
| 124 |
try:
|
| 125 |
# Analyser le texte pour les fautes de style
|
| 126 |
+
result = une_etape(input_text)
|
| 127 |
|
| 128 |
# Afficher les résultats en JSON formaté
|
| 129 |
st.subheader("Résultats de l'analyse des fautes de style")
|
const.py
ADDED
|
File without changes
|
est_une_etape.py
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
|
| 59 |
+
# Fonction pour générer un output parser
|
| 60 |
+
def generate_output_parser(response: str) -> dict:
|
| 61 |
+
try:
|
| 62 |
+
parsed_response = json.loads(response)
|
| 63 |
+
detection_result = DetectionResult(
|
| 64 |
+
patterns=[PatternDetail(
|
| 65 |
+
pattern=item["pattern"],
|
| 66 |
+
adjectif=item["adjectif"],
|
| 67 |
+
indices=item["indices"],
|
| 68 |
+
sentence=item["sentence"],
|
| 69 |
+
alternative_suggestions=AlternativeSuggestion(
|
| 70 |
+
suggestion_1=item["alternative_suggestions"][0],
|
| 71 |
+
suggestion_2=item["alternative_suggestions"][1]
|
| 72 |
+
)
|
| 73 |
+
) for item in parsed_response["patterns"]],
|
| 74 |
+
summary=Summary(
|
| 75 |
+
total_patterns_detected=parsed_response["summary"]["total_patterns_detected"],
|
| 76 |
+
alternative_suggestions_provided=parsed_response["summary"]["alternative_suggestions_provided"],
|
| 77 |
+
occurrences=parsed_response["summary"]["occurrences"]
|
| 78 |
+
)
|
| 79 |
+
)
|
| 80 |
+
return detection_result.to_dict()
|
| 81 |
+
except Exception as e:
|
| 82 |
+
return {"error": f"Failed to parse response: {str(e)}"}
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
|
| 86 |
+
def une_etape(text):
|
| 87 |
+
# Créer le template avec la variable text intégrée directement
|
| 88 |
+
prompt_template = """
|
| 89 |
+
Analyser le texte suivant et identifier toutes les phrases où une expression similaire à "est une étape" est utilisée,
|
| 90 |
+
y compris des variantes comme "est une étape", "constitue une étape", "représente une étape", "marque une étape",
|
| 91 |
+
"signifie une étape", "symbolise une étape", etc.
|
| 92 |
+
|
| 93 |
+
Recherche particulièrement ces expressions lorsqu'elles sont associées à des adjectifs exprimant l'importance
|
| 94 |
+
(par exemple, "important", "essentiel", "crucial", "primordial", "fondamental", "indispensable", "déterminant",
|
| 95 |
+
"vital", "majeur", "clé", "nécessaire", "stratégique", "significatif", etc.), que l'adjectif se trouve avant ou après le mot "étape".
|
| 96 |
+
|
| 97 |
+
Pour chaque occurrence trouvée, veuillez :
|
| 98 |
+
|
| 99 |
+
- Citer la phrase complète où l'expression apparaît.
|
| 100 |
+
- Indiquer l'expression exacte utilisée dans le texte.
|
| 101 |
+
- Mentionner l'adjectif d'importance associé.
|
| 102 |
+
- Proposer deux reformulations de la phrase pour changer l'expression détectée et l'adjectif associé,
|
| 103 |
+
sans employer d'expression équivalente.
|
| 104 |
+
- Assurez-vous de respecter les règles suivantes :
|
| 105 |
+
1. Les expressions comme "crucial", "essentiel", "important", "fondamental" doivent être utilisées une seule fois
|
| 106 |
+
dans l'introduction (premier paragraphe).
|
| 107 |
+
2. Évitez l'usage de mots comme "il existe", "il faut", "cependant", "de plus", "en revanche", "toutefois" en début de phrase.
|
| 108 |
+
3. N'utilisez pas "joue un rôle", "il est", ou "est une étape" avec des adjectifs tels qu'"important", "essentiel", etc.
|
| 109 |
+
|
| 110 |
+
Le format de sortie doit être un JSON structuré avec les éléments suivants pour chaque pattern détecté :
|
| 111 |
+
|
| 112 |
+
- "pattern": "mot ou expression détectée",
|
| 113 |
+
- "adjectif": "adjectif associé",
|
| 114 |
+
- "indices": [[index de début, index de fin pour chaque occurrence]],
|
| 115 |
+
- "sentence": "phrase où l'expression est utilisée",
|
| 116 |
+
- "alternative_suggestions": ["suggestion 1", "suggestion 2"]
|
| 117 |
+
|
| 118 |
+
Si aucun pattern n'est trouvé, retournez un JSON avec :
|
| 119 |
+
|
| 120 |
+
- "pattern0": "",
|
| 121 |
+
- "occurrences": 0,
|
| 122 |
+
|
| 123 |
+
Ajoutez également un résumé à la fin :
|
| 124 |
+
|
| 125 |
+
- "total_patterns_detected": nombre total de patterns détectés,
|
| 126 |
+
- "alternative_suggestions_provided": nombre de suggestions données
|
| 127 |
+
- "occurrences": nombre d'occurrences.
|
| 128 |
+
|
| 129 |
+
Voici le texte à analyser :
|
| 130 |
+
```{text}```
|
| 131 |
+
|
| 132 |
+
\n{format_instruction}
|
| 133 |
+
"""
|
| 134 |
+
|
| 135 |
+
output_parser = PydanticOutputParser(pydantic_object=DetectionResult)
|
| 136 |
+
|
| 137 |
+
# Créer le prompt avec le texte intégré
|
| 138 |
+
# prompt = PromptTemplate(template=template, input_variables=["text"])
|
| 139 |
+
|
| 140 |
+
gen_prompt_template = PromptTemplate(
|
| 141 |
+
input_variables=["text"],
|
| 142 |
+
template=prompt_template,
|
| 143 |
+
partial_variables={'format_instruction': output_parser.get_format_instructions()}
|
| 144 |
+
)
|
| 145 |
+
|
| 146 |
+
# Créer une instance du modèle de langage
|
| 147 |
+
llm = ChatOpenAI(model='gpt-4o',temperature=0.5, api_key="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")
|
| 148 |
+
|
| 149 |
+
# Exécuter la chaîne avec le LLM
|
| 150 |
+
llm_chain = gen_prompt_template | llm | output_parser # LLMChain(prompt=prompt, llm=llm, verbose=True)
|
| 151 |
+
|
| 152 |
+
# Appel du modèle avec le texte fourni
|
| 153 |
+
result_dict = llm_chain.invoke({"text": text}).to_dict()
|
| 154 |
+
|
| 155 |
+
# Parsing de la réponse JSON
|
| 156 |
+
|
| 157 |
+
json_result = json.dumps(result_dict, indent=8, ensure_ascii= False)
|
| 158 |
+
|
| 159 |
+
# Retourne les suggestions ou les erreurs de parsing
|
| 160 |
+
return json_result
|
| 161 |
+
|
| 162 |
+
|
| 163 |
+
# # Exemple d'utilisation avec le texte à analyser
|
| 164 |
+
# textea = """
|
| 165 |
+
# Dans le développement personnel, chaque progrès est une étape cruciale vers une meilleure version de soi-même.
|
| 166 |
+
# De plus, sur le chemin de la réussite professionnelle, l'acquisition de nouvelles compétences constitue une étape incontournable.
|
| 167 |
+
# Dans la vie de toute organisation, la prise de décisions stratégiques représente une étape déterminante pour son avenir.
|
| 168 |
+
# Chaque crise surmontée marque une étape importante dans le renforcement de la résilience,
|
| 169 |
+
# tandis que le franchissement d'un obstacle majeur signifie une étape de transition vers de nouveaux horizons.
|
| 170 |
+
# Enfin, la signature d'un contrat décisif symbolise une étape clé dans la réalisation des objectifs à long terme.
|
| 171 |
+
# """
|
| 172 |
+
|
| 173 |
+
# # Appel de la fonction et affichage du résultat
|
| 174 |
+
# print(une_etape(textea))
|