
Data Science : comment traiter les caractères accentués ?
Lorsqu’on travaille avec des données textuelles, nous devons souvent faire face à une problématique liée aux caractères accentués : la langue française en est un exemple parfait.
Un exemple concret
Supposons par exemple que nous devons identifier les tweets qui contiennent le mot clé “astéroïde”.
En considérant que sur Twitter les utilisateurs ne font pas toujours attention à écrire des mots bien accentués, nous pouvons logiquement tomber sur différentes versions du mot astéroïde :
- astéroïde (la bonne version),
- asteroide (sans aucun accent),
- astéroide, astèroide, asteroïde, … (avec des accents mais incomplets ou erronés).
Si nous voulons maintenant, par exemple, visualiser l’évolution du nombre de tweets quotidiens contenant le mot astéroïde, nous devrons alors faire bien attention à considérer tous les cas décrits ci-dessus. Nous pourrions ainsi créer une sorte de table de correspondances, pour pouvoir lier au mot “astéroïde” les chaînes de caractères suivantes : “astéroïde”, “asteroide”, “astéroide”, “astèroide”, “asteroïde”. Mais qu’arriverait-il si, par exemple, le mot “astéroîde” apparaît ? Ce mot ne serait tout simplement pas pris en compte, et donc pas comptabilisé dans notre visualisation.
Vous le comprenez sans doute : une méthode basée sur une table de correspondances de ce type n’est pas la solution la plus fiable, car elle risque de ne pas prendre en compte toutes les manières possibles de mal écrire notre mot-clé avec les accents.
Quelle est la solution ?
La solution que nous adoptons dans ce contexte est beaucoup plus simple et 100% fonctionnelle : toutes les chaînes de caractères que notre processus algorithmique collecte, sont ensuite transformées en format ASCII.
Rappel : qu’est-ce-que l’ASCII ?
L’American Standard Code for Information Interchange (Code américain normalisé pour l’échange d’information), plus connu sous l’acronyme ASCII, est une norme informatique de codage de caractères apparue dans les années 1960. C’est la norme de codage de caractères la plus influente à ce jour. ASCII définit 128 codes à 7 bits, comprenant 95 caractères imprimables : les chiffres arabes de 0 à 9, les 26 lettres de l’alphabet latin en minuscules et en capitales, et des symboles mathématiques et de ponctuation. ASCII suffit pour représenter les textes en anglais, mais il est trop limité pour les autres langues, dont le français et ses lettres accentuées. Les limitations du jeu de caractères ASCII sont encore sensibles au xxie siècle, par exemple dans le choix restreint de caractères généralement offerts pour composer une adresse email.
(Source : Wikipedia)
L’ASCII est une des variantes de la norme ISO/CEI 646. Il est inclus dans plusieurs dizaines de normes couvrant plus de caractères, qui sont parfois informellement appelées ASCII étendu. Celles-ci peuvent être régionales (ISO/CEI 8859), nationales (GB 18030) ou internationales (Unicode). Avec l’avènement de la mondialisation et de l’internationalisation des systèmes d’information, les limitations de l’ASCII ne sont plus acceptées que dans des domaines techniques qui requièrent la compatibilité avec des protocoles de communication ou systèmes anciens.
Un exemple d’application de l’ASCII
Par exemple, le format ASCII de :
“Comme L’Équipe l’avait annoncé dans son édition de ce mardi, la présence d’Angel Di Maria à Barcelone, le 16 février, en Ligue des champions, est quasiment impossible et Mauricio Pochettino l’a confirmé en conférence de presse.”
est le suivant :
“Comme L’Equipe l’avait annonce dans son edition de ce mardi, la presence d’Angel Di Maria a Barcelone, le 16 fevrier, en Ligue des champions, est quasiment impossible et Mauricio Pochettino l’a confirme en conference de presse.”
Tous les accents dans les mots en gras (les seuls mots qui contenaient des accents dans notre exemple) ont été supprimés.
Mais techniquement, comment arriver à faire cela ?
Chez 10h11, nous travaillons notre développement algorithmique avec Python et R, sans aucun doute les deux langages leaders en Data Science. Pour simplifier, nous vous exposerons notre démarche en utilisant le langage R, qui peut également être aisément traduit et appliqué en Python.
Dans le package par défaut de R, nous retrouvons la fonction “iconv” qui sert à convertir une chaîne de caractères en differents encodages. Pour plus d’informations, vous pouvez visiter la documentation en ligne de cette fonction :
https://www.rdocumentation.org/packages/memisc/versions/0.99.27.2/topics/Iconv
Malheureusement, nous avons constaté à de nombreuses reprises des bugs dans l’output de cette fonction et nous avons donc préféré développer notre propre méthodologie de conversion en format ASCII.
Cette méthodologie s’appuie essentiellement sur deux fonctions :
la fonction “gsubfn” de la librairie R homonyme : https://www.rdocumentation.org/packages/gsubfn/versions/0.7/topics/gsubfn,
et la fonction “fr_to_ascii” décrite ci-dessous :
library(gsubfn)
fr_to_ascii = function(text){
#Correspondance entre lettre accentuées de la langue française
#et format ASCII
fr_ascii_list = list('à'='a','â'='a','æ'='a','ç'='c','è'='e',
'é'='e','ê'='e','ë'='e','î'='i','ï'='i',
'ô'='o','œ'='o','ù'='u','û'='u','ü'='u',
'ÿ'='y')
#Conversion du texte en minuscule
text_t = tolower(text)
#Conversion du texte en format ASCII
text_t = gsubfn(paste(names(fr_ascii_list), collapse='|'),
fr_ascii_list, text_t)
return(text_t)
}
Tout d’abord, on crée une liste d’objets qui contient tous les cas de lettres accentuées de langue française avec leur correspondance ASCII, toujours en minuscule (“fr_ascii_list”).
La fonction convertit le texte reçu en minuscule (fonction “tolower”, contenue dans le package de base de R).
Par l’application de la fonction “gsubfn”, notre fonction “fr_to_ascii” identifie et convertit chaque lettre accentuée avec sa correspondance ASCII.
De cette façon, nous nous ne posons plus la question de savoir si un utilisateur a écrit le mot astéroïde avec ou sans accents, ou même avec quel accent : dans tous les cas, le mot sera traité par notre algorithme en format ASCII, et donc toujours dans sa version non accentuée.