{proustr} 0.2.0 is on CRAN

9 minute(s) read

{proustr} 0.2.0 just hit the CRAN yesterday. Here’s the new stuffs just waiting for you.

About {proustr}

This package is designed to give you access to tools for Natural Language Processing in French, and (most importantly) to texts from Marcel Proust’s collection “A La Recherche Du Temps Perdu”. The idea behing {proustr} is to create an environmnet for doing text-mining in French, inside the tidyverse.

Here are the books in the package :

  • Du côté de chez Swann (1913): ducotedechezswann.
  • À l’ombre des jeunes filles en fleurs (1919): alombredesjeunesfillesenfleurs.
  • Le Côté de Guermantes (1921): lecotedeguermantes.
  • Sodome et Gomorrhe (1922) : sodomeetgomorrhe.
  • La Prisonnière (1923) :laprisonniere.
  • Albertine disparue (1925, also know as : La Fugitive) : albertinedisparue.
  • Le Temps retrouvé (1927) : letempretrouve.

Find your way into {proustr}

{proustr} is divided into two type of functions :

  • proust_*() functions return data objects (books, characters, stop words, random Proust extracts…)

  • pr_*() functions perform actions on the data. pr is short for p(roust)r, pr(oust), p(rocessing f)r(ench), or anything you can think of :). This shortcode refers to functions like pr_clean_punc().

proust_*() functions

proust_books()

Get the tibble with all the books :

library(proustr)
proust_books()
# A tibble: 4,690 x 4
                                                                                         text
 *                                                                                      <chr>
 1 "Longtemps, je me suis couché de bonne heure. Parfois, à peine ma bougie éteinte, mes yeux
 2 J'appuyais tendrement mes joues contre les belles joues de l'oreiller qui, pleines et fraî
 3 Je me rendormais, et parfois je n'avais plus que de courts réveils d'un instant, le temps 
 4 Quelquefois, comme Ève naquit d'une côte d'Adam, une femme naissait pendant mon sommeil d'
 5 Un homme qui dort tient en cercle autour de lui le fil des heures, l'ordre des années et d
 6 "Peut-être l'immobilité des choses autour de nous leur est-elle imposée par notre certitud
 7 Puis renaissait le souvenir d'une nouvelle attitude ; le mur filait dans une autre directi
 8 Ces évocations tournoyantes et confuses ne duraient jamais que quelques secondes ; souvent
 9 Certes, j'étais bien éveillé maintenant : mon corps avait viré une dernière fois et le bon
10 "À Combray, tous les jours dès la fin de l'après-midi, longtemps avant le moment  il fau
# ... with 4,680 more rows, and 3 more variables: book <chr>, volume <chr>, year <dbl>

proust_characters()

proust_characters returns a tibble with each characters from the books.

proust_characters()
# A tibble: 461 x 1
             perso
 *           <chr>
 1            A.J.
 2    Académicien 
 3        Adolphe 
 4      Agrigente 
 5      Agrigente 
 6            Aimé
 7 Albaret Céleste
 8          Albert
 9       Albertine
10           Albon
# ... with 451 more rows

proust_random()

If you need to create a quick example for your text-mining exercise, you can get your own Proust text with the proust_random() function. The number of lines you want to extract is controlled by the count argument. collaspe control wether or not you want a tibble back (default is FALSE).

proust_random()
[1] "M. de Norpois sourit avec un léger clignement d'œil, comme s'il s'agissait d'une concupiscence si naturelle qu'on ne pouvait en vouloir à celui qui l'éprouvait, presque d'un commencement de roman qu'il était prêt à absoudre, voire à encourager, avec une indulgence perverse à la Voisenon ou à la Crébillon fils. — Bien des mains de jeunes femmes seraient incapables de faire ce que j'ai vu là, dit le prince en montrant les aquarelles commencées de Mme de Villeparisis."

proust_random(2)

[1] "\" Et elle, quand ce même soir elle avait regardé autour d'elle : \" Dire que je ne verrai plus cette chambre, ces livres, ce pianola, toute cette maison, je ne peux pas le croire, et pourtant c'est vrai. J'ai à causer avec lui \", ajouta-t-elle en me montrant d'un air soumis."

proust_random(count = 2)

