Skip to content

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

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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions