Spaces:
Runtime error
Runtime error
| 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 envoyé au modèle") | |
| 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.") |