[1] "D'autre part, les gens qui rient si fort de ce qu'ils disent, et qui n'est pas drôle, nous dispensent par là, en prenant à leur charge l'hilarité, d'y participer. — D'autres assurent qu'il est froissé que je ne l'invite pas. C'est de grand cœur."

proust_random(count = 10)

[1] "À vrai dire, cette erreur des parents de M. Nous marcherons jusqu'à ce que j'aie trouvé un fiacre qui me convienne. — Vous vouliez me parler de quelque chose, Monsieur ? — Ah ! J'en eus presque le pressentiment en la voyant se hâter d'employer, en parlant, des images si écrites et qui me semblaient réservées pour un autre usage plus sacré et que j'ignorais encore. Cela me fait grand plaisir. dis-je à Andrée. — Oh ! Or, bien qu'il ne fût pas tourné de mon côté, j'étais persuadé qu'il m'avait vu ; tandis qu'il débitait quelque histoire à Mme Swann dont flottait jusque sur un genou du baron le magnifique manteau couleur pensée, les yeux errants de M. de Charlus, pareils à ceux d'un marchand en plein vent qui craint l'arrivée de la Rousse, avaient certainement exploré chaque partie du salon et découvert toutes les personnes qui s'y trouvaient. Mais aussi j'avais vu que ces cellules morales qui composent un être sont plus durables que lui. Je le sais par quelqu'un qui les a vues et qui m'a dit : \" Vous vous trouveriez mal si vous voyiez cela. Le grand plaisir d'être servi par des êtres rachitiques, portant binocle, dont le cas d'exemption se lit sur le visage ! Lucienne et Germaine sont dans le wagon et il y a justement encore de la place ; viens, on ira ensemble au skating \", et s'apprêtaient à lui présenter deux \" calicots \", leurs amants, qui les accompagnaient, quand, devant l'air légèrement gêné de Rachel, elles levèrent curieusement les yeux un peu plus loin, nous aperçurent et s'excusant lui dirent adieu en recevant d'elle un adieu aussi, un peu embarrassé mais amical."

proust_stopwords()

This function returns you a list of stopwords:

proust_stopwords()
# A tibble: 783 x 1
        words
 *     <fctr>
 1          a
 2      abord
 3 absolument
 4       afin
 5         ah
 6         ai
 7        aie
 8      aient
 9       aies
10   ailleurs
# ... with 773 more rows

proust_sentiments()

Sentiment lexicon is launched with:

proust_sentiments()
# A tibble: 14,127 x 2
              word polarity
 *           <chr>    <chr>
 1 à ce endroit  positive
 2       à le hâte negative
 3          à part negative
 4           à pic negative
 5      à rallonge negative
 6      abasourdir negative
 7        ablation negative
 8      abominable negative
 9          abrupt negative
10          absent negative
# ... with 14,117 more rows

You can chose between polarity (positive or negative, which is the default behavior), or a score on six sentiments (joy, fear, sadness, anger, surprise, disgust) with type = "score".

# A tibble: 11,530 x 3
          word sentiment score
 *       <chr>     <chr> <int>
 1 abaissement   sadness     1
 2    abaisser   sadness     1
 3     abandon      fear     1
 4     abandon   sadness     1
 5     abandon     anger     1
 6     abandon  surprise     1
 7  abandonner      fear     1
 8  abandonner   sadness     1
 9  abandonner     anger     1
10  abandonner   disgust     1
# ... with 11,520 more rows

pr_*() functions

Please bear in mind that all these functions are designed to work with a data.frame. Here’s an example with a book downloaded from the gutenberg project with {gutenbergr}

library(dplyr)
library(gutenbergr)
condillac <- gutenberg_download(gutenberg_id = "55483")

pr_detect_days()

Detects the days from a data.frame (in French).

pr_detect_days(condillac, text) %>% filter(n_days != 0)
# A tibble: 3 x 4
  gutenberg_id                                                                     text      days
         <int>                                                                    <chr>    <list>
1        55483 jeudi 27 décembre 1768. Mais il n'assistait guère aux séances et prenait <chr [1]>
2        55483    chapelle du château, il faisait célébrer l'office divin les dimanches <chr [1]>
3        55483    «L'abbé de Condillac partira lundi, écrivait Élisabeth à l'Infant, de <chr [1]>
# ... with 1 more variables: n_days <int>

