File size: 6,355 Bytes
ed45f6d
 
89567b4
 
02c56e5
f7746eb
89567b4
 
f7746eb
89567b4
f7746eb
86e1f99
 
 
89567b4
 
ed45f6d
02c56e5
 
 
89567b4
ed45f6d
 
 
 
 
 
 
 
 
 
 
 
 
89567b4
1f35e76
 
89567b4
ed45f6d
 
89567b4
ed45f6d
 
 
 
 
 
 
 
1f35e76
89567b4
 
ed45f6d
 
 
89567b4
 
 
 
 
 
 
 
 
 
 
 
 
 
ed45f6d
 
 
89567b4
ed45f6d
89567b4
 
 
 
ed45f6d
02c56e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86e1f99
02c56e5
 
 
ed45f6d
 
02c56e5
ed45f6d
 
86e1f99
02c56e5
 
86e1f99
02c56e5
 
 
89b174d
 
 
 
 
02c56e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed45f6d
02c56e5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import streamlit as st
import json
import logging
import os
import spacy
from typing import List, Tuple
from pydantic import BaseModel, Field
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI

# Import the function for detecting the "est une étape" pattern
from est_une_etape import une_etape

# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Load the French spaCy model
nlp = spacy.load('fr_core_news_md')

# Pydantic models for style error detection
class StyleErrorDetection(BaseModel):
    erroneous_expression: str = Field(..., description="L'expression ou la tournure incorrecte détectée")
    correct_suggestion: str = Field(..., description="La correction ou suggestion correcte")
    occurrences: int = Field(..., description="Nombre d'occurrences de l'expression erronée")
    indices: List[Tuple[int, int]] = Field(..., description="Indices de début et de fin pour chaque occurrence")

class StyleErrorSummary(BaseModel):
    total_style_errors_detected: int = Field(..., description="Nombre total de fautes de style détectées")

class StyleErrorResult(BaseModel):
    style_errors: List[StyleErrorDetection] = Field(..., description="Liste des fautes de style détectées")
    summary: StyleErrorSummary = Field(..., description="Résumé des fautes de style détectées")

# Create the output parser
output_parser = PydanticOutputParser(pydantic_object=StyleErrorResult)

# Prompt template with format instructions
prompt_template = """
Tu es un détecteur de texte AI très précis. Je vais te donner un texte, et ta mission est de repérer des fautes de style.
Cela inclut les répétitions, les tournures de phrases maladroites, et les mauvais choix de mots.
Pour chaque erreur détectée, tu dois fournir les informations suivantes :
- L'expression ou la tournure incorrecte détectée
- La correction ou suggestion correcte
- Le nombre d'occurrences de l'expression erronée
- Les indices de début et de fin pour chaque occurrence

Le texte à analyser est le suivant :
```{text}```

Voici le format attendu pour la sortie :
{format_instructions}
"""

def get_llm_chain():
    prompt = PromptTemplate(
        input_variables=["text"],
        template=prompt_template,
        partial_variables={"format_instructions": output_parser.get_format_instructions()},
    )

    llm = ChatOpenAI(
        model='gpt-4o',
        temperature=0.5,
        api_key="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",
        verbose=True
    )

    llm_chain = prompt | llm | output_parser
    return llm_chain

def analyze_style_errors(text: str) -> dict:
    logging.info(f"Analyzing text: {text[:100]}...")
    llm_chain = get_llm_chain()
    logging.info("Running the LLM chain.")
    result = llm_chain.invoke({"text": text})
    logging.info("LLM chain completed.")
    return result

# Function to detect forms of the verb "permettre" in a text
def detect_permettre_forms(text: str) -> list:
    doc = nlp(text)
    resultats = []
    for i, token in enumerate(doc):
        # Vérifier si le lemme est "permettre" et que le mot est un verbe (autre que "permis")
        if token.lemma_ == "permettre" and token.pos_ == "VERB" and token.text.lower() != "permis":
            resultats.append((token.text, token.idx))
        # Traiter spécifiquement le mot "permis"
        elif token.text.lower() == "permis":
            est_verbe = False
            # Vérifier si le mot précédent est un auxiliaire
            if i > 0 and doc[i - 1].pos_ == "AUX":
                est_verbe = True
            # Vérifier si le mot suivant est "de" suivi d'un verbe à l'infinitif
            elif i + 2 < len(doc) and doc[i + 1].text.lower() == "de" and doc[i + 2].pos_ == "VERB" and "Inf" in doc[i + 2].tag_:
                est_verbe = True
            # Vérifier si le mot précédent est un déterminant (le, la, un, une, etc.)
            elif i > 0 and doc[i - 1].pos_ == "DET":
                est_verbe = False
            else:
                # Autres cas, on suppose que c'est un nom
                est_verbe = False

            if est_verbe:
                resultats.append((token.text, token.idx))
    return resultats

# Interface Streamlit
st.title("Analyse du texte")

# Menu déroulant pour sélectionner l'analyse
option = st.selectbox(
    "Choisissez l'analyse à effectuer :",
    ("< Détection du pattern 'est une étape' >")# , "Détection du verbe 'permettre'"
)

# Champ de saisie du texte
input_text = st.text_area("Entrez votre texte ici :", height=200)

# Bouton d'analyse
if st.button("Lancer l'analyse"):
    if input_text:
        if option == "< Détection du pattern 'est une étape' >":
            try:
                # Analyser le texte pour les fautes de style
                result = une_etape(input_text)

                # Afficher les résultats en JSON formaté
                st.subheader("Résultats de l'analyse des fautes de style")
                st.json(result['result'], expanded=True)

                # Afficher le prompt final
                st.subheader("Prompt final")
                st.write(result['prompt'])

            except Exception as e:
                logging.error(f"Error during analysis: {e}")
                st.error(f"Une erreur s'est produite lors de l'analyse : {str(e)}")
        elif option == "Détection du verbe 'permettre'":
            try:
                # Détecter les formes du verbe "permettre"
                result = detect_permettre_forms(input_text)

                # Afficher les résultats
                st.subheader("Résultats de la détection du verbe 'permettre'")
                if result:
                    for mot, index in result:
                        st.write(f"Mot : '{mot}' à l'index {index}")
                else:
                    st.write("Aucune forme du verbe 'permettre' n'a été trouvée.")
            except Exception as e:
                logging.error(f"Error during detection: {e}")
                st.error(f"Une erreur s'est produite lors de la détection : {str(e)}")
    else:
        st.error("Veuillez entrer du texte pour lancer l'analyse.")