Skip to content

Meilleure casse pour les noms d'acheteurs et de titulaires #167

@ColinMaudry

Description

@ColinMaudry

Les noms issus de la base SIRENE sont intégralement en majuscules et sans accents, ce qui n'est pas très lisible ni agréable à lire.

Gemini 3 propose ce script pour les améliorer (base à améliorer) :

import polars as pl

# 1. Préparation des dictionnaires de correspondance
# On gère les accents en minuscule pour le remplacement initial
accents_map = {
    "communaute": "communauté",
    "societe": "société",
    "etablissement": "établissement",
    "region": "région",
    "regional": "régional",
    "federation": "fédération",
    "electricite": "électricité",
    "amenagement": "aménagement",
    "departemental": "départemental",
    "departement": "département",
    "cooperative": "coopérative",
    "metropole": "métropole",
    "cooperative": "coopérative",
    "agglomeration": "agglomération",
    "interet": "intérêt",
    "sante":"santé",
    "general": "général",
    "hopital": "hôpital",
    "hopitaux": "hôpitaux",
    "secretariat": "secrétariat",
    "ministere": "ministère",
    "immobiliere": "immobilière",



}

# Liste des mots à forcer en minuscules (s'ils ne sont pas en début de phrase)
low_words = ["De", "Du", "Des", "Le", "La", "Les", "Au", "Aux", "Et", "En", "Pour", "Sur", "Communes", "Société", 'Social', 'Sociale', 'Syndicat', 'Union', 'Service', 'Services', 'Indivision', "Rue", "Of", "The", "Mairie", "Hospitalier", "Hospitaliers",  "Public", "Publique", "Agence", "Traitement", "Grand", "Universitaire", "Mixte", "Pays", "Incendie", "Secours", "Gendarmerie", "Commissariat", "Urbaine", "Eau", "Territoriale", "Territoire", "Intercommunale", "Assainissement", "Institut", "Gestion", "Produits", "Estuaire", "Bassin", "Action", "Pompiers", "Police", "Logement", "Nationale", "National", "Immobilier", "Valorisation", "Collectif", "Collective", "Scientifique", "Construction"]

low_words.extends()


# Liste des acronymes à forcer en majuscules
acronyms = ["Sa", "Sarl", "Sas", "Sci", "Eurl", "Sncf", "Cc", "Ca", "Sce", "Gip", "Dir", "Cu", "Cnrs", "Epi"]

def apply_sirene_casing(column_name):
    expr = pl.col(column_name).str.to_lowercase()
 
    # Étape 1 : Rétablir les accents (en minuscules)
    expr = expr.str.replace_many(accents_map)
    
    # Étape 2 : Mettre une majuscule à chaque mot (Title Case)
    expr = expr.str.to_titlecase()
    
    # Étape 3 : Forcer en minuscules les articles/mots admin s'ils sont précédés d'un espace
    # Le lookbehind (?<= ) garantit qu'on ne touche pas au premier mot de la chaîne
    for word in low_words:
        expr = expr.str.replace_all(rf"(?<= ){word}\b", word.lower())
        
    # Étape 4 : Forcer les acronymes en majuscules
    for acro in acronyms:
        expr = expr.str.replace_all(rf"\b{acro}\b", acro.upper())

    # Étape 5 : Nettoyage final des apostrophes (ex: L'administration)
    expr = expr.str.replace_all(r"([LlDd])' ", r"$1'")

    return expr

# --- Exemple d'utilisation ---
df = pl.DataFrame({
    "NOM": [
        "COMMUNAUTE DE COMMUNES DU LIMOUXIN",
        "SOCIETE GENERALE D'ELECTRICITE",
        "FEDERATION DES CHASSEURS DU GARD",
        "GARAGE DU MIDI SARL"
    ]
})

df = df.with_columns(
    NOM_PROPRE = apply_sirene_casing("NOM")
)

print(df)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions