# Traduction PDF avec Ollama

Ce projet permet de traduire un document PDF page par page en utilisant un modèle LLM local (Ollama) optimisé pour la traduction.

---

## Prérequis

- **Python** (version 3.8 ou supérieure)
- **Ollama** installé et en cours d'exécution sur ta machine (en mode "serveur")
- Un **document PDF** à traduire

## Installation

### Étapes d'installation

1. **Cloner ou télécharger le projet**
   ```bash
   cd chemin/vers/votre/projet
   git pull https://git.alex-design.fr/Alex/python.traduction
   ```

2. **Installer les dépendances Python**
```bash
pip install -r requirements.txt
```

Puis faire :
```bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```

3. **Placer votre fichier PDF** dans le répertoire `Traduction` du projet avec le nom configuré dans `main.py` (par défaut : `TaniaBorecMemoir(Ukr).pdf`)

---

## Mode opératoire

### Préparation

1. **Démarrer Ollama en mode serveur** sur votre machine (port 11434 par défaut)
```bash
ollama serve
```

### Exécution

1. **Lancer le script de traduction**
```bash
python main.py
```

2. **Le programme va :**
   - Extraire le texte de toutes les pages du PDF
   - Supprimer les numéros de pages
   - Regrouper les paragraphes qui s'étendent sur plusieurs pages
   - Diviser le texte en chunks raisonnables (environ 1500 caractères)
   - Envoyer chaque chunk au LLM pour traduction
   - Afficher la progression dans le terminal

3. **Le résultat final** sera généré dans un fichier PDF nommé `[nom_original](FR).pdf`
   - Exemple : `TaniaBorecMemoir(Ukr)(FR).pdf`

### Fichier de sortie

Le PDF généré contient :
- **Titre** : "Traduction - Ukrainien vers Français"
- **Contenu** : Les traductions de tous les chunks, préservant la mise en page (sauts de ligne, paragraphes)
- **Police** : Support complet du cyrilique (déjà testé avec l'ukrainien)

---

## Configuration

Vous pouvez modifier les paramètres suivants dans `main.py` :

- `PDF_PATH` : Chemin du fichier PDF à traduire
- `OLLAMA_MODEL` : Nom du modèle Ollama à utiliser
- `OLLAMA_URL` : URL du serveur Ollama (par défaut : `http://localhost:11434/api/generate`)
- `OUTPUT_PDF_PATH` : Chemin et nom du fichier PDF de sortie (généré autoamtiquement)

---

## Finnetunning
Le finne-tunning permet d'avoir une meilleur traduction. C'est un processus long en temps de calcul, mais permet une traduction plus précise.

Le principe est le suivant :

```
1️⃣ Dataset d’entraînement (pairs.json)
      ↓
1️⃣ Dataset nettoyé ( cleanDataSet.py -> pairs_clean.json)
      ↓
2️⃣ Fine-tuning LoRA (finetuning.py)
      ↓
3️⃣ Validation / Évaluation BLEU (validation.py)
      ↓
4️⃣ Merge LoRA + modèle de base (mergeLora.py)
      ↓
5️⃣ Conversion en GGUF ()
      ↓
6️⃣ Ollama (inférence finale)

```

### Nettoyage du dataset
Executer le script ```python cleanDataSet.py```

### Validation
Executer le script ```python validation.py```

Le script tests plusieurs prompts et renvoie celui avec le meilleur score BLEU.

Il faut ensuite copier ce prompt dans le fichier ModelFile.

### Merge
Executer le script ```python mergeLora.py```

### Conversion en GGUF
En étant à la racine du projet (et toujours dans le venv), cloner le projet llama.cpp
```bash
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
pip install -r requirements.txt
```

Et lancer la commande (/!\ ca prend eviron 10 minutes):
```bash
python convert_hf_to_gguf.py ../Finetunning/qwen2.5-7b-uk-fr-merged --outfile qwen2.5-7b-uk-fr.gguf --outtype q8_0
```

Vérification :
```bash
./main -m qwen2.5-7b-uk-fr.gguf -p "Translate into French: Привіт світ"
```
Pour que ce nouveau modèle soit exploitable par ollama, il faut TODO

## Utilisation du modèle fine-tunné pour la traduction
Créer un Modelfile :
```
FROM ./qwen2.5-7b-uk-fr.gguf

PARAMETER temperature 0.1
PARAMETER top_p 0.95
PARAMETER num_ctx 4096

SYSTEM """
You are a professional Ukrainian to French translator.
Produce faithful, literal translations.
"""

```