Traitement de données alphanumériques avec R
Analytique et exploration de données | |
---|---|
Module: Tutoriels R | |
▲ | |
◀▬ | |
⚐ | ☸ intermédiaire |
⚒ 2014/12/16 | |
Prérequis | |
Traitement des données alphanumériques
Dans un premiers temps nous explorerons les fonctions de R permettant de manipuler les objets de nature numérique de manière élémentaire. Dans la deuxième partie de ce chapitre, nous présenterons des méthodes quantitatives pouvant être appliquée à l’analyse de discours. Si ce dernier sujet vous intéresse, lisez aussi Text mining avec R. Ci-dessous on ne s'intéresse qu'aux fonctionnalités standardes de R, mais pas aux extensions.
Importation de texte
En règle générale, on conseille d'utiliser les fonctions des paquets "text mining", car elle permettent (a) de lire un ensemble de fichiers dans une structure de données "corpus" et (b) d'appliquer certains filtres dès le départ. Toutefois pour des analyses simples on peut utiliser les fonctionalités de base.
scan
est une fonction flexible pour lire des données dans un vecteur.
Example:
#Lire un fichier caractère par caractère, et séparer le contenu ligne par ligne.
text.vector_char <- scan("http://edutechwiki.unige.ch/fmediawiki/api.php?action=parse&page=Civilization&format=xml",
what="character", sep="\n")
#Vérification
text.vector_char
readLines
lit un fichier ligne par ligne
#Lire un fichier ligne par ligne
text.vector_lines <- readLines("http://edutechwiki.unige.ch/fmediawiki/api.php?action=parse&page=Civilization&format=xml")
#Vérification
text.vector_lines
- Les 2 exemples donnent (en principe) le même résultat, car on a utilisé scan avec un séparateur de lignes:
scan ("...", sep="\n")
read.table
etread.csv
permettent de lire des text en format tabulaire- voir ci-dessous...
Manipulations de bas niveau
Concaténation
Pour concaténer, juxtaposer des chaînes de caractères utiliser la fonction paste() :
paste("Bonjour", "!!!") paste ("Bonjour", "!!!", sep = "_") paste ("Bonjour", "!!!", sep = "") x <- c("a", "b", "c") paste(x,x) paste(x,x, sep = "_") paste(x,x, collapse="++") paste(x,x, sep = "_", collapse="++")
Longueur des chaînes de caractères
Pour accéder à la longueur de chaînes utiliser la fonction nchar()
Texte1 <- "Bonjour!" nchar(Texte1, type = "chars") Texte2 <- c("Bonjour", "à", "vous", "tous", "!") nchar(Texte2, type = "chars")
Extraire/remplacer un segment de chaîne
La fonction substr() permet d’extraire un segment de chaîne à partir des attributs « start » et « stop » :
Texte3 <- c("ABCDEFGHI") substr(Texte3, start = 3, stop = 6) Texte4 <- c("ABCD", "EFGH", "ILMN", "OPQR") substr(Texte4, start = 2, stop = 3)
Les opérateurs d’assignation <- et -> permettent de remplacer des segments de chaîne :
substr(Texte3, start = 3, stop = 6) <- "@@@" Texte3 substr(Texte4, start = 2, stop = 3) <- "##" Texte4
La fonction substring() permet d’extraire un segment de chaîne à partir des attributs « first » et « last » :
Texte5 <- paste(LETTERS, collapse="") substring(Texte5, first = 2) Texte6 <- c("ABCD", "EFGHILMNOPQR") substring(Texte6, first = 2)
Les opérateurs d’assignation <- et -> permettent de remplacer des segments de chaîne :
substring(Texte5, first = 3, last = 6) <- "@@@" Texte5
Transformations sur une chaîne
La fonction tolower() permet de transformer une chaîne de caractère en minuscule :
tolower("BoNjoUr!") tolower(LETTERS)
La fonction toupper() permet de transformer une chaîne de caractère en majuscule :
toupper("BoNjoUr!") toupper(letters)
La fonction chartr() permet de remplacer des lettres dans une chaîne des caractères :
Texte7 <- "cHaInE BiZarRe" chartr(Texte7, old = "caE", new = "¦@#") # La lettre « c » est remplacée par le symbole ¦, la lettre « a » est remplacée par le symbole @ et la lettre « E » est remplacée par le symbole #.
Scinder une chaîne des caractères
La fonction strsplit() permet de diviser une chaîne de caractères :
Texte8 <- c("J'aime jouer au football", "Je n'aime pas jouer à hockey sur glace") strsplit(Texte8, split = " " , fixed = TRUE) strsplit(Texte8, split = "'" , fixed = TRUE) strsplit(Texte8, split = "a" , fixed = TRUE) strsplit(Texte8, split = c("o", "u"), fixed = TRUE)
L’output de la fonction strsplit() est représentée par une liste. Vous pouvez utiliser la fonction unlist() pour créer un vecteur contenant tous les éléments de la liste :
unlist(strsplit(Texte8, split = " " , fixed = TRUE))
Recherche et remplacement
Rechercher des pattern
La fonction grep() permet de rechercher les éléments d’une liste qui présentent un pattern donné
Texte9 <- c("argue", "sténo", "huons", "remet", "ponce", "mites", "ligie", "vitre", "fluée", "floué", "ahana", "fonte", "boche", "tinté", "frime", "tente", "cédez", "votif", "ligné", "acéré") grep(pattern = "a" , Texte9, value = FALSE, fixed = TRUE) # Donne les indices des éléments de Texte9 qui contiennent la lettre « a » grep(pattern = "a" , Texte9, value = TRUE, fixed = TRUE) # Donne les éléments de Texte9 qui contiennent la lettre « a »
Les expressions régulières
Il existe plusieurs symboles qui permettent de faciliter les recherches dans les chaînes de caractères. Il s’agit notamment de :
- ^ : début d’une chaîne
- $ : fin d’une chaîne
- . : tout caractère
- | : disjonction (ou)
- [] : ensemble de caractères à égaler
- [^]: ensemble de caractères à ne pas égaler
- \\ : permet de rechercher des caractères spéciaux (« ? », « $ », « ^ »,…)
- * : 0 fois ou plus l’expression concernée
- + : 1 fois ou plus l’expression concernée
- ? : 0 ou 1 fois l’expression concernée
- {n} : nombre d’apparition de l’expression concernée
- {n,}: l’expression concernée apparaît n fois ou plus
- {,n}: l’expression concernée apparaît n fois ou moins
- () : regroupement
Pour rechercher dans une chaîne de caractères des expressions régulières avec la fonction grep, il faut fixer l’attribut « fixed » à la valeur FALSE :
Texte9 <- c("argue", "sténo", "huons", "remet", "ponce", "mites", "ligie", "vitre", "fluée", "floué", "ahana", "fonte", "boche", "tinté", "frime", "tente", "cédez", "votif", "ligné", "acéré") grep(pattern = "^a", Texte9, value = TRUE, fixed=FALSE) # Donne les mots qui commencent par la lettre « a » grep(pattern = "e$", Texte9, value = TRUE, fixed=FALSE) # Donne les mots qui se terminent par la lettre « e » grep(pattern = "te", Texte9, value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence « te » grep(pattern = "n.e", Texte9 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence « n.e » grep(pattern = "na|ce" , Texte9 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence « na » ou la séquence « ce » grep(pattern = "n.e|c.e" , Texte9 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence « n.e » ou la séquence « c.e » grep(pattern = "[cdt]e" , Texte9 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence « ce » ou « de » ou « te » grep(pattern = "[^cdt]e" , Texte9 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la lettre « e » et qui ne présentent pas les séquences « ce », « de » et « te »
Texte10 <- c("ab","abc", "ababc", "ababab", "abababc" ,"bab","cbabab","abba","abbc","ca","abaabc", "ababbc", "acac") grep(pattern = "ab*c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : a(b)*c grep(pattern = "ab+c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : a(b)+ c grep(pattern = "ab?c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : a(b)? c grep(pattern = "ab{2}c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : abbc grep(pattern = "(ab)*c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : (ab)*c grep(pattern = "(ab)+c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : (ab)+ c grep(pattern = "(ab)?c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : (ab)? c grep(pattern = "(ab){2}c" , Texte10 , value = TRUE, fixed=FALSE) # Donne les mots qui contiennent la séquence : ababc
Remplacer des pattern
La fonction gsub() permet de rechercher et remplacer un pattern dans un objet alphanumérique :
Texte9 <- c("argue", "sténo", "huons", "remet", "ponce", "mites", "ligie", "vitre", "fluée", "floué", "ahana", "fonte", "boche", "tinté", "frime", "tente", "cédez", "votif", "ligné", "acéré") gsub(pattern = "o" , replacement = "O" , Texte9, fixed = TRUE) gsub(pattern = "e" , replacement = "E" , Texte9, fixed = TRUE)