diff --git a/main.py b/main.py index d9831c2..2252919 100644 --- a/main.py +++ b/main.py @@ -30,6 +30,43 @@ def extract_text_from_pdf(pdf_path): text_by_page.append(text) return text_by_page +def merge_paragraphs_across_pages(pages_text): + """Divise le texte en chunks raisonnables pour la traduction.""" + import re + + # Concatène tout le texte + full_text = "\n".join(pages_text) + + # Essaie d'abord de diviser par les doubles sauts de ligne + paragraphs = re.split(r'\n\s*\n+', full_text.strip()) + + # Si on obtient seulement un paragraphe, on divise par une taille maximale + if len(paragraphs) == 1: + print("Aucune séparation par double saut de ligne détectée. Division par taille...") + # Divise par les phrases (points suivis d'un espace) + sentences = re.split(r'(?<=[.!?])\s+', full_text.strip()) + + # Regroupe les phrases en chunks d'environ 1500 caractères + max_chunk_size = 1500 + paragraphs = [] + current_chunk = "" + + for sentence in sentences: + if len(current_chunk) + len(sentence) < max_chunk_size: + current_chunk += (" " + sentence) if current_chunk else sentence + else: + if current_chunk: + paragraphs.append(current_chunk) + current_chunk = sentence + + if current_chunk: + paragraphs.append(current_chunk) + else: + # Normalise les sauts de ligne internes + paragraphs = [re.sub(r'\n+', ' ', p.strip()) for p in paragraphs if p.strip()] + + return paragraphs + def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): """Envoie une requête à Ollama et retourne la réponse.""" payload = { @@ -120,26 +157,28 @@ def create_pdf_from_results(results, output_path): print(f"PDF généré avec succès : {output_path}") def main(): - # Extraction du texte + # Extraction du texte page par page pages = extract_text_from_pdf(PDF_PATH) print(f"Nombre de pages extraites : {len(pages)}") + + # Fusion des paragraphes qui s'étendent sur plusieurs pages + paragraphs = merge_paragraphs_across_pages(pages) + print(f"Nombre de paragraphes complets extraits : {len(paragraphs)}") # Dictionnaire pour stocker les résultats results = {} - # Traitement page par page - for i, page_text in enumerate(pages, start=1): - if( i > 2) : # Limite le nombre de pages pour les tests - break - print(f"{15 * '-'} Traduction de la page {i}/{len(pages)}...") - prompt = f"Traduis le texte suivant de l'ukrainien vers le français : {page_text}" + # Traitement des paragraphes complets + for i, paragraph_text in enumerate(paragraphs, start=1): + print(f"{15 * '-'} Traduction du paragraphe {i}/{len(paragraphs)}...\n{paragraph_text}\n") + prompt = f"Traduis le texte suivant de l'ukrainien vers le français : {paragraph_text}" try: result = send_to_ollama(prompt) print(f"{result}.") results[i] = result except Exception as e: - print(f"Erreur lors du traitement de la page {i} : {e}") - results[i] = f"Erreur lors du traitement de la page {i} : {e}" + print(f"Erreur lors du traitement du paragraphe {i} : {e}") + results[i] = f"Erreur lors du traitement du paragraphe {i} : {e}" # Création du PDF avec tous les résultats create_pdf_from_results(results, OUTPUT_PDF_PATH)