|
|
|
@ -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) |
|
|
|
|