Traitement de données alphanumériques avec R

De EduTech Wiki
Révision datée du 16 décembre 2014 à 18:48 par Daniel K. Schneider (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche
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 et read.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)