Données & IA

    Data Normalization

    Mis à jour le 1 février 2026

    Définition

    La Data Normalization transforme les données brutes extraites en format structuré et cohérent. Elle inclut le nettoyage (suppression de HTML, espaces), la standardisation (formats de date, devises, unités) et la validation. Étape cruciale entre le scraping et l'exploitation des données par les LLMs.

    Deep Dive

    Normalisation des données : de la soupe HTML à l'or structuré

    Pipeline de normalisation typique

    ```

    HTML brut → Extraction → Nettoyage → Standardisation → Validation → Stockage

    ```

    Types de normalisation

    **Textuelle**

  1. Suppression des balises HTML résiduelles
  2. Normalisation Unicode (NFC/NFD)
  3. Trimming et collapse des espaces
  4. Correction de l'encodage
  5. **Numérique**

  6. Parsing des prix : "1 299,99 €" → 1299.99
  7. Conversion d'unités : "15kg" → 15.0, "kg"
  8. Gestion des séparateurs locaux
  9. **Temporelle**

  10. Parsing multiformat : "15 jan 2026", "2026-01-15"
  11. Conversion en UTC
  12. Calcul de dates relatives : "il y a 2 jours"
  13. **Catégorielle**

  14. Mapping vers des taxonomies standards
  15. Détection et correction des fautes de frappe
  16. Synonymes et variantes
  17. Code Playground

    Pipeline complet de normalisation : texte, prix, dates et disponibilité avec gestion multi-locale

    python
    # Pipeline de normalisation de données complet
    import re
    import unicodedata
    from datetime import datetime
    from typing import Any, Optional
    from dataclasses import dataclass
    import dateparser
    
    @dataclass
    class NormalizedProduct:
        name: str
        price: float
        currency: str
        availability: bool
        scraped_at: datetime
    
    class DataNormalizer:
        """Normalisateur de données e-commerce"""
        
        # Patterns de prix par locale
        PRICE_PATTERNS = [
            (r'([ds]+[,.]?d*)s*€', 'EUR'),
            (r'$([d,]+.?d*)', 'USD'),
            (r'£([d,]+.?d*)', 'GBP'),
        ]
        
        def normalize_text(self, text: str) -> str:
            """Nettoie et normalise du texte brut"""
            if not text:
                return ""
            
            # Supprimer les balises HTML résiduelles
            text = re.sub(r'<[^>]+>', '', text)
            
            # Normalisation Unicode (NFC)
            text = unicodedata.normalize('NFC', text)
            
            # Collapse des espaces multiples
            text = re.sub(r's+', ' ', text)
            
            # Trim
            return text.strip()
        
        def normalize_price(self, price_str: str) -> tuple[float, str]:
            """Extrait et normalise un prix avec sa devise"""
            if not price_str:
                return 0.0, 'EUR'
            
            for pattern, currency in self.PRICE_PATTERNS:
                match = re.search(pattern, price_str)
                if match:
                    # Nettoyer le nombre
                    num_str = match.group(1)
                    num_str = num_str.replace(' ', '').replace(',', '.')
                    # Gérer le cas "1.299.99" → "1299.99"
                    parts = num_str.split('.')
                    if len(parts) > 2:
                        num_str = ''.join(parts[:-1]) + '.' + parts[-1]
                    return float(num_str), currency
            
            return 0.0, 'EUR'
        
        def normalize_date(self, date_str: str, locale: str = 'fr') -> Optional[datetime]:
            """Parse une date dans divers formats"""
            if not date_str:
                return None
            
            # Utiliser dateparser pour le parsing intelligent
            settings = {
                'PREFER_DAY_OF_MONTH': 'first',
                'PREFER_DATES_FROM': 'past',
                'TIMEZONE': 'Europe/Paris',
                'RETURN_AS_TIMEZONE_AWARE': True
            }
            
            return dateparser.parse(date_str, settings=settings)
        
        def normalize_availability(self, text: str) -> bool:
            """Détecte la disponibilité depuis du texte"""
            text_lower = text.lower()
            
            available_keywords = ['en stock', 'disponible', 'in stock', 'available']
            unavailable_keywords = ['rupture', 'épuisé', 'out of stock', 'indisponible']
            
            if any(kw in text_lower for kw in available_keywords):
                return True
            if any(kw in text_lower for kw in unavailable_keywords):
                return False
            
            return True  # Default
        
        def normalize_product(self, raw_data: dict) -> NormalizedProduct:
            """Normalise un produit complet"""
            price, currency = self.normalize_price(raw_data.get('price', ''))
            
            return NormalizedProduct(
                name=self.normalize_text(raw_data.get('name', '')),
                price=price,
                currency=currency,
                availability=self.normalize_availability(raw_data.get('availability', '')),
                scraped_at=datetime.utcnow()
            )

    Avis d'Expert 2026

    La normalisation des données prend une importance critique avec l'essor du RAG (Retrieval-Augmented Generation). Des données mal normalisées produisent des hallucinations IA. En 2026, les pipelines intègrent des LLMs pour la normalisation sémantique : extraction d'entités, résolution de coréférences, et enrichissement contextuel.

    Besoin d'aide sur Data Normalization ?

    Nos experts peuvent vous accompagner sur vos projets de crawling et d'optimisation GEO.

    Contactez l'expert Crawlers.fr
    4.6/5 (73 avis d'experts)