pr_detect_months()

Detects the months from a data.frame (in French).

pr_detect_months(condillac, text) %>% filter(n_months != 0)
# A tibble: 57 x 4
   gutenberg_id                                                                     text    months
          <int>                                                                    <chr>    <list>
 1        55483                                  _morte à Puchesse, le 30 octobre 1896._ <chr [1]>
 2        55483      juillet 1701; ce sont Gabriel Bonnot, capitaine du château et de la <chr [1]>
 3        55483    1680. Il acquit le 28 septembre 1720, pour le prix de 120 000 livres, <chr [1]>
 4        55483 septembre 1714. Son enfance fut très maladive. Il avait atteint l'âge de <chr [1]>
 5        55483          de Rousseau, l'une de mars ou avril 1740 à M. d'Eybens, l'autre <chr [2]>
 6        55483                  du 1er mai 1740 à Mme la baronne de Warens, donnent ses <chr [1]>
 7        55483  Paris en janvier 1767. L'année suivante, l'abbé d'Olivet étant mort, il <chr [1]>
 8        55483 jeudi 27 décembre 1768. Mais il n'assistait guère aux séances et prenait <chr [1]>
 9        55483   1771. Le 28 avril 1773, l'abbé de Condillac lui fit don d'une somme de <chr [1]>
10        55483        le 31 juillet et se voyant perdu, il demanda un prêtre. Ce fut le <chr [1]>
# ... with 47 more rows, and 1 more variables: n_months <int>

pr_detect_pro()

Detects the pronouns from a data.frame (in French). The shortcuts in the pronoun col stand for :

  • pps: first person singular (première personne du singulier)
  • dps: second person singular (deuxième personne du singulier)
  • tps: third person singular (troisième personne du singulier)
  • ppp: first person plural (première personne du pluriel)
  • dpp: second person singular (deuxième personne du pluriel)
  • tpp: third person singular (troisième personne du pluriel)
condillac %>% 
  mutate(line = row_number()) %>%
  pr_detect_pro(text) %>% 
  select(-text) %>%
  arrange(line)
  
# A tibble: 2,248 x 4
   gutenberg_id  line pronoun count
          <int> <int>   <chr> <int>
 1        55483    46     pps     1
 2        55483    61     tps     1
 3        55483    62     tps     1
 4        55483    63     ppp     1
 5        55483    64     tps     2
 6        55483    65     tps     2
 7        55483    66     tps     1
 8        55483    70     pps     1
 9        55483    72     tps     1
10        55483    75     tps     2
# ... with 2,238 more rows

pr_normalize_punc()

French has a weird punctuation use. For example, quotes are « and », instead of ". Other strange characters may include ՚, or for apostrophe. This function removes most of the punctuation idiosyncracy you can find in a french text.

Why bother? Some text-mining tools perform a split with ', not with ՚, a behavior which can lead to some error when tokenizing a text.

pr_stem()

Turn your text into stems. This is an implementation of the {SnowballC} package in {proustr}.Please keep in mind that punctuation and capital letters are removed by this function.

You can stem a data.frame with a column containing sentences with pr_stem_sentences :

pr_stem_sentences(condillac, text) %>%
  filter(nchar(text) !=0)
# A tibble: 3,767 x 2
   gutenberg_id                                                        text
          <int>                                                       <chr>
 1        55483      not sur la transcript le erreur clair introduit par le
 2        55483                                    typograph ont été corrig
 3        55483 l'orthograph d'origin a été conserv et n'a pas été harmonis
 4        55483                                                   condillac
 5        55483                                                     illustr
 6        55483                                                   condillac
 7        55483                                         _sa vi sa philosoph
 8        55483                                              son influence_
 9        55483                                                         par
10        55483                               le comt baguenault de puchess
# ... with 3,757 more rows

You can also stem a data.frame containing a column of words with pr_stem_words.

Install proustr

Install this package directly in R :

install.packages("proustr")

From Github :

devtools::install_github("ColinFay/proustr")

Contact

Questions and feedbacks welcome!

You want to contribute ? Open a PR :) If you encounter a bug or want to suggest an enhancement, please open an issue.

What do you think?