5e volet de notre série sur le text-mining avec R. Aujourd’hui, les expressions régulières.
Note — Ce billet fait partie d’une série de billets sur le text-mining avec R. Nous vous invitons à les consulter dans l’ordre :
– Premiers pas en text-mining avec R – Partie 1
– Premiers pas en text-mining avec R – Partie 2
– Premiers pas en text-mining avec R – Partie 3
– Premiers pas en text-mining avec R – Partie 4
Code complet
Retrouvez le code complet sur notre Github
Expressions régulières : késako ?
Posons les bases : qu’est-ce qu’une expression régulière ? Egalement appelée regex (pour regular expression), l’expression régulière est un motif syntaxique destiné à décrire de manière logique une unité de langage… autrement dit un ensemble régulier : un mot, une lettre, un chiffre, une répétition, etc.
L’utilité ? Pouvoir rechercher, manipuler et contrôler des chaines de caractères. Les expressions régulières sont par exemple utilisées lorsque vous vous inscrivez sur un site internet avec votre mail : le site internet vérifie que vous mail répond bien à l’expression régulière « mot@mot.mot ». Dans la pratique, un mail est bien plus complexe que cette simple suite, mais vous comprenez l’idée. La même chose s’applique pour les dates, les numéros de téléphone, les codes postaux, et (presque) tout ce qui est imaginable…
Regex et text-mining
Bon, c’est bien beau tout ça, mais quelle utilité pour le text-mining ? Une fois les expressions régulières maîtrisées, vous mettez dans votre besace un puissant outil de text-mining. Surtout que les regex sont pour la plupart agnostiques, c’est-à-dire indépendantes du langage de programmation. Vous souhaitez repérer toutes les occurrences de « un mot suivi de plus d’un point d’exclamation » ? Direction une regex. « Tous les mots de deux lettres » ? Direction une regex. Et ainsi de suite.
R et regex
Retour à notre langage de prédilection : R. Ce dernier vient avec deux librairies standards : les « extended regular expressions », et les « Perl-like », venant du langage du même nom.
R {base} repose sur le standard POSIX 1003.2, décrivant les éléments sous deux formes :
- Entre crochets [:xxx:], avec :
– [:alnum:] : tous les caractères alphanumériques. – [:alpha:] : les caractères alphabétiques uniquement, en majuscule et en minuscule. – [:blank:] : des caractères « blancs », types espace ou tabulation – [:cntrl:] : un caractère de contrôle – [:digit:] : un chiffre de 0 à 9 – [:graph:] : un caractère graphique, c’est-à-dire alphanumérique ou de ponctuation. – [:lower:] : un caractère en minuscule – [:print:] : un caractère imprimable – [:punct:] : une ponctuation : ! » # $ % & ‘ ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~. – [:space:] : un espace (tabulation, nouvelle ligne, retour chariot…) – [:upper:] : un caractère en majuscule – [:xdigit:] : un caractère du système hexadécimal : 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.
- En éléments de ponctuation, avec :
. : renvoie à n’importe quel caractère ^ : le caractère suivant est au début d’une chaine $ : le caractère suivant est en fin de chaine – ? : le caractère précédent est optionnel, et ne devra être trouvé qu’une seule fois – * : le caractère sera trouvé zéro fois ou plus – + : le caractère sera trouvé une fois ou plus – {n} : le caractère sera trouvé n fois – {n,} : le caractère sera trouvé au moins n fois {n,m} : le caractère sera trouvé entre n et m fois.
À noter que pour faire référence à ces éléments de manière littérale, il vous faudra les échapper en les précédant de \ — qui doit lui aussi être échappé. En clair, pour faire référence à un point, on utilisera » \. « .
R et les regex, par l’exemple
Et donc, en pratique, on fait comment ? Vous pouvez, par exemple, utiliser la fonction str_extract_all()
, du package {stringr}. Testons la sur un extrait aléatoirement tiré de Proust.
library(proustr) library(stringr) library(dplyr) proust <- proust_books() txt <- sample_n(proust, 1) %>% select(text) %>% unlist txt "Comme nous y rencontrions parfois M. Vinteuil, très sévère pour « le genre déplorable des jeunes gens négligés, dans les idées de l’époque actuelle », ma mère prenait garde que rien ne clochât dans ma tenue, puis on partait pour l’église. C’est au mois de Marie que je me souviens d’avoir commencé à aimer les aubépines. N’étant pas seulement dans l’église, si sainte, mais où nous avions le droit d’entrer, posées sur l’autel même, inséparables des mystères à la célébration desquels elles prenaient part, elles faisaient courir au milieu des flambeaux et des vases sacrés leurs branches attachées horizontalement les unes aux autres en un apprêt de fête, et qu’enjolivaient encore les festons de leur feuillage sur lequel étaient semés à profusion, comme sur une traîne de mariée, de petits bouquets de boutons d’une blancheur éclatante. Mais, sans oser les regarder qu’à la dérobée, je sentais que ces apprêts pompeux étaient vivants et que c’était la nature elle-même qui, en creusant ces découpures dans les feuilles, en ajoutant l’ornement suprême de ces blancs boutons, avait rendu cette décoration digne de ce qui était à la fois une réjouissance populaire et une solennité mystique. Plus haut s’ouvraient leurs corolles çà et là avec une grâce insouciante, retenant si négligemment comme un dernier et vaporeux atour le bouquet d’étamines, fines comme des fils de la Vierge, qui les embrumait tout entières, qu’en suivant, qu’en essayant de mimer au fond de moi le geste de leur efflorescence, je l’imaginais comme si ç’avait été le mouvement de tête étourdi et rapide, au regard coquet, aux pupilles diminuées, d’une blanche jeune fille, distraite et vive. M. Vinteuil était venu avec sa fille se placer à côté de nous. D’une bonne famille, il avait été le professeur de piano des sœurs de ma grand’mère et quand, après la mort de sa femme et un héritage qu’il avait fait, il s’était retiré auprès de Combray, on le recevait souvent à la maison. Mais d’une pudibonderie excessive, il cessa de venir pour ne pas rencontrer Swann qui avait fait ce qu’il appelait « un mariage déplacé, dans le goût du jour ». Ma mère, ayant appris qu’il composait, lui avait dit par amabilité que, quand elle irait le voir, il faudrait qu’il lui fît entendre quelque chose de lui. M. Vinteuil en aurait eu beaucoup de joie, mais il poussait la politesse et la bonté jusqu’à de tels scrupules que, se mettant toujours à la place des autres, il craignait de les ennuyer et de leur paraître égoïste s’il suivait ou seulement laissait deviner son désir. Le jour où mes parents étaient allés chez lui en visite, je les avais accompagnés, mais ils m’avaient permis de rester dehors, et comme la maison de M. Vinteuil, Montjouvain, était en contre-bas d’un monticule buissonneux, où je m’étais caché, je m’étais trouvé de plain-pied avec le salon du second étage, à cinquante centimètres de la fenêtre. Quand on était venu lui annoncer mes parents, j’avais vu M. Vinteuil se hâter de mettre en évidence sur le piano un morceau de musique. Mais une fois mes parents entrés, il l’avait retiré et mis dans un coin. Sans doute avait-il craint de leur laisser supposer qu’il n’était heureux de les voir que pour leur jouer de ses compositions. Et chaque fois que ma mère était revenue à la charge au cours de la visite, il avait répété plusieurs fois : « Mais je ne sais qui a mis cela sur le piano, ce n’est pas sa place », et avait détourné la conversation sur d’autres sujets, justement parce que ceux-là l’intéressaient moins. Sa seule passion était pour sa fille, et celle-ci, qui avait l’air d’un garçon, paraissait si robuste qu’on ne pouvait s’empêcher de sourire en voyant les précautions que son père prenait pour elle, ayant toujours des châles supplémentaires à lui jeter sur les épaules. Ma grand’mère faisait remarquer quelle expression douce, délicate, presque timide passait souvent dans les regards de cette enfant si rude, dont le visage était semé de taches de son. Quand elle venait de prononcer une parole, elle l’entendait avec l’esprit de ceux à qui elle l’avait dite, s’alarmant des malentendus possibles et on voyait s’éclairer, se découper comme par transparence, sous la figure hommasse du « bon diable », les traits plus fins d’une jeune fille éplorée." # Tous les Monsieur quelque chose # Ici, le pattern est M, un point (échappé avec \\), un espace, et un ou plusieurs str_extract_all(txt, pattern = "M. [:alpha:]*") [1] "M. Vinteuil" "M. Vinteuil" "M. Vinteuil" "M. Vinteuil" "M. Vinteuil" # Tous les mots de cinq lettres # Un espace, cinq caractères, un espace str_extract_all(txt, pattern = " [:alpha:]{5} ") [1] " genre " " idées " " garde " " Marie " " aimer " " droit " " elles " " elles " [9] " vases " " leurs " " semés " " comme " " avait " " cette " " digne " " était " [17] " leurs " " grâce " " comme " " atour " " fines " " mimer " " geste " " comme " [25] " jeune " " était " " fille " " bonne " " avait " " piano " " sœurs " " après " [33] " femme " " avait " " cessa " " venir " " Swann " " avait " " ayant " " avait " [41] " quand " " irait " " chose " " bonté " " place " " allés " " avais " " comme " [49] " était " " salon " " Quand " " était " " hâter " " piano " " doute " " jouer " [57] " était " " cours " " avait " " avait " " parce " " seule " " était " " avait " [65] " ayant " " jeter " " cette " " était " " Quand " " comme " " jeune " # Tous les mots avant une virgule str_extract_all(txt, pattern = "[:alpha:]+,") [1] "Vinteuil," "négligés," "tenue," "église," "sainte," [6] "entrer," "même," "part," "fête," "profusion," [11] "mariée," "Mais," "dérobée," "qui," "feuilles," [16] "boutons," "insouciante," "étamines," "Vierge," "entières," [21] "suivant," "efflorescence," "rapide," "coquet," "diminuées," [26] "fille," "famille," "quand," "fait," "Combray," [31] "excessive," "déplacé," "mère," "composait," "que," [36] "voir," "joie," "que," "autres," "visite," [41] "accompagnés," "dehors," "Vinteuil," "Montjouvain," "buissonneux," [46] "caché," "étage," "parents," "entrés," "visite," [51] "piano," "sujets," "fille," "ci," "garçon," [56] "elle," "douce," "délicate," "rude," "parole," [61] "dite," "éclairer," "transparence,"
Simple, n’est-ce pas ? À première vue, oui. Mais dans la pratique, trouver la bonne regex est parfois un véritable casse tête. Alors, à l’entrainement !
En lire plus :
Text Mining With R: A Tidy Approach
Text Mining: A Guidebook for the Social Sciences
Mining Text Data
Text Mining
Mastering Text Mining with R
Text Mining in Practice With R
Text Mining: From Ontology Learning to Automated Text Processing Applications
Text Mining: Classification, Clustering, and Applications
Phrase Mining from Massive Text and Its Applications
Text Mining: Applications and Theory
Rédigé par: Colin FAY
Créateur et rédacteur en chef de Data Bzh.