File size: 3,024 Bytes
f825a37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Module de traitement des données pour l'analyse de sentiment
Nettoyage des textes et labellisation
"""

import re
import string

# Liste des stopwords français
FRENCH_STOPWORDS = {
    "a", "à", "ai", "aie", "aient", "aies", "ait", "alors", "as", "au", "aucun", "aura",
    "aurai", "auraient", "aurais", "aurait", "auve", "avec", "avez", "aviez", "avions",
    "avoir", "avons", "bon", "car", "ce", "cela", "ces", "cet", "cette", "ceux", "chaque",
    "comme", "d", "dans", "de", "des", "du", "elle", "en", "encore", "est", "et", "eu",
    "fait", "faites", "fois", "ici", "il", "ils", "je", "la", "le", "les", "leur", "lui",
    "mais", "me", "mes", "moi", "mon", "ne", "nos", "notre", "nous", "on", "ou", "par",
    "pas", "pour", "plus", "qu", "que", "qui", "sa", "se", "ses", "son", "sur",
    "ta", "te", "tes", "toi", "ton", "toujours", "tout", "tous", "très", "tu",
    "un", "une", "vos", "votre", "vous", "y"
}

# Table de traduction pour remplacer la ponctuation par des espaces
PUNCT_TABLE = str.maketrans({c: " " for c in string.punctuation})


def clean_text(text: str) -> str:
    """
    Nettoie un texte d'avis client :
    - Conversion en minuscules
    - Suppression de la ponctuation
    - Suppression des chiffres
    - Suppression des stopwords français
    - Normalisation des espaces
    
    Args:
        text (str): Texte brut à nettoyer
        
    Returns:
        str: Texte nettoyé
    """
    if not isinstance(text, str):
        return ""
    
    # 1. Minuscules
    text = text.lower()
    
    # 2. Suppression de la ponctuation
    text = text.translate(PUNCT_TABLE)
    
    # 3. Suppression des chiffres
    text = re.sub(r"\d+", " ", text)
    
    # 4. Normalisation des espaces
    text = re.sub(r"\s+", " ", text).strip()
    
    # 5. Suppression des stopwords
    tokens = [tok for tok in text.split() if tok not in FRENCH_STOPWORDS]
    
    return " ".join(tokens)


def label_to_sentiment(label_value: int) -> str:
    """
    Convertit un label numérique (1-5 étoiles) en sentiment positif/négatif
    
    Args:
        label_value (int): Note de 1 à 5 étoiles
        
    Returns:
        str: "positif" si >= 3 étoiles, "negatif" sinon
    """
    try:
        v = int(label_value)
    except Exception:
        v = 0
    
    return "positif" if v >= 3 else "negatif"


def make_fake_email(index: int) -> str:
    """
    Génère un email factice pour un client
    
    Args:
        index (int): Numéro du client
        
    Returns:
        str: Email au format client00001@example.com
    """
    return f"client{index:05d}@example.com"


if __name__ == "__main__":
    # Tests
    test_text = "Je suis TRÈS déçu de ce produit ! Il est arrivé cassé et le service client ne répond pas..."
    print(f"Original : {test_text}")
    print(f"Nettoyé  : {clean_text(test_text)}")
    
    print(f"\nLabel 1 → {label_to_sentiment(1)}")
    print(f"Label 5 → {label_to_sentiment(5)}")
    
    print(f"\nEmail test : {make_fake_email(42)}")