File size: 3,860 Bytes
d9f69e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python
import argparse
import re
import pdfplumber
import os

def clean_text_for_rag(text: str) -> str:
    """
    Nettoie le texte pour RAG : normalise les caractères spéciaux,
    puis garde uniquement lettres (accents), chiffres, espaces et ponctuation simple.
    """
    # Normalisation des caractères spéciaux
    text = re.sub(
        r"[’‘“”«»–—\u00A0\u202F…œŒæÆ©®™§°±×÷]",
        lambda m: {
            "’": "'", "‘": "'", "“": '"', "”": '"', "«": '"', "»": '"',
            "–": "-", "—": "-", "…": "...", "œ": "oe", "Œ": "OE", "æ": "ae", "Æ": "AE",
            "©": "(c)", "®": "(R)", "™": "TM", "§": "§", "°": "°", "±": "+/-", "×": "x", "÷": "/"
        }.get(m.group(0), m.group(0)),
        text
    )
    
    # Nettoyage strict : garder lettres, chiffres, espaces, ponctuation simple
    text = re.sub(r'[^a-zA-ZÀ-ÿæ-œ0-9\s\.\,\:\;\!\?\-\_\'\"\\(\)\–\…]', '', text)
    text = re.sub(r'\s+', ' ', text).strip()
    
    return text

def extract_and_clean_pdf(pdf_path, output_path):
    """
    Extrait le texte du PDF et le nettoie pour RAG.
    """
    print(f"[+] Extraction du texte depuis : {pdf_path}")
    
    with pdfplumber.open(pdf_path) as pdf:
        all_text = []
        for page in pdf.pages:
            text = page.extract_text()
            if text:
                all_text.append(text)
    
    # Concaténer tout le texte
    full_text = ' '.join(all_text)
    # Nettoyer pour RAG
    cleaned_text = clean_text_for_rag(full_text)
    
    # Sauvegarder
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write(cleaned_text)
    
    print(f"[+] Texte nettoyé sauvegardé dans : {output_path}")

def extract_text(file_path, output_path):
    """
    Extrait le texte des autres formats de fichier et le nettoie.
    """
    print(f"[+] Extraction du texte depuis : {file_path}")
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        
        # Nettoyer chaque ligne
        cleaned_lines = [clean_text_for_rag(line.strip()) for line in lines if line.strip()]
        
        # Joindre avec sauts de ligne pour un bon format .md
        cleaned_text = '\n'.join(cleaned_lines)
        
        # Sauvegarder dans le fichier .md
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(cleaned_text)
        
        print(f"[+] Texte nettoyé sauvegardé dans : {output_path}")
    except Exception as e:
        print(f"Erreur lors de l'ouverture du fichier {file_path} : {e}")
        raise

def main():
    parser = argparse.ArgumentParser(description='Extraire et nettoyer un fichier pour le RAG. Sortie toujours en .md.')
    parser.add_argument('input_file', type=str, help='Chemin vers le fichier à traiter (PDF, TXT, MD, etc.).')
    parser.add_argument('output_md', type=str, help='Chemin du fichier Markdown (.md) de sortie.')
    
    args = parser.parse_args()
    
    input_path = args.input_file
    output_path = args.output_md  # On garde le nom original

    # Vérifier que le fichier existe
    if not os.path.exists(input_path):
        print(f"Erreur : Le fichier {input_path} n'existe pas.")
        return

    # Détecter l'extension du fichier d'entrée
    _, ext = os.path.splitext(input_path.lower())

    # Vérifier et corriger l'extension de sortie si nécessaire
    if not output_path.lower().endswith('.md'):
        print(f"[!] Avertissement : Le fichier de sortie n'a pas l'extension .md. Il sera renommé en .md.")
        output_path = os.path.splitext(output_path)[0] + '.md'

    # Appeler la bonne fonction selon le format
    if ext == '.pdf':
        extract_and_clean_pdf(input_path, output_path)
    else:
        extract_text(input_path, output_path)

if __name__ == '__main__':
    main()