Enlever les accents (avec R)

En travaillant dans un langue autre que l’anglais, on est souvent amené à fréquenter des caractères exotiques : lettres munies d’accents (é), tildes (ñ), ronds (Å) et autres barres (ø) – sans compter les formes non-latines (de ∆ à भैं, en passant par ش). Mais comme l’informatique moderne a été développée avec des claviers étas-uniens, leur traitement ne va pas sans difficultés.

Des procédures standardisées, dites d’encodage, permettent d’utiliser ces caractères dans des textes ou des bases de données. Toutefois, dans le cas du français, le plus simple est bien souvent d’enlever les accents, si bien sûr on ne perd pas d’information cruciale au passage.

R permet d’effectuer cette opération, grâce à la fonction iconv munie d’une option de translittération : é est ainsi transformé en ´e, par exemple. On enlève ensuite les apostrophes (et équivalents) pour compléter la procédure de désaccentuation. Pour le faire de manière systématique, on définit la fonction suivante:

Unaccent <- function(text) {
  text <- gsub("['`^~\"]", " ", text)
  text <- iconv(text, to="ASCII//TRANSLIT//IGNORE")
  text <- gsub("['`^~\"]", "", text)
  return(text)
}

Il suffit d’exécuter ces quelques lignes au début d’un script R et cette fonction Unaccent devient disponible pour toute la suite de votre programme. Trois remarques:

  • Elle ne fonctionne que pour les caractères latins.
  • Les apostrophes et guillemets anglais sont également évacués, et remplacés par des espaces.
  • Vous venez de créer une fonction en R, un outil très utile qui permet d’empaqueter un ensemble d’instructions (éventuellement long) plutôt que de les réécrire à chaque fois.

Son utilisation donne ainsi :

> Unaccent("à é î ø ü ç ß ñ ƒ")
[1] "a e i o u c ss n f"

> Unaccent("J'ai dévoré les Grundriße")
[1] J ai devore les Grundrisse

Attention, les caractères non-latins sont purement et simplement effacés :

> Unaccent("∆")
[1] ""

Il est possible de travailler en gardant l’ensemble des caractères et des accents, mais cela nécessite d’être extrêmement soigneux dans la manipulation des encodages, voire des expressions régulières. Ces sujets, très techniques, seront abordés prochainement. Mais si vous pouvez y échapper, profitez-en !

Alexandre Hobeika

Docteur en sociologie politique de l'EHESS, CMH-ETT

More Posts - Website


OpenEdition vous propose de citer ce billet de la manière suivante :
Alexandre Hobeika (11 mars 2013). Enlever les accents (avec R). Data Sciences Sociales. Consulté le 9 décembre 2024 à l’adresse https://doi.org/10.58079/ngxr


10 réflexions sur « Enlever les accents (avec R) »

  1. Léon Theux

    J’ai tenté une micro amélioration…

    Unaccent<-function(text) {
    text <- gsub("['`^~\"]", " ", text)
    text <- iconv(text,from = Encoding(text), to="ASCII//TRANSLIT//IGNORE")
    text <- gsub("['`^~\"]", "", text)
    return(text)
    }

    Répondre
  2. Rauch

    Bonjour,

    chez moi “règlement” se transforme en “rA?glement”

    Savez-vous pourquoi ou comment résoudre ce soucis ?
    Merci,
    Cordialement,
    Cyprien

    Répondre
    1. Alexandre Hobeika Auteur de l’article

      Bonjour,
      Chez moi (macOS 10.12) ça fonctionne correctement. Il me faudrait plus d’informations pour comprendre la source du problème. Vous tapez la commande Unaccent(“règlement”) manuellement ou vous l’appliquez à un fichier de données que vous avez importé ? Et que donnent les commandes Sys.info() et Sys.getlocale() sur votre machine ?

      Répondre
    2. toni

      Bonjour Cyprien,

      J’arrive un peu tard mais je réponds pour que cela puisse aider dans le futur.

      J’ai eu le même problème, il faut simplement préciser le quel est l’encodage d’origine de l’objet avec la variable “from”. Par exemple ici pour un dataframe en UTF-8, la deuxième ligne de la fonction devient :

      text <- iconv(text, from="UTF-8", to="ASCII//TRANSLIT//IGNORE")

      Merci Alexandre pour cette fonction très utile !

      Toni

      Répondre
  3. Roland Samati

    Votre fonction m’a super aidé et m’éviter ainsi des heures à matcher des trucs à la main de façon mécanique.

    Répondre
  4. Ping : Quantification du travail parlementaire, pour quelques variables en plus | Polit’bistro : des politiques, du café

  5. Ping : Collecter des donnés sur Wikipédia : l’exemple des salles du culte musulman à Paris | Data Sciences Sociales

  6. Alexandre

    Bonjour, merci beaucoup de votre message,

    Je ne suis pas certain de ce que vous désignez par “non-conforme”, mais j’imagine qu’il s’agit d’un fichier de données (par exemple CSV) dont l’importation donne des caractères bizarres dans les champs de texte, du genre “Ã@“, “\x8e” ou “\u0089“…

    Si c’est le cas, alors au moment de l’importation il faut spécifier l’encodage utilisé pour créer ce fichier de données, à savoir la table de correspondance entre les octets et les caractères. D’habitude si on ne spécifie rien, alors ça marche pour les fichier créés avec un encodage ASCII, ISO-8859-1 (dit “LATIN1”), ou Unicode (“UTF-8”).

    Les encodages utilisés les plus couramment en dehors de ces deux-là sont “WINDOWS-1252” (ou “CP1252”, parfois aussi appelé “ANSI”) sous Windows, et “MACROMAN” sous Mac OS.

    Si vous utilisez une fonction d’importation de la famille des read.table(), comme par exemple read.csv2(), cela s’écrit alors ainsi :

    mon.dataset <- read.csv2(file="…/monfichier.csv",
    fileEncoding="WINDOWS-1252")

    Pour voir la liste des encodages disponibles sous R sur votre machine, vous pouvez utiliser la fonction iconvlist() .

    Une fois que l’importation s’est effectuée correctement, vous pourrez ensuite enlever les accents sans difficulté.

    Est-ce que cela répond à votre problème ?

    Alexandre

    Répondre
  7. Charles-André Coste

    Bonjour,

    superbe procédure ! Bravo.

    mais par contre question pour l’import d’un data frame non conforme, comment fait-on avant, puisque en principe il ne faut importer qu’après nettoyage (que je fais aujourd’hui avec cmdaccut de Pierre Torris.

    pourriez vous préciser la procédure complète avant et après le nettoyage ?

    Charles-André

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.