---
title: "LRFAF : une exploration lexicométrique du rap français depuis 1990"
author:  "Benoît de Courson ^[Max Planck Institute for the Study of Crime, Security and Law, Freiburg im Breisgau, Germany]"
date: "2024-02-05"
header-includes:
  #- \usepackage[style=french]{csquotes}
  #- \DeclareQuoteStyle[guillemets]{french}
  - \RequirePackage[frenchb]{babel}
  - \RequirePackage[babel,french=guillemets]{csquotes}
  - \MakeOuterQuote{"}
  - \frenchspacing
  #- \DeclareQuoteStyle[sverre]{french}{\textquotedblleft}{\textquotedblright}{\textquoteleft}{\textquoteright}
  #- \ExecuteQuoteOptions{french=sverre}
  - \usepackage[figuresright]{rotating}
  - \usepackage{lscape}
  - \usepackage{enumerate}   
  - \usepackage{ebgaramond}
  - \usepackage{epigraph}
  - \newcommand{\beginsupplement}{\setcounter{table}{0}  \renewcommand{\thetable}{S\arabic{table}} \setcounter{figure}{0} \renewcommand{\thefigure}{S\arabic{figure}}}
output:
  pdf_document: 
    latex_engine: xelatex
    number_sections: true
bibliography: biblio.bib
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)

```

```{r load, include=FALSE}
library(dplyr)
library(ggplot2)
library(showtext)
library(janitor)
library(tokenizers)
library(stringr)
library(RTextTools)
library(tidyr)
library(dplyr)
library(cowplot)
library(plotly)


corpus = read.csv("~/LRFAF/corpus.csv")
#results = read.csv("~/LRFAF/data_aggregated/results_rappeurs.csv")
#row.names(results) = results$rappeur
#results_filtered = read.csv("~/LRFAF/data_aggregated/results_rappeurs_filtered.csv")
#row.names(results_filtered) = results_filtered$rappeur
#results_year = read.csv("~/LRFAF/data_aggregated/results_year.csv")
sysfonts::font_add_google("EB Garamond")
theme_set(theme_minimal(base_family = "EB Garamond"))
showtext_auto()
#theme_set(theme(text = element_text( family="EB Garamond")))

get_complexity = function(text,n_words="none",return_mean=TRUE,tail=FALSE){
  words = tokenize_words(str_replace_all(text,"'|’"," "),simplify = TRUE)
  if(n_words == "none"){n_words = length(words)}
  if(tail){words = tail(words, n_words)
  }else{words = words[1:n_words]}
  if(return_mean){
  return(c(mean(nchar(words),na.rm=T),length(unique(words))))
  }else{return(length(unique(words)))}
}

measure_lexicons = function(df){
  return(df %>% summarise(
    birthdate_artist = mean(birthdate_artist),
    age_artist = mean(age_artist),
    profanity = sum(n_profanity),
    negative = sum(n_negative),
    positive = sum(n_positive),
    verlan = sum(n_verlan),
    onomatopee = sum(n_onomatopee),
    je = sum(n_je),
    french = sum(n_french_words),
    sexe = sum(n_sexe),
    argot = sum(n_argot),
    n_words =sum(n_words))%>% 
    mutate(profanity = profanity/n_words,
           negative = negative/n_words,
           positive = positive/n_words,
           positivity_ratio = positive/negative,
           verlan = verlan/n_words,
           onomatopee = onomatopee/n_words,
           je = je/n_words,
           sexe = sexe/n_words,
           argot = argot/n_words,
           french = french/n_words)
  )}



```

```{=tex}
\begin{flushright}
{\itshape
Le temps passe et passe et passe, et beaucoup de choses ont changé\\
Qui aurait pu s'imaginer que le temps serait si vite écoulé ?\\
(On fait l'bilan)\\  
Calmement\\
En s'remémorant chaque instant}

(Nèg' Marrons, 2000)
\end{flushright}
```
# Introduction

\enquote{Ma qualité de lyrics est quantifiable}, affirmait le rappeur Médine dans *Bangerang* [@medineMedineBangerang2018] Simple provocation peut-être, et il convient de toute façon de se garder de tout jugement de valeur en sciences sociales - en particulier lorsque l'on touche aux goûts et aux couleurs. Cependant, les lyrics - le mot étant lexicalisé dans le milieu du rap, on se permettra cet anglicisme - constituent des donneés textuelles. A ce titre, elles peuvent se prêter à la lexicométrie de la même façon que des corpus de presse ou la littérature.

Il n'existe à ce jour, et à notre connaissance, pas de large corpus ouvert de rap français. Depuis 2009, des chercheurs de l'Université Masaryk de Brno mènent le projet RapCor et rassemblent des textes de rap français [@podhorná-polická2020]. Mais le corpus n'est ni ouvert, ni massif. Il contient à ce jour 1300 titres, soit environ l'équivalent de la production totale du seul rappeur JuL. Ce choix de privilégier la qualité à la quantité convient à l'ambition sociolinguistique du corpus et à l'étude des négologismes, mais pas à des études statistiques. Dans le champ universitaire, les autres études quantitatives que nous avons trouvées reposent sur des petites bases de données, courageusement renseignées à la main [@hammou2008 ; @hammou2009].

Pendant ce temps, des petites mains transcrivent massivement les textes de leurs idoles sur le site collaboratif Genius. Les erreurs des uns sont corrigées par les autres, et le résultat s'avère, au bout de 15 ans, très satisfaisant. Bien qu'étant une entreprise à but lucratif revendiquant une propriété intellectuelle sur les textes, Genius offre un accès aisé à ses données à travers son API à qui sait programmer. Celles-ci ont été utilisées dans de nombreux projets hors de France [par exemple : @meinecke2021; @baltazar2020; @kryva2019]. Concernant le rap français, des chercheurs se constituent manifestement des corpus massifs [en particulier @klimentová2022], tout comme les blogueurs spécialisés (voir par exemple l'ambitieuse infographie de @rapminerz2023). Mais ces corpus dorment dans les disques durs de leurs collectionneurs, ou au mieux, et on l'espère, sont passés sous le manteau à l'occasion. En cause, probablement, la crainte d'une violation du droit d'auteur. 

En juin 2023, Genius a pourtant perdu son procès contre Google, qu'il accusait de piller ses données pour les afficher sur son moteur de recherche. La Cour suprême des Etats-Unis a conclu que ces données appartenaient aux artistes eux-même et non à Genius. D'un point de vue éthique, ces données sont produites par des petites mains bénévoles. Il semble donc naturel de les rendre réutilisables pour un usage non commercial - comme le sont les données de Wikipédia, produites de la même façon. Pour le dire de façon très caricaturale, ces données viennent doublement du peuple : des rappeurs d'une part, qui ont \enquote{pour pierre angulaire la pratique d'un art populaire} [@médine2012], et d'autre part d'une multitude de passionnés, qui ont offert leur temps libre et leur oreille affutée pour transcrire ces textes. Il nous a donc semblé naturel de les \enquote{rendre au peuple} en publiant ce corpus. Parce que l'auteur trouve la formule de @médine2022 désarmante, nous l'avons baptisé \enquote{LRFAF}, pour \enquote{Le rap français aux Français} (ou aux francophones, si l'on veut sacrifier la rime pour plus d'inclusivité). L'auteur en profite pour s'excuser d'avance pour la monochromie de ses exemples, où l'on devinera ses tropismes musicaux.

Concrètement, nous mettons à disposition trois sources et outils :

-   Le corpus à proprement parler, soit `r nrow(corpus)` textes en format csv, avec pour métadonnées l'artiste, l'album, l'URL Genius et deux mesures de la popularité du titre : le nombre de vues de la page (renseigné à partir de 5 000) et le nombre de contributeurs. A l'aide de l'outil Bunka, les titres ont enfin été classés en 6 grands *topics*, ce sur quoi nous reviendrons. Il est disponible à cette addresse : <https://huggingface.co/datasets/regicid/LRFAF>, et téléchargeable directement à cette adresse : <https://huggingface.co/datasets/regicid/LRFAF/resolve/main/corpus.csv?download=true>.

-   Une batterie de mesures - que nous détaillerons dans cet article, pour chaque titre. Il est facile d'en extraire des mesures par rappeur ou par année. C'est ce que fait cet article, qui est écrit en R Markdown. Le code qui produit les analyses entre les lignes est disponible.

-   Les fréquences annuelles d'occurrences de chaque mot et groupe de mots (jusqu'à trois mots) sont explorables sur l'application interactive Gallicagram, à cette adresse : <https://shiny.ens-paris-saclay.fr/app/gallicagram>. Pour plus de détails sur le projet, voir @azoulay et @courson2023.

Cet article se propose un premier défrichage du corpus, à une échelle macroscopique. Il insistera sur l'approche diachronique, et sur les tendances lourdes d'évolution du rap français depuis le milieu des années 1990. Il se place dans une approche ouvertement *data-driven* : plutôt que de chercher à répondre à une question préexistante à l'étude, l'auteur a farfouillé dans les données et cherché ce que l'on peut y mesurer, dans l'espoir d'obtenir des résultats éclairants. Il nous semble pouvoir affirmer que la moisson fut bonne.

# La collecte des données

```{r echo=FALSE,fig.cap="Volume de données par an, entre 1990 et 2023",message=FALSE}
library(ggplot2)
c_year = filter(corpus,year %in% 1990:2023) %>% group_by(year) %>% measure_lexicons()


c_year_topic = filter(corpus,year %in% 1990:2023) %>% group_by(year,topic_clean) %>% measure_lexicons() %>% filter(n_words > 1000)

ggplot(c_year,aes(year,n_words)) + geom_area() + xlab("Année") + ylab("Volume du corpus (en mots)")

```

Décrivons d'abord brièvement le processus de constitution du corpus. Genius n'a malheureusement pas d'arborescence, qui aurait pu nous permettre de recenser en amont les rappeurs français. Ce qui s'en approche le plus est la (page des comptes vérifiés de rappeurs français)[<https://genius.com/Genius-france-liste-des-comptes-verifies-de-rappeurs-francophones-lyrics>], qui recense ceux qui sont actifs sur Genius. Cette page n'est pas exhaustive (il y manque par example IAM, PNL et Stupeflip). Elle contient aussi les rappeurs belges Damso, Hamza, Roméo Elvis, Scylla et Caballero que nous avons gardé de bon cœur. Nous l'avons donc croisé avec les catégories Wikipedia suivantes : \enquote{rappeuse française}, \enquote{rappeur français} et \enquote{groupe français de hip hop} (le rap étant ici subsumé dans le hip hop). Nous avons aussi employé l'outil query de Wikidata, pour lui demander les mêmes catégories. Après quelques corrections et ajouts manuels, par exemple pour préciser qu'on s'intéresse au groupe français Assassin et non à l'un de ses multiples homonymes, on arrive à 822 rappeurs. Certains sont aux frontières du rap, voire au-delà de cette frontière. C'est le cas du groupe Thérapie Taxi classé en \enquote{groupe de hip-hop} par Wikipédia. Nous avons choisi de garder, puisque ses résultats extrêmes sur nos métriques permettent d'entrevoir le contraste entre le rap et les autres genre de musique.

Nous avons ensuite injecté cette liste dans le formidable outil LyricsGenius, codé par John W. Miller. Après avoir filtré les textes en langue étrangère, il nous reste `r nrow(corpus)` textes, issus de `r length(unique(corpus$artist))` artistes. Certains rappeurs répertoriés sur Wikipedia n'ont pas de textes dans Genius, et d'autres sont manqués par le moteur de recherche Genius. A l'œil nu, nous n'avons remarqué l'absence d'aucun nom majeur du rap français, à part le groupe ATK, présent sur Genius mais introuvable par l'API. Nous avons aussi remarqué l'absence du titre \enquote{Ma Benz}, malencontreusement répertorié comme étant en langue anglaise. Ce genre de loupé est inévitable avec notre approche, et il vaut mieux manquer quelques titres que polluer le corpus avec des textes en langue étrangère.

Notons que la méthode d'extraction serait aisément déclinable à d'autres genres : il existe aussi des catégories de \enquote{chanteurs français} sur Wikipedia, et l'on trouve aussi les textes de Georges Brassens sur Genius. Cependant, il nous a semblé qu'il faut savoir arrêter sa gourmandise. Le code qui a servi à l'extraction est bien sûr à la disposition de quiconque aimerait appliquer le procédé sur un autre genre.

# Analyse

## Que mesurer ?

### Mesurer la fréquence de lexiques

Nous voici face à un petit océan textuel, d'un peu plus de 21 millions de mots. Une première idée vient à l'esprit : y compter les occurrences de n'importe quel mot. \enquote{Statistique(s)} y apparaît ainsi 131 fois. C'est peu, et l'on peut déplorer un certain dédain des rappeurs pour les approches quantitatives - \enquote{J'suis qu'une statistique pour la place Beauvau}, rappait @médine2015 dans Speaker Corner. Mais avouons-le : ce n'est pas très intéressant. Il est déjà plus instructif de chercher d'où proviennent ces occurrences. En quelques lignes de code, on apprend que 9 d'entre elles viennent du duo Biglo & Oli, suivi par IAM et Sopico avec 4 utilisations chacun. Une série temporelle de l'utilisation par année donne un résultat peu interprétable, que nous n'osons reproduire ici. On touche ici à un premier problème : bien qu'étant aussi large que possible, notre corpus n'est pas assez gros pour ce genre d'approche. On risque à chaque fois de n'avoir qu'une poignée de résultats, et ne pas pouvoir séparer le signal du bruit. A titre de comparaison, le corpus formé par les archives du journal *Le Monde* contient 1,5 milliard de mots au total, soit en moyenne 20 millions de mots par an. C'est environ le volume nécessaire pour obtenir des résultats interprétables en diachronie. Il va nous falloir ruser, et choisir soit des mots fréquents (\enquote{je}), soit de larges lexiques récupérés ailleurs, de sorte à mesurer par exemple la fréquence de mots en verlan, ou la fréquence d'adverbes. Cela nous permet aussi d'éviter l'écueil du choix arbitraire du mot étudié, et le risque d'en essayer plusieurs avant de choisir celui qui reflète le mieux les préconceptions du chercheur. Pour cette étude, nous avons choisi les lexiques suivants :

-   Les pronoms \enquote{je} (et sa variante \enquote{j'}, particulièrement utilisé dans le rap)).

-   Un grand lexique de mots en français, aussi exhaustif que possible, pour mesurer la proximité du texte avec un français académique. Nous avons choisi Morphalou, développé par l'Atilf, car sa taille dépasse de loin celui de la base Lexique.org.

-   Trois lexiques du verlan, de l'argot et de la sexualité, récupérés sur le Wiktionnaire : <https://fr.wiktionary.org/wiki/Cat%C3%A9gorie:Verlan>, <https://fr.wiktionary.org/wiki/Annexe:Liste_de_termes_argotiques_en_fran%C3%A7ais>, <https://fr.wiktionary.org/w/index.php?title=Cat%C3%A9gorie:Lexique_en_fran%C3%A7ais_de_la_sexualit%C3%A9>

-   Une liste d'insultes trouvée sur Github, initialement développée pour modérer les contenus haineux sur internet, elle-même basée sur le Wiktionnaire : <https://github.com/MauriceButler/badwords>. Nous y avons adjoint le mot anglais \enquote{fuck}, très utilisé en rap français.

-   De larges lexiques de mots positifs et négatifs, développés pour l'analyse de sentiments dans le project LIWC [@piolat2011]. Ils ont pour but de mesurer la tonalité, sombre ou joyeuse, des lyrics.

### Mesurer la complexité et la diversité du discours

Sans faire appel à des lexiques extérieurs, nous avons aussi cherché à mesurer la complexité et la diversité du discours, à travers deux \enquote{proxys}. D'abord, la longueur moyenne des mots employés, souvent utilisé en traitement automatique du langage comme une mesure de la complexité du discours [@biran2011; @gala2014], car elle semble empiriquement refléter leur complexité conceptuelle perçue par les receveurs [@lewis2016, @bonvin2019].

Ensuite, nous avons cherché à mesurer la richesse du vocabulaire employé. Le plus naturel ici est de compter le nombre de mots différents\footnote{Ici, nous avons considéré l'apostrophe comme un espace, afin d'éviter que \enquote{j'suis} soit considéré comme un nouveau mort par rapport à \enquote{je suis}. Le mot \enquote{aujourd'hui} est donc scindé en deux. Les apostrophes au milieu du mot étant rares en français, ce n'est pas un drame. Le même problème se pose pour une contraction comme \enquote{p'tit} ou \enquote{v'là}.}. Le problème immédiat est que cette mesure est fort sensible au volume de textes étudiés : plus un rappeur écrit de textes, plus il \enquote{découvrira} de nouveaux mots. Or, les variations sont considérables, et le sous-corpus formé par les textes de JuL est par exemple 13 fois plus gros que celui de Lino. Si l'on divise par le nombre total de mots, pour calculer le taux de mots différents dans les lyrics - une mesure appelée le *type-token ratio* - alors le problème s'inverse : plus un rappeur rappe, et plus il a de chances de se répéter, ce qui le pénalise sur cette mesure. Ces problèmes sont bien connus des psycholinguistes [@daller2003; @bonvin2019]. Une rustine couramment utilisée est de ne prendre en compte qu'un nombre fixé de mots par rappeur, ce qui contraint tous les sous-corpus à avoir la même taille. C'est le choix qu'à fait @rapminerz2023 dans son infographie, en se limitant aux 7000 derniers mots de chaque artiste. Cela pose cependant des choix cornéliens : 7000 mots, c'est fort peu pour une mesure comme le nombre de mots uniques. Ci-dessous, la Figure 2 présente le résultat de cette opération répétée 1000 fois sur Roff et sur Médine, en prenant chaque fois des textes différents.

```{r echo = FALSE, fig.cap="Graphique de densité de l'estimation de la diversité lexicale de Médine et Rohff en prenant 7000 mots issus de textes choisis aléatoirement, et en répétant l'opération 1000 fois"}
library(tokenizers)
library(tidyr)
div = list()
for(rappeur in c("Médine","Rohff")){
  text = corpus$lyrics[corpus$artist==rappeur]
  div[[rappeur]] = c()
  for(i in 1:100){#Change to 1000
    text = sample(text,length(text))
    words = unlist(tokenize_words(tolower(text)))
    div[[rappeur]] = c(div[[rappeur]],length(unique(words[1:7000])))
  }
}
d = data.frame(Médine = div$Médine,Rohff = div$Rohff)
d = gather(d,"Rappeur","Diversité")
ggplot(d,aes(x=Diversité,fill=Rappeur)) + geom_density(alpha=.5) + ylab("Densité")
```

```{r measure_by_rappers, include=FALSE}
lyrics = corpus %>% group_by(artist) %>% summarise(lyrics = paste(lyrics,collapse="\n"))

results_rappeurs = corpus %>% group_by(artist) %>% 
  summarise(n_total_words = sum(n_words),
            pageviews_2 = sum(pageviews_2,na.rm=T),year = mean(year,na.rm=T))
z = corpus %>% group_by(artist) %>% measure_lexicons()
results_rappeurs = left_join(z,results_rappeurs,by="artist")

results_rappeurs[c("means_word_length","n_unique_words")] = do.call(rbind, lapply(lyrics$lyrics,get_complexity))
results_rappeurs["n_unique_words_7000"] = do.call(rbind, lapply(lyrics$lyrics,get_complexity,return_mean=FALSE,n_words=7000))

results_rappeurs$diversity_residuals = lm(log(results_rappeurs$n_unique_words)~log(results_rappeurs$n_total_words))$residuals
results_rappeurs$diversity_residuals_2 = lm(log(results_rappeurs$n_unique_words)~log(results_rappeurs$n_total_words) + I(log(results_rappeurs$n_total_words)^2))$residuals

#results_with_year = rbind(results_filtered,results_year[-44])
topics_rappeurs = corpus %>% group_by(artist) %>% summarise(
  conscient = sum(topic_clean=="Rap conscient"),
  egotrip = sum(topic_clean=="Egotrip/Méta-rap"),
  gangsta = sum(topic_clean=="Gangsta rap"),
  coquin = sum(topic_clean=="Rap coquin"),
  poesie = sum(topic_clean=="Rap poétique"),
  hardcore = sum(topic_clean=="Rap hardcore/Drill"),
  amour = sum(topic_clean=="Chansons d'amour")
)
topics_rappeurs[-1] = topics_rappeurs[-1]/rowSums(topics_rappeurs[-1])
topics_rappeurs[-1] = log(topics_rappeurs[-1]/(1-topics_rappeurs[-1])+.01)
#Add a minimum of 1% in topic to avoid infinite


results_rappeurs_with_topics = left_join(topics_rappeurs,results_rappeurs,by="artist")
results_rappeurs_with_topics$profanity_log = log(results_rappeurs_with_topics$profanity)
results_rappeurs_with_topics$verlan_log = log(results_rappeurs_with_topics$verlan)
results_rappeurs_with_topics$sexe_log = log(results_rappeurs_with_topics$sexe)
```

Il est clair qu'en moyenne, Médine a une diversité lexicale supérieure à Rohff, d'environ 10%. Mais l'algorithme arrive au résultat inverse dans `r 100*(mean(div$Rohff>div$Médine) %>% round(2))`% des cas. En augmentant fortement le nombre de mots pris en compte (disons 25 000), on tombe tout juste sous les 5% d'erreurs. Mais on est alors contraint de laisser de côté des rappeurs comme Gaël Faye, qui n'a que `r sum(filter(corpus,artist=="Gaël Faye")$n_words)` mots dans son escarcelle. Se pose en plus question du choix de l'échantillon : si @rapminerz2023 a choisi de prendre les derniers textes publiés, nous verrons plus tard que la diversité lexicale n'est pas stable au fil de la carrière d'un rappeur. Bref, cette méthode suppose des choix cornéliens, ainsi que de jeter, dans le cas du seuil à 25 000 mots, `r  100 - (100*(25000*sum(results_rappeurs$n_total_words>= 25000))/sum(results_rappeurs$n_total_words)) %>% round()`% des mots du corpus aux oubliettes, au prix d'un plus grand bruit statistique. Nous avons calculé cette mesure pour les rappeurs suffisamment dotés, mais avons quelques réserves.

```{r fig_diversity, echo=FALSE,warning=FALSE,message=FALSE,fig.cap="Nombre de mots unique par rappeur selon le nombre de mots prononcé, en échelle linéaire (A) et logarithmique (B)"}
library(cowplot)
a = ggplot(results_rappeurs,aes(n_total_words,n_unique_words)) + geom_point() + xlab("Nombre de mots par rappeur") +
  ylab("Nombre de mots différents par rappeur") 
b = ggplot(results_rappeurs,aes(log(n_total_words),log(n_unique_words))) + geom_point() +  xlab("Nombre de mots par rappeur (log)") +
  ylab("Nombre de mots différents par rappeur (log)") + geom_smooth(method="lm",se=F) + geom_smooth(method="lm",se=F,formula = y ~ poly(x, 3, raw=TRUE),linetype="dashed")

plot_grid(a,b,labels = c("A","B"))
```

Revenons au corpus complet, sans échantillonner. De fait, si l'on affiche dans un nuage de points le nombre de mots différents par rappeur selon le nombre de mots qu'ils ont prononcé, (Figure 3A), on observe comme prévu une relation concave : la croissance du vocabulaire décélère à mesure que l'artiste produit, et se répète fatalement. Cependant, si l'on place ces deux variables sur une échelle logarithmique, une relation manifestement linéaire apparaît. Ce n'est pas non plus une vraie surprise : la loi empirique de Heap, connue depuis les années 1960, assure que la diversité vocabulaire employé croît de façon polynomiale avec la taille du corpus en mots, c'est à dire $Kn^\alpha$, où $K$ est une constante, $n$ le nombre total de mots et $\alpha$ un exposant, communément situé entre 0,4 et 0,6 - ici estimé à `r lm(log(results_rappeurs$n_unique_words)~log(results_rappeurs$n_total_words))$coefficients[2] %>% round(2)`, ce qui témoigne de la grande inventivité lexicale du rap. Cette linéarité sur l'échelle logarithmique est une nouvelle formidable : elle signifie qu'on pourrait en théorie \enquote{contrôler} pour le volume du corpus avec une banale régression linéaire. Formellement, on pourrait prendre les \enquote{résidus} du modèle linéaire représenté par la ligne bleue de la Figure 3B - la distance verticale à cette ligne - comme mesure de la richesse lexicale. Nous avons aussi effectué cette mesure, cette fois pour tous les rappeurs. La corrélation avec la mesure sur corpus de taille fixe est très forte ($r =$ `r cor.test(results_rappeurs$n_unique_words_7000,results_rappeurs$diversity_residuals)$estimate %>% round(2)`), mais on la présume plus précise. On remarque cependant en haut à droite de la Figure 3B un point qui décroche de cette ligne. On devine le rappeur JuL, ses 37 albums et son freestyle de 43 minutes - un temps le record de France - intégralement retranscrit dans Genius. Cet écart à la valeur prédite ne semble pas authentique : JuL se classe `r rank(-results_rappeurs$n_unique_words_7000)[which(results_rappeurs$artist=="JuL")] %>% round()`ème avec la première méthode, et `r rank(-results_rappeurs$diversity_residuals)[which(results_rappeurs$artist=="JuL")]` avec la seconde, soit proche de la dernière place. Il semble que la loi de Heap soit violée par le volume considérable de sa production. La loi de Heap est connue pour ne pas fonctionner sur des corpus trop gros : elle prédirait que le nombre de mots unique tende vers l'infini comme tout bon polynôme de degré positif, ce qui est impossible. Il semble que JuL soit pénalisé car il a, à force de rapper, atteint le plafond de tous les mots qu'il pouvait prononcer. Le même phénomène semble affecter, dans une moindre mesure, les autres rappeurs très productifs : Guizmo, la Fouine et les groupes Sexion d'Assaut et surtout IAM, qui chute de la `r rank(-results_rappeurs$n_unique_words_7000)[which(results_rappeurs$artist=="IAM")] %>% round()`ème place à la `r rank(-results_rappeurs$diversity_residuals)[which(results_rappeurs$artist=="IAM")] %>% round()`ème . Plus généralement, on devine une légère concavité dans la Figure 3B. Il est possible de la prendre en compte en appliquant une régression non pas linéaire, mais quadratique. Graphiquement, le résultat est presque le même. Mais elle semble mieux rendre compte de la relation entre nombre de mots et nombre de mots uniques : dans un test du rapport de vraisemblance, le modèle quadratique domine clairement le modèle linéaire ($p < 10^{-4}$). La corrélation avec la première mesure s'en trouve améliorée ($r =$ `r cor.test(results_rappeurs$n_unique_words_7000,results_rappeurs$diversity_residuals_2)$estimate %>% round(2)`) et justice est mieux rendue à JuL et IAM, qui remontent respectivement à la `r rank(-results_rappeurs$diversity_residuals_2)[which(results_rappeurs$artist=="JuL")] %>% round()`ème et à la `r rank(-results_rappeurs$diversity_residuals_2)[which(results_rappeurs$artist=="IAM")] %>% round()`ème place. Nous garderons donc cette mesure dans la suite, sous le nom de \enquote{diversité lexicale}, car elle nous semble la plus raisonnable. Cette mesure n'est cependant pas parfaite, et nous invitons le lecteur à garder en tête le risque de biais pour les rappeurs les plus productifs.

Pour vérifier que nos mesures sont raisonnables, on peut visualiser les résultats par rappeur. La Figure 4 présente le score sur nos deux dimensions des 200 rappeurs les plus vus, avec la taille dépendant du nombres de vues. Ce graphique étant quelque peu surchargé, une version interactive, zoomable et explorable, est disponible en ligne à cette adresse : <https://regicid.github.io/complexity_rappers>.

```{r echo=FALSE,fig.cap="Profil de complexité pour les 200 rappeurs les plus vus. Ceci n'est pas une mesure de qualité, mais d'orientation artistique",out.width="120%",fig.align = 'center'}
top_rappers = head(results_rappeurs$artist[order(-results_rappeurs$pageviews_2)],200)
results_200 = filter(results_rappeurs,artist %in% top_rappers)
results_200 =results_200[-which(results_200$artist=="Therapie TAXI"),] 

plot = ggplot(data=results_200,aes(means_word_length,diversity_residuals_2,label=artist,size=pageviews_2)) + 
  geom_text(family = "EB Garamond") + theme_minimal() + xlab("Longueur moyenne des mots (en lettres)") +
  ylab("Diversité lexicale (sur 30000 mots)") +
  scale_size_continuous(range = c(1, 7),guide = "none") +
 theme_minimal(base_size = 15, base_family = "EB Garamond")

htmlwidgets::saveWidget(ggplotly(plot),"~/regicid.github.io/complexity_rappers.html")
print(plot)
```

La forte corrélation entre nos deux métriques ($r=$ `r cor.test(results_200$diversity_residuals_2,results_200$means_word_length)$estimate %>% round(2)`) est fort rassurante : nos deux mesures semblent bien saisir une qualité commune. Qualitativement, il semble que l'on retrouve bien en haut à droite les rappeurs à texte, ou \enquote{lyricistes}. On pourrait aussi analyser le déséquilibre entre les deux dimensions : Stupeflip semble employer des mots complexes (les \enquote{Argémiones}, \enquote{Pétaouchnok}) [@stupeflip2011] mais relativement répétitifs. Cela renvoie au côté obsessionnel du groupe, résumé dans La Menuiserie : \enquote{Prendre des petits bouts de trucs/Prendre, prendre/Prendre des petits bouts de trucs et puis me les assembler ensemble} [@stupeflipMenuiserie2011].

Nous avons aussi mesuré la diversité lexicale par année plutôt que par rappeur. Dans ce cas, nous ne disposons que de 30 points de données, ce qui est insuffisant pour calibrer finement une régression. Mais on dispose aussi de bien davantage de mots par points de données. A partir de 1995, chaque année (sauf 1996) contient plus de 100 000 mots, ce qui, on l'a vu, permet une estimation assez fiable. On utilisera donc la première méthode ici, en prenant 100 000 mots issus de textes aléatoirement choisis dans l'année.

### Reconstituer les genres de rap : le *topic modeling*

Enfin, nous avons appliqué un *topic modeling* au corpus, une méthode de machine learning capable de rassembler les documents en plusieurs *clusters* de par leur ressemblance textuelle. Nous avons d'abord effectué un \enquote{plongement lexical} avec le modèle Solon-large, développé par OrdalieTech. Nous avons ensuite appliqué l'outil Bunka, développé par Charles de Dampierre. Celui-ci a l'avantage de fournir une liste de mots qui caractérisent le corpus, ce qui permet de les comprendre. Les *topics* sont affichés dans la Table 1, muni du nom choisi par l'auteur et d'une chanson emblématique, choisie parmi les 20 textes les plus centraux du corpus. On a omis deux *topics* inclassables, représentant moins de 0,5% du corpus.

```{r echo=FALSE,warning=FALSE, results = "asis",message=FALSE}
library(stringr)
library(knitr)
library(kableExtra)
topics = read.csv("~/LRFAF/secondary_data/topics_genius.csv", sep=";")
topics = topics[-c(1,3)]
colnames(topics) = c("Mots caractérisant le topic", "%","Nom (selon l'auteur)")

topics["Titre emblématique"] = c("Ninho | Mama No Cry","Grand Corps Malade | Jour de doute","Akhenaton et al. | 11'30 contre les lois racistes","Nekfeu | Enorme freestyle de Nekfeu en live dans Planète Rap !","Fatal Bazooka | Mauvaise foi nocturne",  "La Fouine & Zaho | Ma meilleure","Freeze Corleone | Ekip")

topics["Artiste représentatif"] = c("Timal","Dooz Kawa","Keny Arkana","Ärsenik","JuL","Dadju","Freeze Corleone")
topics$`Mots caractérisant le topic` = str_replace_all(topics$`Mots caractérisant le topic`," \\| ",", ")
topics$`Titre emblématique` = str_replace_all(topics$`Titre emblématique`,"\\|",":")

knitr::kable(topics,caption = "Topics du corpus") %>% column_spec(1,width =  "14em") %>% column_spec(4,width =  "11em")
```

Comme toute méthode automatique, cette classification est faillible. Cependant, elle a la qualité de se faire \enquote{par en bas}, par les proximités langagières entre les textes, et non par le choix possiblement arbitraire d'un chercheur. Elle semble de plus convaincante : on reconnaît clairement les grands thèmes du rap dans les quatre premières catégories. La dernière (\enquote{Rap hardcore/Drill}) fut plus délicate à nommer. Elle est caractérisé par des termes très vulgaires, agressifs et sexistes. On y trouve tout d'abord Freeze Corleone et son groupe 667 (85% de leurs titres), ainsi qu'un bon nombre de chansons d'Ateyaba, Gazo ou Gradur. Le terme de drill renvoie habituellement à un rythme plus qu'à un vocabulaire, mais puisqu'il est accollé à ces quatre rappeurs, on a choisi de l'utiliser ici. On y trouve aussi une cinquantaine de titres de Booba, comme A.C. Milan, Tombé pour elle et Wesh Morray. On n'y trouve par contre peu de titres d'Ärsenik, Médine ou Kery James, parfois associés au rap hardcore - probablement davantage du fait de leur timbre et leur flow que de leur vocabulaire.

A noter également que la catégorie \enquote{Egotrip/Méta-rap} n'est pas forcément caractérisée par la mégalomanie, mais plutôt par l'évocation du rap. On y trouvera donc Grand Médine et grand nombre de freestyles, mais aussi des morceaux programmatiques comme Boxe avec les mots d'Ärsenik, ou encore les morceaux d'hommages de Médine : Lecture aléatoire, Ali X, Bataclan et Le jour où j'ai arrêté le rap.

Ce traitement peut être vu comme une façon d'enrichir les métadonnées : dans le corpus que nous mettons en ligne, on a ajouté ce classement thématique, ce que nous espérons utile à de futures recherches.

### Stratégie d'analyse

Nos données sont structurées par deux variables principales : le rappeur et l'année de publication. Nous les grouperons donc par ces deux variables, et présenterons nos variables de façon chronologique et de façon transversale. Nous tenterons brièvement de croiser les deux et d'étudier les rappeurs de façon longitudinale, afin d'appréhender l'effet de l'avancement dans sa carrière. Nous aurions aimé prendre en compte l'effet du genre de l'artiste. Malheureusement, les femmes sont trop rares dans notre corpus : parmi les 200 rappeurs les plus \enquote{vus}, on ne trouve que deux femmes (Diam's et Keny Arkana). C'est d'ailleurs un résultat en soi : ces deux rappeuses ayant passé leur pic de notoriété depuis plus de 10 ans, le rap de Genius est aujourd'hui quasi exclusivement produit par des hommes.

## L'évolution du rap français depuis 1990

Notre corpus commence en 1984 avec Paname City Rappin de Dee Nasty. Cependant, le volume de textes semble insuffisant avant 1990 pour faire une étude statistique. Avant 1995 - année charnière du genre, où Suprême NTM, Assassin, Akhenaton et Les Sages Poètes de la rue publient chacun un album - certaines de nos courbes sont très bruitées, la faute à un corpus rachitique. Pour cette raison, nous nous permettrons d'amputer certains de nos graphes des premières années, où le bruit statistique peut nuire au rendu visuel.

### Le rap se personnalise et s'éloigne du Français formel

```{r echo=FALSE,fig.cap='Usage de la première personne du singulier, 1990-2023',out.width="50%",fig.align = 'center'}
ggplot(c_year,aes(year,je)) + geom_line() + 
  xlab("Année") + ylab("Fréquence de 'je'")

```

Il ressort de nos données deux tendances continues depuis 1990. D'abord, le rap se personnalise : la fréquence de la première personne du masculin, quasi stable entre 1995 et 2010, a depuis doublé (Figure 3?). On mesure ici la place considérable de la première personne dans le rap : sa fréquence dans un corpus comme les archives du Monde est inférieure à 0,3%, soit près de 20 fois moins que le rap en 2023. Au sein du rap, on trouve aussi des différences frappantes : on trouve chez IAM seulement `r 100*(results_rappeurs["IAM","je"] %>% round(3))`% de "je", contre `r 100*(results_rappeurs["PNL","je"] %>% round(3))`% chez PNL. On trouve d'ailleurs une forte relation négative (mesuré par le coefficient de corrélation) entre l'utilisation du \enquote{je} et nos deux mesures de complexité du discours : la richesse du vocabulaire employé ($r=$ `r cor.test(results_rappeurs$diversity_residuals_2,results_rappeurs$je)$estimate %>% round(2)`) et la longueur moyenne des mots ($r=$ `r cor.test(results_rappeurs$means_word_length,results_rappeurs$je)$estimate %>% round(2)`).

La fréquence de la première personne dépend aussi fortement du *topic*. Le \enquote{je} est sous-représenté parmi le rap conscient, mais aussi, de façon contre-intuitive, dans le *topic* \enquote{Egotrip-Méta-rap}. De fait, si un titre comme Jimmy Punchline d'Orelsan contient une forte proportion de \enquote{je} (`r round(100*corpus[corpus$title == "Jimmy Punchline","n_je"]/corpus[corpus$title=="Jimmy Punchline","n_words"],1)`%), ce ne semble pas être une condition nécessaire à l'égotrip. Un morceau mégalomane comme Grand Médine contient `r round(100*corpus[corpus$title=="Grand Médine","n_je"]/corpus[corpus$title=="Grand Médine","n_words"],1)`% de \enquote{je}, soit à peine plus que dans le corpus complet (`r round(100*sum(corpus$n_je,na.rm=T)/sum(corpus$n_words),1)`%). Boxe avec les mots d'Ärsenik en contient seulement`r round(100*corpus[corpus$url=="https://genius.com/Arsenik-group-boxe-avec-les-mots-lyrics","n_je"]/corpus[corpus$url=="https://genius.com/Arsenik-group-boxe-avec-les-mots-lyrics","n_words"],1)`%, et Qui sème le vent récole le tempo de MC Colaarà peine `r round(100*corpus[corpus$title == "Qui sème le vent récolte le tempo","n_je"]/corpus[corpus$title=="Qui sème le vent récolte le tempo","n_words"],1)`%. Il est cependant possible que les morceaux qui soient davantage \enquote{méta-rap} qu'égotrip - c'est-à-dire qui parlent de rap sans célébrer le rappeur - tirent la moyenne vers le bas. Lecture aléatoire, un morceau d'hommage aux rappeurs qui ont marqué Médine, en contient la proportion dérisoire de `r round(100*corpus[corpus$title == "Lecture aléatoire","n_je"]/corpus[corpus$title=="Lecture aléatoire","n_words"],1)`%).

```{r echo=FALSE,warning=FALSE,fig.cap="Fréquence des lexiques dans les différents topics du corpus"}
plot_lexicon_par_genre = function(variable){
  corpus$var = corpus[variable]
  par_genre = corpus %>% group_by(topic_clean) %>% summarise(var=sum(var),total=sum(n_words))
  par_genre$Fréquence = par_genre$var/par_genre$total
  par_genre = par_genre[-which(par_genre$topic_clean=="Inclassable"),]
  par_genre = par_genre[order(par_genre$Fréquence),]
  par_genre$topic_clean = factor(par_genre$topic_clean,levels = c("Chansons d'amour","Rap poétique","Rap conscient","Rap coquin","Egotrip/Méta-rap","Gangsta rap","Rap hardcore/Drill"))

  ggplot(par_genre,aes(y=topic_clean,x=Fréquence)) + geom_bar(stat="identity")  + ylab("Topic") + scale_x_continuous(labels = scales::percent)
}

a = plot_lexicon_par_genre("n_je") + xlab("Fréquence du 'je'")
b = plot_lexicon_par_genre("n_verlan") + xlab("Fréquence du verlan")+ylab("") + theme(axis.text.y=element_blank())
c = plot_lexicon_par_genre("n_profanity") + xlab("Insultes")
d = plot_lexicon_par_genre("n_non_french_words") + xlab("Part des mots pas dans le dico") +ylab("") + theme(axis.text.y=element_blank())
e = plot_lexicon_par_genre("n_argot") + xlab("Fréquence des mots d'argot") 
f = plot_lexicon_par_genre("n_sexe") + xlab("Fréquence des mots sexuels") +ylab("") + theme(axis.text.y=element_blank())


plot_grid(a,b,c,d,e,f,rel_widths = c(1.2,1),nrow=3)

```

Ensuite, les textes semblent s'éloigner du français soutenu : le pourcentage de mots reconnaissables est en chute continue, de près de 98% en 1990 à 92% aujourd'hui (Figure 8). Cette chute ne semble pas, ou peu, due à l'adoption du verlan : après une apparition fulgurante en 1994 (due à MC Solaar et au Ministère A.M.E.R), son usage est presque stable depuis (Figure 4B). On pourrait plutôt l'attribuer notamment à l'usage des onomatopées, qui explosent (Figure 10).

```{r echo=FALSE,fig.cap='Usage du verlan et de mots présents dans le dictionnaire, 1990-2023',out.width="70%",fig.align = 'center'}
library(ggplot2)
a = ggplot(c_year,aes(year,french)) + geom_line() +
  xlab("Année") + ylab("Part des mots présents dans le dictionnaire'")
b = ggplot(c_year,aes(year,verlan)) + geom_line() +
  xlab("Année") + ylab("Fréquence du verlan")
plot_grid(a,b,labels = c("A","B"))

```

Au sein des *topics*, le rap hardcore/drill et gangsta rap et le gangsta rap sont, de façon prévisible, les genres les moins fidèles au dictionnaire (Figure 6). Nos estimations sont probablement affectées par la prégnance des \enquote{gimmicks} dans ce deux genres, comme le \enquote{izi} de Booba. Le verlan, l'argot et les mots sexuels suivent la même répartition entre les *topics* (Figure 6).

### Le rap, la \enquote{nouvelle variété} ?

```{r fig_share, echo=FALSE, message=FALSE,warning=FALSE,fig.cap="Evolution de la part de chaque topic dans le nombre de titres du corpus, 1993-2023"}

topics_year = filter(corpus,!is.na(ranking),topic_clean != "Inclassable") %>% dplyr::group_by(year,topic_clean) %>% dplyr::summarise(n = length(title))
topics_year = topics_year %>% dplyr::group_by(year) %>% dplyr::mutate(total = sum(n)) %>% dplyr::ungroup()
topics_year$share = topics_year$n/topics_year$total

topics_year = topics_year[topics_year$year>1992,]

ggplot(topics_year,aes(year,share,fill=topic_clean)) + 
  geom_area()  + xlab("Année") +
  ylab("Part dans le corpus") + 
  scale_fill_discrete(name = "Topic") + theme_minimal(base_size = 15, base_family = "EB Garamond")
  
```

Pour nos autres mesures, une rupture claire se présente au début des années 2010. D'abord dans l'évolution des sous-genres. La Figure 7 présente l'évolution de la part de chaque *topic* depuis 1993. La composition semble assez stable jusqu'en 2010, avec une domination de l'Egotrip/Méta-rap, du rap conscient et du rap poétique - qui contient une bonne partie des textes de IAM, Akhenaton, Oxmo Puccino et Keny Arkana. Vers 2012, le gangsta rap, les chansons d'amour et le rap coquin mordent soudainement sur la part du rap conscient et de l'égotrip, tous deux en voie de disparition en 2023. La disparition du rap conscient est une tendance bien repérée par les rappeurs eux-mêmes. Si en 1998, Calbo pouvait proclamer comme une évidence \enquote{Qui peut prétendre faire du rap sans prendre position} [@ärsenik1998] , @keryjames2012 déplore déjà que \enquote{les autres font du rap d'inconscients. Quelques années plus tard, @youssoupha2018 considère que la messe est dite : \enquote{Et, très vite, j'ai senti la douille, j'suis pas complètement inculte/Tout est parti en couilles quand rap conscient est devenu une insulte}. Cette tendance a fait l'objet d'un débat dans le champ journalistique et universitaire. En 2018, la revue Mouvements consacrait une section entière d'un numéro à la question \enquote{Le rap doit-il être politique} (voir en particulier @jesu2018). Plus récemment, Olivier Cachin constatait sur France Inter que la remarque de Kaaris \enquote{Marion Maréchal elle est bonne} avait remplacé le morceau engagé Marine de Diam's [@cachin2023]. Certains journalistes [@levaché2023] proposent cependant que le genre n'ait rien perdu en politisation, mais ait seulement changé de moyen d'expression. Notre mesure par *topic modeling* classe cependant en rap conscient non pas le rap qui se proclame conscient, mais celui qui en a le vocabulaire (peuple, pays, système, liberté, justice..., voir Table 1). Si tel est le cas, la politisation a donc su se faire indétectable.

```{r echo=FALSE,fig.cap='Mesures de complexité linguistique, 1990-2023',out.width="70%",fig.align = 'center',warning=FALSE}
library(ggplot2)
c_year_lyrics = corpus %>% group_by(year) %>% 
  summarise(lyrics = paste(lyrics,collapse="\n"),
            n_words = sum(n_words))
c_year_lyrics[c("means_word_length","diversity")] = do.call(rbind, lapply(c_year_lyrics$lyrics,get_complexity,n_words=100000))


a = ggplot(filter(c_year_lyrics,n_words>100000),aes(year,diversity)) + geom_line() +
    xlab("Année") + ylab("Diversité lexicale (sur 100 000 mots)")
b = ggplot(filter(c_year_lyrics,year>1994),aes(year,means_word_length)) + geom_line() +
  xlab("Année") + ylab("Longueur moyenne des mots")
plot_grid(a,b,labels = c("A","B"))
```

La disparition de l'égotrip/méta-rap est une tendance moins documentée. Cette moindre évocation du rap dans les textes de rap semble aller de pair avec une moindre attention aux textes, révélée par la chute brutale de nos deux mesures de complexité en 2014 (Figure 9). D'ailleurs, ce graphique bat en brêche l'idée reçue d'un \enquote{âge d'or} du rap dans les années 1990, où les textes auraient été plus cisélés que par la suite. D'un point de vue quantitatif, c'est plutôt la période récente qui est exceptionnelle\footnote{Sur la Figure 9, nous avons décidé de tronquer la période 1989-1994. Si on l'inclut, on observe une longueur des mots exceptionnelle, supérieure à 4 lettres. Mais il semble que seuls les rappeurs les plus lettrés aient été conservés dans Genius, ce qui explique ce résultat. En 1991, deux tiers des titres proviennent par exemple de IAM ou de MC Solaar. A partir de 1995 (où l'on trouve 27 artistes différents), il nous a semblé qu'on pouvait faire une étude sur une population, et non une monographie.}.

Enfin, le ratio de positivité - rapport entre le nombre de mots positifs et le nombre de mots négatifs - s'envole depuis 2014 et retrouve son niveau du début des années 1990 (Figure 10). La fréquence des insultes - après une hausse continue depuis l'époque des Sages poètes de la rue et du non moins sage MC Solaar - recule depuis 2014, de même que le lexique de la sexualité et l'argot. Le rap semble bien être devenu, selon le mot de Gims, \enquote{la nouvelle variété} : moins noir, moins agressif, moins tourné vers les textes. En passant, on mesure aussi ici à quel point le rap du début des années 1990 - ou du moins celui qui est parvenu jusqu'à Genius - a pu être sage, avant l'arrivée de groupes comme Lunatic et son titre \enquote{Le crime paie} [@lunatic1996]. On peut supposer que pour se faire une place dans l'industrie musicale, il a d'abord fallu montrer patte blanche.

```{r echo=FALSE,fig.cap="Le tournant de 2014 : au moment où les albums de rap envahissent  le top 20 annuel du SNEP, les insultes, l'argot et les mots sexuels chutent, le ratio entre mots positifs et mots négatifs augmente, tout comme les onomatopées.",out.width="100%",out.height="300%",fig.align = 'center'}

a = ggplot(c_year,aes(year,profanity)) + geom_line() +
  xlab("Année") + ylab("% d'insultes")

b = ggplot(c_year,aes(year,argot)) + geom_line() +
  xlab("Année") + ylab("% d'argot")

c = ggplot(c_year,aes(year,sexe)) + geom_line() +
  xlab("Année") + ylab("% de mots sexuels")

d = ggplot(c_year,aes(year,positivity_ratio)) + geom_line() +
  xlab("Année") + ylab("Ratio de positivité")

e = ggplot(c_year,aes(year,onomatopee)) + geom_line() +
  xlab("Année") + ylab("% d'onomatopées")

rap_albums = c(0,1,0,0,2,2,1,0,2,0,0,0,0,2,1,0,0,1,0,0,1,2,4,6,10,10,8,9,13,11,13)
years = 1993:2023
top_albums = data.frame(rap_albums,years)
f = ggplot(top_albums,aes(years,rap_albums)) + geom_bar(stat="identity") + ylab("Albums de rap dans le top 20")

plot_grid(a,b,c,d,e,f,nrow=3)
```

Si le rap se mue en \enquote{variété}, c'est aussi que la frontière avec les autres genre se brouille. Encore une fois, Gims illustre cette évolution. Rappeur à ses débuts dans la Sexion d'Assaut - même aux débuts de sa carrière solo, des morceaux comme Meurtre par strangulation appartiennent encore clairement au rap -, il devient exclusivement chanteur au fil de sa carrière. Autrement dit, il se peut que ces tendances soient dues non à l'évolution des rappeurs, mais à la contamination du corpus par des textes plus légers, et dont l'appartenance au rap et donc à ce corpus est devenue discutable.

Certaines branches du rap semblent d'ailleurs refuser ce tournant. Dans la Figure 11, on a affiché l'évolution des mesures de complexité par *topic*. Si le raccourcissement des mots affecte tous les genres\footnote{Notons que le raccourcissement des mots peut aussi venir de la prolifération des onomatopées.}, la perte de richesse lexicale est à peine perceptible parmi le rap conscient et l'égotrip/méta-rap\footnote{Ce graphique livre un autre enseignement : le rap conscient emploie des mots plus longs, mais moins divers que l'égotrip/méta-rap. Il semble que le second soit plus proche de l'exercice de style, là où le premier est plus conceptuel.}, deux genres autrefois dominants et manifestement attachés à l'ancienne façon d'écrire. Certains combattent d'ailleurs ouvertement ce tournant du rap : \enquote{J'm'étais dit que le rap n'accoucherait pas de chanteur de variét'}, peut-on entendre dans Grand Médine [@médine2014]. Celui-ci fait d'ailleurs un lien immédiat avec la marchandisation du genre : \enquote{Main qui donne est main qui dirige, coupe la de toutes les manières}.

```{r echo=FALSE,fig.cap='Mesures de complexité par topic et par année, 1995-2023. Pour plus de lisibilité, on a ici appliqué un lissage loess.',out.width="70%",fig.align = 'center',warning=FALSE,message=FALSE}
c = filter(corpus,year>1994) %>% group_by(year,topic_clean) %>% slice_sample(n=10000) %>% summarise(n_words = sum(n_words),lyrics = paste(lyrics,collapse = ""))
n_words = 30000

c[c("means_word_length","diversity")] = do.call(rbind, lapply(c$lyrics,get_complexity,n_words=n_words))

a = ggplot(c[c$n_words>n_words,],aes(year,diversity,color=topic_clean)) + geom_smooth(se=F,span=.5) +
  xlab("Année") + ylab("Diversité lexicale (sur 30 000 mots)") +  scale_color_discrete(guide="none")
b = ggplot(c[c$n_words>1000,],aes(year,means_word_length,color=topic_clean)) + geom_smooth(se=F,span=.5) +
  xlab("Année") + ylab("Longueur moyenne des mots") + scale_color_discrete(name="Topic")
grid = plot_grid(a,b + scale_color_discrete(guide="none"),labels = c("A","B"),nrow=2)
legend = get_legend(b)
plot_grid(grid,legend,rel_widths = c(2,1),nrow=1)
```

Notons enfin que ce tournant semble légèrement précéder l'explosion des ventes du rap. Dans la Figure 10, nous avons aussi dénombré le nombre d'albums de rap parmi le top 20 annuel publié par le SNEP. L'explosion a plutôt avoir lieu en 2015, moment où la transition langagière semble déjà engagée. On peut donc supposer que le tournant du rap a permis, dans un second temps, la conquête du grand public.

Concluons. @médine2008 posait la question rhétorique \enquote{Sais-tu vraiment ce qu'est le rap français ? Pas une machine à sous, mais une machine à penser}. Depuis, le rap français est indéniablement devenu une \enquote{machine à sous}. Il est impossible de mesurer s'il a pour autant cessé d'être une \enquote{machine à penser}, mais il est clair qu'il a moyenne beaucoup perdu en politisation, en radicalité, en agressivité et en complexité lexicale.

## Renouvellement générationnel, ou évolution des rappeurs ?

Sont-ce les rappeurs qui ont changé, ou ont-ils été submergés par une nouvelle génération moins noire, moins égocentrique et moins \enquote{lyriciste} ? Cette question est analogue à un problème fréquent en sociologie. Lorsqu'un trait culturel évolue au cours du temps, on peut l'attribuer à trois mécanismes distincts [@ryder1965] :

-   L'effet de période, où le zeitgeist évolue avec le temps et s'impose à tous

-   L'effet de génération, où le trait dépend du moment où l'individu est venu au monde, puis se fixe - on pourrait par exemple imaginer que chaque rappeur adopte le style propre à sa génération, puis le conserve tout au long de sa carrière

-   L'effet d'âge, où le vieillissement influence le trait - on pourrait imaginer que les rappeurs s'asagissent au fur et à mesure qu'ils vieillissent, ou bien qu'ils se reposent sur leurs lauriers

L'auteur s'est, avouons-le tout de go, cassé les dents sur une question qu'il croyait simple. Pour cause, il est mathématiquement impossible de séparer ces trois facteurs en même temps, du fait d'une redondance d'information [@bell2013]. En effet, si l'on connaît à la fois la date d'une chanson et l'âge du rappeur au moment où il la chante, alors on peut déduire par soustraction sa date de naissance. Cette redondance viole l'\enquote{identifiabilité} du modèle statistique : il existe toujours une infinité de manières possibles, et également vraisemblables, de partager l'effet observé entre ces trois effets. Pour contourner ce problème, il est possible de diviser le temps en tranches grossières [@mason1973], mais la brièveté de la période ici étudiée rend cette rustine impraticable.

```{r echo=FALSE}
year_end = 2024
c = filter(corpus,!is.na(year),year <= year_end) %>% group_by(artist) %>% 
  summarise(n_words = sum(n_words),lyrics = paste(lyrics,collapse="\n"),
  date_start = min(year,na.rm=T),date_end = max(year,na.rm=T)
  )

c = filter(c,n_words > 30000,c$date_end-c$date_start > 4)
c[c("mean_start","diversity_start")] = do.call(rbind, lapply(c$lyrics,get_complexity,n_words=10000))
c[c("mean_end","diversity_end")] = do.call(rbind, lapply(c$lyrics,get_complexity,n_words=10000,tail=TRUE))

plot_start_end = function(df,var,name){
  var1 = paste(var,"start",sep="_")
  var2 = paste(var,"end",sep="_")
  df_reshaped = gather(df[c(var1,var2)],"Période","value")
  df_reshaped$Période[df_reshaped$Période==var1] ="Début de carrière"
  df_reshaped$Période[df_reshaped$Période==var2] ="Fin de carrière"
  ggplot(df_reshaped,aes(value,fill=Période)) + 
    geom_density(alpha=.5) + 
    xlab(name) +  ylab("Densité")
}

diff_start_end = function(var,df, scaled= FALSE,prop=FALSE,p=FALSE){
  var1 = paste(var,"start",sep="_")
  var2 = paste(var,"end",sep="_")
  start = unlist(df[var1])
  end = unlist(df[var2])
  if(p){return(t.test(start,end)$p.value %>% format.pval(digits=2,eps = .001))
  }else if(prop){
    return(mean(end < start))
  }else if(scaled){
    return((mean(end)-mean(start))/sd(c(start,end)))
  }else{return(mean(end)/mean(start))}
}

c_start = filter(corpus,!is.na(year),artist %in% c$artist,year <= year_end) %>% group_by(artist) %>% slice_head(n=25)%>% measure_lexicons()
c_end = filter(corpus,!is.na(year),artist %in% c$artist,year <= year_end) %>% group_by(artist) %>% 
  slice_tail(n=25) %>% measure_lexicons()
c_start_end = left_join(c_start,c_end,by="artist",suffix = c("_start","_end"))

c = left_join(c,c_start_end,by="artist")


Variable = c("diversity","mean","profanity","negative","positive","verlan","je","french")
diff = data.frame(Variable)
difference = (100*(sapply(diff$Variable,FUN = diff_start_end,df=c)-1)) %>% round()
diff["Différence"] = difference %>% paste("%")
diff["Différence standardisée"] = sapply(diff$Variable,FUN = diff_start_end,df=c,scaled=TRUE) %>% round(2)
diff["Fréquence de chute"] = (100*sapply(diff$Variable,FUN = diff_start_end,df=c,prop=TRUE))%>% round() %>% paste("%")
diff["p-value"] = sapply(diff$Variable,FUN = diff_start_end,df=c,p=TRUE)
row.names(diff) = Variable
diff$Variable = c("Diversité lexicale sur 10 000 mots","Longueur moyenne des mots","Fréquences des insultes","Fréquences des mots négatifs","Fréquences des mots positifs","Fréquence du verlan",'Fréquence du "je"',"Part des mots dans le dictionnaire")
knitr::kable(diff,caption = "Différence entre le début et la fin de carrière, sur 25 chansons prises au début et à la fin. Ici, seuls sont pris en compte les 216 artistes ayant au moins 30 000 mots, étalés sur une période d'amplitude d'au moins 5 ans. La différence standardisée est la différence divisée par l'écart-type de la variable concernée. La p-value est le résultat d'un t-test, une différence étant par convention considérée comme significative lorsqu'elle est inférieure à 5%.",row.names = FALSE)
```

Il est cependant possible de faire plusieurs observations. D'abord, qu'il s'agisse d'un effet d'âge ou de période, il est clair que les rappeurs changent avec le temps. Dans la Table 2, nous avons isolé les rappeurs au long cours, et comparé leurs 25 premières chansons avec leurs 25 dernières. D'impressionnantes différences apparaissent : à la fin de leur carrière, les rappeurs utilisent un vocabulaire `r abs(difference["diversity"])`% moins divers (Figure 12), `r abs(difference["profanity"])`% moins d'insultes, `r abs(difference["je"])`% plus de premières personnes, `r abs(difference["negative"])`% moins de mots négatifs m et `r abs(difference["positive"])`% de mots positifs.

Il est notable que l'effet soit moins net pour la longueur des mots que pour la diversité lexicale (Table 2). Une partie de cette différence s'explique par le fait que la longueur des mots varie beaucoup moins dans la population que la diversité lexicale Lorsqu'on standardise par l'écart-type, la différence persiste, mais l'écart n'est plus que du simple au double. Cela suggère cependant que plutôt que de changer de vocabulaire, les rappeurs le restreignent et se concentrent sur certains mots. Certains revendiquent d'ailleurs un virage vers un style plus épuré. En interview, Gaël Faye l'exposait ainsi \enquote{Pendant longtemps, j'ai ressenti un complexe de supériorité [...] je trouvais presque cela jouissif [...] d'être un peu hermétique. Puis j'ai appris à écrire différemment. Car une chanson peut aussi être quelque chose de très simple.} [@faye2020]. Dans le hit de l'album qu'il évoque ici \footnote{\emph{Chalouper} est la chanson la plus vue sur Genius de l'album Lundi Méchant}, le refrain consiste en un seul mot, très long, répété six fois : \enquote{Chalouper}. Dans le séminaire La Plume et le Bitume, organisé par Emmanuelle Carinos et Benoît Dufau, Lino constate le même phénomène chez lui, et l'attribue explicitement au vieillissement : \enquote{Au début, je rappais pour impressionner les rappeurs, je rappais avec soixante-dix milliards de mots et c'était de la découpe [...] puis mon flow a évolé, j'épure, je mets moins de mots, je vais droit au but. [...] C'est l'âge.}

```{r echo=FALSE,warning=FALSE,fig.cap="La perte de vocabulaire au fil de la carrière des rappeurs. Ici, nous n'avons gardé que les rappeurs ayant ayant plus de 30 000 mots, étalés sur une période d'au moins 5 ans.",out.width="70%",fig.align = 'center'}
plot_start_end(c,var = "diversity",name = "Diversité lexicale sur 10 000 mots")
```

```{r include=FALSE}
year_end = 2014
c = filter(corpus,!is.na(year),year <= year_end) %>% group_by(artist) %>% 
  summarise(n_words = sum(n_words),lyrics = paste(lyrics,collapse="\n"),
  date_start = min(year,na.rm=T),date_end = max(year,na.rm=T)
  )

c = filter(c,n_words > 30000,c$date_end-c$date_start > 4)
c[c("mean_start","diversity_start")] = do.call(rbind, lapply(c$lyrics,get_complexity,n_words=10000))
c[c("mean_end","diversity_end")] = do.call(rbind, lapply(c$lyrics,get_complexity,n_words=10000,tail=TRUE))


c_start = filter(corpus,!is.na(year),artist %in% c$artist,year <= year_end) %>% group_by(artist) %>% slice_head(n=25)%>% measure_lexicons()
c_end = filter(corpus,!is.na(year),artist %in% c$artist,year <= year_end) %>% group_by(artist) %>% 
  slice_tail(n=25) %>% measure_lexicons()
c_start_end = left_join(c_start,c_end,by="artist",suffix = c("_start","_end"))

c = left_join(c,c_start_end,by="artist")
Variable = c("diversity","mean","profanity","negative","positive","verlan","je","french")

difference_before_2014 = (100*(sapply(Variable,FUN = diff_start_end,df=c)-1)) %>% round()
```

Notons cependant que les évolutions constatées dans la Table 2 sont globalement congruentes avec l'évolution récente du rap français depuis 2014, vers des textes moins complexes, moins noirs, moins injurieux et davantage à la première personne. Cela suggère un effet de période. On peut par exemple noter que le \enquote{rap zumba}, initié par Gims et d'abord décrié, a ensuite été partiellement adopté par des rappeurs âgés et installés comme Booba (Validée) et Kaaris (Tchoin) [@thesaurap2019].

Concernant la part des mots dans le dictionnaire, les rappeurs semblent toutefois ne pas évoluer, à rebours de la tendance générale (Figure 10). Cela suggère un effet de génération : la chute observée en diachronie est due à l'irruption de nouveaux rappeurs au langage moins formel.

Pour étayer cette hypothèse, on peut reproduire l'analyse précédente en tronquant le corpus de tous les textes postérieurs à 2014, date que nous avons identifié comme la rupture chronologique des évolutions susmentionnées. Dans ce cas, les différences de complexité s'annulent toutes deux. Pour le reste, les différences s'amoindrissent, mais persistent : rappeurs emploient `r abs(difference["profanity"])`% moins d'insultes, `r abs(difference["negative"])`% moins de mots négatifs et `r abs(difference["positive"])`% plus de mots négatifs. Mais ici, ces trois différences se font au rebours de l'évolution générale. On l'a vu, entre ses débuts et 2014, le rap français tend à employer de plus en plus d'insultes et à être plus négatif. Il semble donc que l'on ait isolé deux effets d'âge : en vieillissant, les rappeurs deviennent plus polis, et moins noirs, ou moins agressifs. En psychologie de la personnalité, l'âge est d'ailleurs connu pour augmenter l'\enquote{agréabilité} et diminuer le \enquote{neuroticisme} [@soto2011], ce qui ne peut pas être neutre dans la façon d'écrire.

Cette analyse se veut exploratoire, et n'épuise pas les explications possibles. Dans le corpus, nous avons renseigné la date de naissance du rappeur et son âge lors de la publication du morceau. Un chercheur plus compétent que l'auteur sur le sujet pourrait mener une analyse plus poussée, par exemple à la façon de @underwood2022.

```{r include=FALSE}

variables_excluded = c("artist","birthdate_artist","age_artist","year","diversity_residuals","n_words","n_total_words","n_unique_words","n_unique_words_7000")


scaled =  results_rappeurs_with_topics[results_rappeurs_with_topics$n_words > 20000 ,!colnames(results_rappeurs_with_topics) %in% variables_excluded]%>% mutate_all(scale)

scaled$radicality =  scale(rowSums(abs(scaled)))
scaled$artist = results_rappeurs_with_topics$artist[results_rappeurs_with_topics$n_words > 20000]
```

## Une cartographie des rappeurs ?

```{r echo=FALSE,message=FALSE,fig.cap="Analyse factorielle de 17 variables calculées par rappeur. Seuls les 200 rappeurs les plus consultés sont affichés. Les axes -  des combinaisons linéaires des différentes variables produits de façon endogène par l'analyse factorielle -  ont été nommés a posteriori par l'auteur.",fig.align = 'center'}
library(FactoMineR)
library(factoextra)



variables_excluded = c("artist","birthdate_artist","age_artist","year","diversity_residuals","n_words","n_total_words","n_unique_words","n_unique_words_7000","profanity","verlan","sexe","pageviews_2")

df_pca = filter(results_rappeurs_with_topics,n_words > 20000)
df_pca_var = df_pca[,!colnames(df_pca) %in% variables_excluded]

pca = PCA(df_pca_var,
          scale.unit = TRUE,graph = FALSE)
rownames(pca$ind$coord) = df_pca$artist
#plot = fviz_pca_biplot(pca,geom.var = c("text"),geom.ind = c("text"), label="all",labelsize=3,col.var="red")+labs(title="")

coord_indiv = data.frame(pca$ind$coord[,1:2])
colnames(coord_indiv) = c("Littérarité","Hardcorité")
coord_indiv$artist = df_pca$artist
coord_indiv$pageviews_2 = df_pca$pageviews_2
coord_indiv$Littérarité  = - coord_indiv$Littérarité
coord_var = data.frame(pca$var$coord[,1:2])
colnames(coord_var) = c("Littérarité","Hardcorité")
coord_var$Littérarité  = - coord_var$Littérarité
coord_var$variable = c("Rap conscient","Egotrip/Méta-rap","Gangsta rap","Rap coquin","Rap poétique","Rap hardcore/Drill","Chansons d'amour","Mots négatifs","Mots positifs","Onomatopées","Je","Mots français","Argot","Ratio positivité","Longueur des mots","Diversité lexicale","Insultes","Verlan","Mots sexuels")

top_rappers = head(results_rappeurs$artist[order(-results_rappeurs$pageviews_2)],200)


plot = ggplot(filter(coord_indiv,artist %in% c(top_rappers,"Ali (FRA)")),
       aes(Littérarité,Hardcorité,label=artist,size=pageviews_2)) + geom_text(family="EB Garamond") + 
  geom_text(data=coord_var,family="EB Garamond",aes(x=5*Littérarité,y=7*Hardcorité,label=variable,color='red',size=1500)) + scale_color_discrete(guide="none") + scale_size_continuous(range = c(1.5, 7),guide="none") + guides(fill="none")

plot_plotly = ggplotly(plot)
htmlwidgets::saveWidget(plot_plotly,"~/regicid.github.io/pca_rappers.html")
print(plot)
```

Au fil de l'article, nous avons collecté une vingtaine de variables qui peuvent chacune décrire un rappeur : son usage des insultes, sa diversité lexicale, son pourcentage de textes classés en rap conscient... On pourrait donc décrire chaque rappeur par un point dans un espace en 19 dimensions - soit 17 de trop pour un écran d'ordinateur. Cependant, il existe une forte redondance entre nos variables. On l'a vu, les rappeurs qui utilisent des mots ont aussi tendance à employer des mots divers, et à éviter le pronom \enquote{je}. Autrement dit, il existe des structures sous-jacentes. On peut ainsi ébaucher une cartographie des rappeurs, qui mette au jour ces structures.

Pour ce faire, on peut recourir aux analyses factorielles, popularisées par @bourdieu1979 et son analyse des goûts culturels. Sous le capot, l'algorithme (ici l'analyse en composantes principales) cherche deux axes, qui combinent linéairement nos variables pour expliquer résumer au mieux les données, c'est-à-dire les trahir le moins possible. Dans la Figure 13, on a représenté le résultat de notre analyse factorielle. Ce graphique étant touffu, une version interactive et zoomable est disponible en ligne : <https://regicid.github.io/pca_rappers>. Ici, les axes expliquent respectivement 35% et 25% de la variance, ce qui est fort convenable. L'auteur s'est permis de nommer les deux axes, car leur signification lui sautait aux yeux.

En abcisse, on devine le degré auquel l'auteur parle en langage soutenu, avec des mots longs, divers, sans insultes et sans verlan. La pratique du rap conscient, de l'égotrip/méta-rap et du rap poétique semble aller de pair. On a choisi de nommer cet axe la \enquote{littérarité}, à défaut d'un adjectif substantivé plus neutre. Nous ne voulons pas suggérer qu'un Freeze Corleone est moins \enquote{littéraire} qu'un Grand Corps Malade, mais il semble clair que sa langue s'éloigne davantage du français soutenu, que l'on rencontre en général dans la littérature.

En ordonnée, on devine le degré auquel un rappeur attente aux bonnes mœurs, ce qu'on peut appeler son \enquote{hardcorité}. Ici pèsent principalement la fréquence des insultes, de l'argot, des mots sexuels et l'absence de mots positifs, et dans une moindre mesure le verlan, l'absence d'onomatopée et une faible proportion de mots français. On trouve au sommet de la hiérarchie Freeze Corleone, Seth Gueko et Alkpote. La diversité lexicale est associée à cet axe, bien davantage que la longueur des mots. Notons enfin que cet axe ne représente en rien la façon de rapper : le flow, le timbre du rappeur et le beat ne sont pas mesurables avec nos données textuelles. Si Kery James, Médine ou Keny Arkana ont des scores piteux sur cet axe, c'est vraisemblablement parce que leurs textes sont moins hardcores que la façon dont ils les délivrent.

Ces deux axes sont, par construction, orthogonaux, c'est-à-dire qu'ils séparent les deux catactéristiques pour chaque rappeur. Un rappeur peut donc être à la fois littéraire et hardcore. C'est le cas de Lino, de son groupe Ärsenik, de Lunatic, et dans une moindre mesure d'Hugo TSR et Kacem Wapalek, tous situés au nord-est du graphique. Ces rappeurs associent un soin de la langue avec une certaine vulgarité (\enquote{La vulgarité ne me pose pas de problème}, déclarait d'ailleurs Lino à l'ENS). On pourrait qualifier ce pôle de \enquote{rap célinien} : @lino2014 revendique faire de la \enquote{sale littérature}, \enquote{lisse et trop classe comme du Céline}. Ces rappeurs céliniens sont cependant rares. Pour cause, peut-être, une injonction de l'industrie à choisir un camp, dont @hugotsr2008 cherche à s'extraire :

```{=tex}
\begin{displayquote}
J'ai un stylo c'est pour écrire pas pour signer des contrats\\
Dans la musique parait qu'faut être hardcore ou faut être beau et tendre\\
J'lai prouvé sur c't'album j'ai l'cul fermé et un cerveau étanche
\end{displayquote}
```
Au sud-est du graphique, on trouve les rappeurs qui ont choisi leur camp, et d'associer un langage châtié avec des thèmes plus légers. Grand Corps Malade est emblématique de ce rap plus lyrique et sentimental, qu'on pourrait qualifier en caricaturant de \enquote{lamartinien}. Presqu'à mi-chemin entre rap célinien et lamartinien, on remarque Dooz Kawa, qui se revendique de Lautréamont et \enquote{veu[t] les chants de Maldoror comme seule oraison funèbre} [@doozkawa2016]. On a aussi ajouté le rappeur Ali au graphique, même s'il ne remplissait pas les conditions de popularité, pour mettre en valeur la distance qui le sépare de Booba. Leur groupe Lunatic est d'ailleurs presque au barycentre des deux rappeurs.

On trouve enfin au nord-ouest les rappeurs hardcores, et en particulier Freeze Corleone, catapulté aux confins du territoire par sa radicalité lexicale. Au sud-ouest, on trouve les rappeurs qui ne sont ni littéraires ni hardcores. On reconnaît des rappeurs festifs comme Vegedream et Franglish, dont les textes sont plutôt construits pour le dancefloor.

# Prolongements (avis aux personnes de bonnes volontés)

L'auteur aimerait pour finir suggérer des pistes qu'il aurait aimées suivre, \enquote{Mais [s]on temps est restreint [il a] besoin de plus de temps} [@médine2005].

-   On pourrait appliquer la cartographie élaborée pour comparer les années entre elles. Une tentative exploratoire a révélé un mouvement en croissant, du sud-est au sud-ouest, en passant par le nord.
-   On pourrait l'utiliser pour comparer les différents albums d'un même artiste. Il serait par exemple intéressant de visualiser la trajectoire de Booba sur ces deux axes, au cours de ses 30 ans de carrière.
-   Il serait formidable de lemmatiser le corpus, voire d'étiqueter les fonctions grammaticales des mots. La taille du corpus ne poserait ici pas de problème, mais nous ignorons si la chose est faisable sur une langue orale, à l'orthographe moins standardisée.
-   On pourrait en faire une étude des néologismes (par exemple \enquote{faire du sale}.
-   On pourrait étudier de la mort des expression. Sur l'application, on a pu observer que \enquote{du lourd} s'effondre, remplacé par \enquote {du sale} qui commence à son tour à disparaître.
-   Notre mesure de la négativité semble rendre compte partiellement de l'agressivité des textes. Cependant, le lexique n'est pas fait pour ça, et il existe certainement de bon moyens de la mesurer.
-   On pourrait construire une mesure de la radicalité du style. Pour ce faire, votre serviteur a tenté de prendre toutes les variables, de les standardiser avec un z-score et d'en sommer les valeurs absolues, pour mesurer à quel point les rappeurs sont loin de la norme. Freeze Corleone apparaît comme le rappeur le plus radical, ce qui semble raisonnable. On retrouve ensuite Serane, Fayçal et Ali. Parmi les moins radicaux, Roméo Elvis et les Casseurs Flowters.
-   On pourrait chercher à détecter les avant-gardes. Une possibilité serait d'utiliser des plongements lexicaux et de comparer chaque œuvre à celle qui le précèdent, à la façon de @barré2023.

# Conclusion

En réalisant ce projet, l'auteur a réalisé l'étendue de son inculture en rap français. Dans le dernier graphique, tous les rappeurs qu'il affectionnait sont situés dans le même quadrant. L'écriture de cet article fut l'occasion de combler certaines lacunes - et, quel bonheur, de découvrir Ärsenik. Mais il se sent toujours incapable de produire une analyse fine comme le ferait un linguiste ou un sociologue. Ce n'est pas son métier. Sans affirmer qu'elle suffise, il préfère s'en tenir à la \enquote{lecture distante}, à la fois par goût et parce qu'il lui manque l'érudiction nécessaire à la \enquote{lecture proche}. Il espère cependant avoir ouvert des portes - certaines l'étant probablement déjà avant lui. Les données et le code de cet article sont accessibles, et une division du travail pourrait se mettre en place. Il n'y a plus qu'à.

# Remerciements

Niels, Clara, Laudine, Benjamlesang

# Bibliographie
