1 Introduction

1.1 Comment est organisé ce guide ?

Ce guide a pour objectif de faire découvrir les méthodes quantitatives textuelles à un public d’historien.es et philosophes de l’économie. L’objectif est de proposer une cartographie des méthodes existantes et une initiation au vocabulaire associé. Il ne nécessite aucune connaissance a priori en analyse quantitative. A partir d’un corpus très simple, nous allons découvrir les différentes étapes qui permettent de passer d’un texte brut à une base de donnée sur laquelle il est possible de mener des analyses quantitatives.

Ce guide vise également à faire découvrir l’utilisation des langages de programmation qui sont nécessaires pour utiliser concrètement ces méthodes. A chaque étape de l’analyse, le guide donne les principaux moyens d’implémenter ces méthodes sur R. Cet aspect est totalement optionnel pour la compréhension des méthodes abordées dans ce cours. Le lecteur intéressé peut également découvrir l’implémentation de ces méthodes en consultant les codes R ayant permis de construire les exemples utilisés. Il suffit pour cela de dérouler les codes en appuyant sur le bouton “code” (uniquement disponible dans le fichier html).

1.2 Qu’est-ce que le ‘text as data’ et pourquoi l’utiliser ?

Le ‘text as data’ renvoie à un ensemble de méthodes qui manipule quantitativement des données textuelles. Le label ‘text as data’ regroupe deux domaines de recherche dont les analyses se chevauchent partiellement: le text mining, spécialisé dans la recherche d’informations dans un texte, et le natural language processing, qui s’intéresse plus spécifiquement à l’analyse quantitative des langues (dites “naturelles” en opposition aux langages informatiques). Nous parlerons de notre coté de Text as Data, un label relativement récent, qui englobent les deux approches historiques (Grimmer, Roberts, and Stewart 2022; Gentzkow, Kelly, and Taddy 2019).

L’essor de l’analyse quantitative de texte est une réponse à l’augmentation des données disponibles. Internet a considérablement augmenté la production de données textuelles (message, postes, articles, etc.). Non seulement les données textuelles sous format numériques augmentent de manière exponentielle, mais cela s’accompagne d’une augmentation de la puissance de calculs de nos ordinateurs.

Source: Bit by Bit: Social Science Research in the Digital Age [alganik2019bit]

En sciences sociales, les données des messages sur les forums et les réseaux sociaux sont maintenant couramment utilisées pour étudier les comportements humains. Pour ne donner que quelques exemples, l’analyse des textes des réseaux sociaux permet d’étudier l’évolution de mouvements politiques comme les gilets jaunes (Boyer et al. 2020) ou les comportements de séduction (Bergström 2021).

Les disciplines scientifiques n’échappent pas à ce phénomène. Les scientifiques produisent de plus en plus de textes sous format numérique. Sur la dernière décénnie, la base de donnée Econlit, qui regroupe les écrits publiés au sein de la discipline économique, recense des dizaines de milliers de publications chaque année. Pour l’historien de la discipline économique, ou le philosophe de l’économie, l’analyse quantitative permet d’étudier cette nouvelle masse de données. La donnée principale de l’historien ou du philosophe de l’économie est le texte produit par les chercheurs et dans la mesure où ces textes sont de plus en plus nombreux, il devient nécessaire d’utiliser des méthodes quantitatives afin d’automatiser leur analyse.

Du fait de la masse de données disponibles, les périodes récentes de la pensée économique sont particulièrement propices à l’emploi de méthodes quantitatives mais il est parfaitement possible d’utiliser ces méthodes pour n’importe quelle période et n’importe quel objet. Tout peut être quantifié, mais la quantification ne répond pas à toutes les questions de recherche.1 L’analyse quantitative ne permettra pas d’atteindre la compréhension fine d’un débat économique comme le permet la lecture qualitative d’un texte. Elle ne permettra pas non plus de dévoiler les discours subalternes présents dans les archives d’une institution ou d’un économiste. Les nouvelles méthodes quantitatives sont complémentaires aux approches qualitatives existantes.

1.3 Un cadre général

Dans ce guide, nous allons explorer la construction et l’analyse de données textuelles. La méthode générale peut se décrire de la manière suivante (Gentzkow, Kelly, and Taddy 2019). A partir d’un corpus \(C\) nous cherchons à répondre à une question de recherche \(Y\). Un tel processus implique quatre étapes:

  • Construire le corpus: le corpus \(C\) est un tableur composé d’un ensemble de documents \(d\). Le document est ici une unité très générale: cela peut-être un livre ou un article ou un sous-ensemble de ces derniers comme, par exemple, un paragraphe ou une phrase.

  • Représentation: cette étape transforme les données textuelles en données numériques. Formellement, nous transformons \(C\) en un tableur \(W\), qui associe une valeur textuelle à une valeur numérique.

  • Mesurer: le but est alors d’appliquer une mesure \(f\) à \(W\) pour estimer la variable d’intérêt \(\hat{Y}\).

  • Interpréter: les résultats de l’estimation \(\hat{Y}\) sont discutés par rapport à la question de recherche \(Y\) initiale.

Dans ce guide nous allons nous intéresser successivement aux trois premières étapes (la dernière étape étant inhérente à la question de recherche du chercheur).

2 Construire un corpus

Un corpus \(C\) peut se définir comme un ensemble de document \(d\). Le point essentiel dans la construction de votre corpus est la définition de votre document \(d\): est-ce un article, un livre, un paragraphe ? Cette définition dépend évidement de votre source et de votre question de recherche. Si vous travaillez avec l’ensemble des articles publiés par l’American Economic Review, une définition naturelle du document \(d\) peut être l’article. Mais si vous êtes intéressé par la comparaison de deux communautés, votre corpus peut être divisé en deux documents, chacun regroupant les articles de cette communauté.

2.1 Données structurées et non-structurées

Une première distinction qu’il est nécessaire d’avoir en tête est le caractère structuré ou non structuré de vos données. Si vous téléchargez depuis Web of Science, l’ensemble des articles publiés de l’American Economic Review, vous récupérez une base de données où les informations sont catégorisées et classifiées de manière automatisée. A l’inverse, les données non structurées sont des sources brutes qui nécessiteront un travail de catégorisation.

Par nature, un texte est une donnée non-structurée. Nous verrons dans la section 5 comment les structurer. Pour l’instant, nous nous concentrons sur la catégorisation des informations relatives aux documents de votre corpus.

2.2 Collecter et catégoriser les informations

En suivant l’approche de Lemercier and Zalc (2019)2, la construction d’un corpus consiste en deux phases:

The transformation of “raw” source material into quantifiable data proceeds in two stages: first, input, which means recording archival information in a computerized document, and second, categorization, which modifies the input to form more or less homogeneous categories that can then be processed numerically (Lemercier and Zalc 2019, 55)

La phase d’input permet de sélectionner d’autres informations sur le texte qui sont potentiellement accessible dans votre source d’origine (année, institution, la bibliographie, citations, etc.).

Lemercier and Zalc (2019) insiste sur l’aspect crucial de cette étape dans le processus de recherche. Ce n’est pas seulement un travail de nettoyage, c’est une étape créative. Elle vous fera découvrir des exceptions dans les observations, des nouveaux problèmes à résoudre, ou conduira à la réfutation de certaines de vos croyances initiales. En bref, cette étape précise les hypothèses de travail initiales qui ont motivé votre travail:

[A]s tedious as inputting data may be, it offers an opportunity to become really familiar with the data and to begin to think about how the material is structured […] [t]he input phase is comparable to field work for the anthropologist or sociologist: it requires physical commitment, fosters intimate knowledge of the source material, and inspires many research questions. (Lemercier and Zalc 2019, 55)

Vous construisez votre corpus \(C\) sous la forme d’un tableur, où les lignes représentent le document \(d\) et les colonnes sont les éventuelles caractéristiques directement collectées depuis la source. Voici un exemple d’un corpus fictif. Chaque ligne est un document et les colonnes correspondent aux caractéristiques de ces documents qui ont été récupérées depuis la source. Nous travaillerons sur ce dernier dans la suite de ce guide:

doc_id source year
1 This is the first document, American Economic Review 1950
2 This document is the second document (published by the AER) 1955
3 This document is the third document, Quaterly Journal of Economics 1950

La seconde phase consiste à catégoriser ces sources collectées. La catégorisation vise à synthétiser les informations brutes que vous avez collecté dans un ensemble fini de catégories qui serviront à répondre à votre question de recherche. Dans notre exemple précédent, il est possible par exemple de distinguer le texte et le journal d’origine.

doc_id text Journal Year variable_3
1 This is the first document American Economic Review 1950
2 This document is the second document American Economic Review 1955
3 This document is the third document Quaterly Journal of Economics 1950

Le processus de catégorisation n’est pas neutre. Cela suppose de rassembler des singularités du monde sociale et de les faire tenir ensemble au sein d’un même label, ce qui ne va jamais de soi (Desrosières 1993). Le processus de catégorisation doit toujours se penser dans une démarche instrumentale: la question n’est pas de savoir si ces singularités sont réellement équivalentes dans l’absolu, elles ne le sont pas, il s’agit plutôt de savoir si cette relation d’équivalence sert correctement l’analyse et permet d’améliorer la compréhension du problème en question.

Ces remarques sont aussi valables si vous récupérez des données structurées par un tiers. Par exemple, la base de donnée d’Econlit classifie les articles par disciplines et sous-disciplines grâce au JEL codes. Cette taxonomie délimite les frontières des sous-disciplines qui ne vont évidement pas de soi. La classification des sous-disciplines est un enjeu de luttes entre économistes afin de faire reconnaître l’existence et l’autonomie de leurs spécialités de recherche respectives (Cherrier 2017).

2.3 Les différents moyens de collecter des données textuelles

L’effort que vous devez fournir pour construire votre corpus dépend en grande partie de la nature de votre source. Si vous travaillez avec une base de données déjà construite comme le propose certaines plateformes scientifiques (Web of Science, Scopus, Econlit, etc.), vous récupérez des textes quasiment prêt à l’emploi. Mais si votre ambition est d’analyser quantitativement un livre, des archives écrites à la main, ou le contenu d’un siteweb, vous devrez collecter vous même ces données.

2.3.1 L’OCR

Si votre source est un texte manuscrit ou d’un texte imprimé, une photo ne suffira pas à faire reconnaître à votre ordinateur les caractères écrits à la main ou imprimé sur votre papier. Rappelons ici qu’un texte est lui-même une séquence de caractères. Les caractères sont les éléments de base d’un texte: on y retrouve en outre des lettres, des chiffres, de la ponctuation mais aussi des espaces, des tabulations, des retours à la ligne, etc.

Pour que votre ordinateur soit capable d’identifier un sigle particulier comme un un caractère existant, il est nécessaire d’utiliser un logiciel de reconnaissance optique de caractère (ou OCR, pour Optical Character Recognition). L’OCR est une méthode qui prend comme input l’image numérique d’un texte (une photo, un pdf, etc.), applique un modèle de reconnaissance des caractères, et produit un fichier textuel (.txt).

Il est important de garder en tête que la qualité de l’OCR va dépendre évidement de la qualité de votre image, de la qualité de l’écriture, et de l’efficacité du modèle de reconnaissance que vous utilisez. L’OCR n’est jamais parfait et nécessitera toujours une intervention humaine afin de vérifier et corriger les erreurs du logiciel.

La plupart des logiciels de traitement de textes et les lecteurs pdf propose des océrisations tel que Microsoft Azur, Adobe Acrobat ou pdfelements. L’OCR sur ces logiciels est payantes. Il est possible d’utiliser directement des logiciels open-source et gratuit mais ils nécessitent une bonne connaissance des langages de programmation dans lesquels ils sont implémentés. Vous trouverez ici une discussion des meilleurs logiciels disponibles.

Avant de vous lancer dans une OCRisation, vérifiez que le texte qui vous intéresse n’est pas déjà numérisé. Il existe de nombreux projets de numérisation d’archives et de textes classiques. Par exemple, le Projet Gutenberg est une bibliothèque électronique proposant une version numérique d’oeuvres issues du domaine public. On y trouve des textes classiques d’économie comme la _Richesse des Nations d’Adam Smith. Internet archives est un autre exemple de bibliothèque numérique.

2.3.2 Le web scraping

Le web scraping ou harvesting (le moissonnage du web) est une technique visant à extraire le contenu d’un site web via l’utilisation d’un programme informatique comme R ou Python. Un web scraper prend comme input un url, ou une liste d’url, et extrait de manière automatisé les informations de ces pages.

Les pages web sont écrites en langage html (pour Hypertext Markup Language). Le langage html est un langage qui structure les données, principalement textuelles, des sitewebs. Un site web est un document html, qui a été mis en ligne et que vos navigateurs web sont capables de lire. Ce propre guide est écrit en html.

Il n’y a absolument pas besoin de connaitre le langage html pour faire du web scraping. Il est uniquement nécessaire de comprendre comme html structure les données d’un site web. html est un langage de balisage, c’est-à-dire un langage qui structure des données à l’aide de balises (LateX est un autre exemple de langage de balisage). Les balises dans html sont représentées par les caractères spéciaux < et \> dans lequel les données sont contenues. A l’intérieur de ces balises, nous pouvons trouver du texte et d’autres ressources comme des images, des vidéos, des liens hypertextes.

Il est possible de vous donner une première idée de la manière dont html structure les données en inspectant n’importe quelle page web. Il vous suffit de surligner un texte, de cliquer droit dessus, puis de cliquer sur inspecter. Vous tomberez directement sur la balise qui contient les informations sur ce texte. A l’aide de R ou Python, il est facile d’automatiser cette procédure. A partir d’une url donnée, le programme récupère le code html, extrait les informations de cette balise (exemple d’implémentation sur R à dérouler).3

# des packages pour manipuler et mettre en forme les
# données (optionnelles)
library(dplyr)
library(knitr)
library(kableExtra)

# rvest est le package de référence dans R pour le web
# scrapping
library(rvest)

# je récupère une adresse url
url <- "https://rehpere.org/dorian-jullien"

# mon programme récupérère le code html de cette page
text <- read_html(url) %>%
    # je sélectionne la balise qui m'intéresse (voir un
    # tutoriel sur les selecteurs xpath et css)
html_element(xpath = "/html/body/main/div/div/article/div[2]/p[2]") %>%
    # je récupère le texte dans cette balise
html_text()

# je met en forme dans un tibble
tibble(Nom = "Dorian Jullien", Bio = text) %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F, latex_options = c("scale_down",
        "HOLD_position"))
Nom Bio
Dorian Jullien Mes recherches portent sur la théorie du choix rationnel en économie de manière générale, et plus particulièrement sur son rôle en économie comportementale et expérimentale.

Sur R le package rvest est le principal packages permettant de construire un web scrappeur. rselenium permet de naviguer directement sur internet. Combinés à rvest, ce deuxième package permet de collecter des données sur des pages web dynamiques. Dans ces dernières le document html peut varier selon la personne qui consulte la pageweb. Par exemple, Facebook est un site internet dynamique où la consultation de l’url “https://www.facebook.com/” dépendra de l’utilisateur.

3 Manipuler le texte avec RegEx

En pratique, les textes que nous récupérons ne sont jamais ‘propres’. Il est possible par exemple que l’OCR ne soit pas parfaite ou que le texte comporte plusieurs coquilles. Certaines informations ne sont pas harmonisées et il est nécessaire de retravailler les données afin de les rendre utilisables. Par exemple, dans notre corpus \(C\), les titres des journaux n’étaient initialement pas harmonisés. Si je cherche dans ma base de donnée les articles qui ont été publiés dans “l’American Economic Review” je ne trouverai pas ceux avec l’acronyme “(published by the AER)”.

doc_id source year
1 This is the first document, American Economic Review 1950
2 This document is the second document (published by the AER) 1955
3 This document is the third document, Quaterly Journal of Economics 1950

Afin de corriger ce problème, nous avons besoin de manipuler le texte afin de supprimer les informations que nous jugeons non pertinentes, ici “(published by the)”, et d’harmoniser celles qui nous intéressent. La réponse classique à ce type de problème est d’utiliser des RegEx.

3.1 Qu’est-ce que RegEx ?

RegEx est le diminutif de Regular Expression. Ce langage permet d’identifier une séquence de caractères spécifiques au sein d’un texte. On appelle cette séquence une expression régulière. RegEx est un outil particulièrement puissant pour nettoyer des données, mais aussi pour extraire des informations importantes dans vos documents. La RegEx la plus simple est un mot. Explorons l’utilisation des RegEx les plus simples avec le texte suivant:

This is the first document, American Economic Review
RegEx Match Do not Match
American American
is ‘is’ et ‘this’
the the The

Le Regex “American” permet d’identifier toutes les occurrences de la suite de caractère “A” puis “m” puis “e” puis “c” etc. Cette séquence de caractères apparaît qu’une seule fois dans notre exemple. En revanche, la RegEx “is” est une expression régulière que l’on retrouve trois fois: le mot “is” est identifié mais aussi les deux dernières lettres du mot “his”. RegEx distingue les lettres en minuscule et en majuscule. Ainsi la RegEx ‘the’ ne correspond pas à “The” mais uniquement au “the” de other”.

Il est possible d’effectuer des manipulations de texte bien plus complexe que les exemples précédents. Pour cela nous devons utiliser la syntaxe de RegEx.

3.2 La syntaxe de RegEx

La syntaxe RegEx renvoie à l’ensemble des règles de ce langage. Afin de manipuler cette syntaxe, nous devons utiliser des “caractères spéciaux” qui dans le langage RegEx ne renvoie pas à eux-mêmes mais à une règle particulière. L’objectif de ce guide n’est pas de présenter exhaustivement l’ensemble de ces caractères spéciaux.4

Prenons un exemple:

. ne désigne pas un point dans le langage RegEx mais un ensemble des caractères possibles.

  • * est un quantificateur qui se répète 0, 1 ou plusieurs fois (The* corresponds à “Th”, “The”, Thee”, “Theee”, etc.).

  • .* désigne donc l’ensemble des combinaisons de caractères possibles.

Sur la base de cet syntaxe, il est déjà possible de réaliser la plupart des opérations nécessaires pour nettoyer notre corpus \(C\):

doc_id text year
1 This is the first document, American Economic Review 1950
2 This document is the second document (published by the AER) 1955
3 This document is the third document, Quaterly Journal of Economics 1950

Par exemple, pour le premier et le troisième document, nous pourrions sélectionner l’ensemble des caractères qui suivent une virgule “,” pour séparer le texte du document de sa source. Une RegEx possible serait la suivante: ,.* qui correspond à une “,” puis n’importe quel caractère, 0, 1 ou plusieurs fois.

library(stringr)

string <- "This is the first document, American Economic Review"

str_extract(string, ",.*")

3.3 RegEx en pratique

En pratique, ReGex s’utilise dans des programme informatiques comme R ou Python. Si une RegEx identifie une expression régulière dans un texte, il faut un programme informatique pour nous permettre de manipuler l’expression trouvée (extraire, supprimer, transformer, etc.). Le langage de base de R offre une gamme complète de fonctions permettant de manipuler un texte avec des RegEx. Toutefois dans ce langage, je vous conseille plutôt d’utiliser le package stringr](https://stringr.tidyverse.org/) de la collection tidyverse. Les fonctions proposées sont plus intuitives à utiliser et offre des manipulations plus avancées que les fonctions de base.5.

4 Analyser le texte: un premier exemple avec la fréquence

Une fois le corpus \(C\) constitué et nettoyé, nous pouvons mener notre analyse quantitative. Nous commençons dans cette section par un exemple très simple qui utilise les deux premiers documents de notre corpus \(C\).

library(dplyr)
library(knitr)
library(kableExtra)

corpus <- tibble(doc_id = c(1, 2), text = c("This is the first document",
    "This document is the second document"))

corpus %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F)
doc_id text
1 This is the first document
2 This document is the second document

Supposons une question de recherche \(Y\): nous cherchons à comprendre dans notre corpus les différences de sujets traités par les deux documents. Comment savoir quel est le sujet traité ou les sujets traités par chacun des documents de mon corpus ? Une manière intuitive d’y répondre est de regarder la fréquence \(f_{t,d}\) des mots \(t\) qui sont utilisées dans chacun des documents \(d\). A partir de notre corpus \(C\), nous pouvons construire un nouveau tableur qui associe chaque mot de notre document à sa fréquence au sein du document.

4.1 La fréquence

Calculons la fréquence de chaque mot au sein de notre corpus \(C\):

doc_id word n
1 this 1
1 is 1
1 the 1
1 first 1
1 document 1
2 this 1
2 document 2
2 is 1
2 the 1
2 second 1
2 document 2

La fréquence absolue demeure un indicateur limité car il ne prend pas en compte la longueur des documents. Si un document contient plus de mots qu’un autre document, sa probabilité pour qu’il contienne un mot est plus élevé, et ceci indépendamment du sujet du texte lui-même. Dans notre exemple, le document 2 est légèrement plus long:

library(dplyr)
library(tidytext)
library(knitr)
library(kableExtra)

df_F <- corpus %>%
    group_by(doc_id, text) %>%
    unnest_tokens(output = token, input = text) %>%
    summarise(doc_id = doc_id, total = n()) %>%
    unique() %>%
    left_join(corpus, "doc_id") %>%
    relocate(total, .after = text)

df_F %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F)
doc_id text total
1 This is the first document 5
2 This document is the second document 6

Afin de rendre comparable ces deux documents, on normalise la fréquence d’un mot \(f_{t,d}\) en la divisant par la somme des fréquences de chaque mot du document (soit l’ensemble des mots du document):

\[TF(d,t) = \frac{f_{t,d}}{\sum\limits_{t \in d } f_{t, d}}\]

library(dplyr)
library(tidytext)
library(knitr)
library(kableExtra)

df_TF <- corpus %>%
    group_by(doc_id, text) %>%
    unnest_tokens(output = token, input = text) %>%
    summarise(doc_id = doc_id, total = n()) %>%
    unique() %>%
    left_join(corpus, "doc_id") %>%
    right_join(token) %>%
    select(doc_id, total, word, n) %>%
    relocate(total, .after = n) %>%
    mutate(TF = n/total)

df_TF %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F)
doc_id word n total TF
1 this 1 5 0.2000000
1 is 1 5 0.2000000
1 the 1 5 0.2000000
1 first 1 5 0.2000000
1 document 1 5 0.2000000
2 this 1 6 0.1666667
2 document 2 6 0.3333333
2 is 1 6 0.1666667
2 the 1 6 0.1666667
2 second 1 6 0.1666667
2 document 2 6 0.3333333

Dans notre exemple, comme le second document est composé de plus de mots, chaque mot a un poids relativement plus petit que ceux du premier document, qui est plus court.

La fréquence normalisée d’un mot est une première mesure pour analyser un document. Cependant, cela reste un indicateur limité sur bien des aspects. En effet, la fréquence absolue d’un document donne beaucoup d’importance à des mots du langage commun, utilisés dans l’ensemble des documents (par exemple, dans notre corpus, “is” ou “the”). Or, puisque ces mots sont utilisés partout, il ne nous donne aucune information intéressante sur les particularités de chaque document. Ainsi, le mot “first” est le seul qui soit spécifique au premier document. Il donne donc plus d’informations sur le premier document que les autres mots du document et on aimerait trouver une mesure qui permette de lui accorder plus de poids qu’aux autres mots. C’est ce que fait la mesure IDF.

4.2 L’IDF

IDF est l’abréviation de Inverse Document Frequency. C’est le rapport entre le nombre de documents \(d_n\) dans le corpus \(C\), noté \(N\), sur le nombre de documents contenant le mot \(t\) :

\[IDF = \frac{N}{d\in C:t\in d}\]

library(dplyr)
library(tidytext)
library(knitr)
library(kableExtra)

df_IDF <- df_TF %>%
    select(word) %>%
    unique() %>%
    count(word) %>%
    group_by(word) %>%
    mutate(IDF = 2/sum(n))

df_IDF <- df_TF %>%
    left_join(select(df_IDF, c(word, IDF)), by = "word") %>%
    select(-c(n, total)) %>%
    unique()

df_IDF %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F)
doc_id word TF IDF
1 this 0.2000000 1
1 is 0.2000000 1
1 the 0.2000000 1
1 first 0.2000000 2
1 document 0.2000000 1
2 this 0.1666667 1
2 document 0.3333333 1
2 is 0.1666667 1
2 the 0.1666667 1
2 second 0.1666667 2

L’IDF mesure la spécificité d’un mot dans un document par rapport aux autres documents. Dans notre exemple, l’IDF des mots “first” et “second”, qui sont spécifiques à chaque document, est plus élevé que les autres mots, qui se retrouvent dans tous les documents.

4.3 Le TF-IDF

Le TF-IDF est une mesure qui combine les deux mesures précédentes: \[TF * IDF\]

Le TF-IDF donne plus de poids aux mots qui apparaissent plusieurs fois dans un document et aux mots qui sont spécifiques à un document par rapport aux autres documents. C’est donc à la fois une mesure de l’importance _ et de la spécificité d’un mot au sein d’un document relativement au corpus.

library(dplyr)
library(tidytext)
library(knitr)
library(kableExtra)


df_TF_IDF <- df_IDF %>%
    mutate(`TF-IDF` = TF * IDF)

df_TF_IDF %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F)
doc_id word TF IDF TF-IDF
1 this 0.2000000 1 0.2000000
1 is 0.2000000 1 0.2000000
1 the 0.2000000 1 0.2000000
1 first 0.2000000 2 0.4000000
1 document 0.2000000 1 0.2000000
2 this 0.1666667 1 0.1666667
2 document 0.3333333 1 0.3333333
2 is 0.1666667 1 0.1666667
2 the 0.1666667 1 0.1666667
2 second 0.1666667 2 0.3333333

Il est courant d’appliquer la fonction logarithmique à la mesure IDF. A ma connaissance, il n’existe pas d’explications consensuelles sur ce point. L’une des raisons invoquéé est que le logarithme permet de conserver un IDF à la même “échelle” que le TF. En effet, pour des corpus important, l’IDF peut rapidement augmenter à mesure que \(N\) augmente::

\[\frac{f_{t,d}}{\sum\limits_{t \in d } f_{t, d}} * \log{(\frac{N}{d\in C:t \in d})}\]

library(dplyr)
library(tidytext)
library(knitr)
library(kableExtra)

df_IDF_log <- df_IDF %>%
    mutate(`IDF (log)` = log(IDF), `TF-IDF` = TF * log(IDF)) %>%
    select(-c(IDF))

df_IDF_log %>%
    kbl() %>%
    kable_minimal() %>%
    kable_styling(full_width = F)
doc_id word TF IDF (log) TF-IDF
1 this 0.2000000 0.0000000 0.0000000
1 is 0.2000000 0.0000000 0.0000000
1 the 0.2000000 0.0000000 0.0000000
1 first 0.2000000 0.6931472 0.1386294
1 document 0.2000000 0.0000000 0.0000000
2 this 0.1666667 0.0000000 0.0000000
2 document 0.3333333 0.0000000 0.0000000
2 is 0.1666667 0.0000000 0.0000000
2 the 0.1666667 0.0000000 0.0000000
2 second 0.1666667 0.6931472 0.1155245

A l’échelle logarithmique, les mots partagés par l’ensemble des documents ont une valeur de 0 et les mots spécifiques aux documents 1 et 2 ont une valeur positive.6

Le TF-IDF représente une première mesure simple pour extraire de l’information au sein d’un corpus. Il s’agit avant tout une méthode d’exploration de votre corpus. Par exemple, afin de vous faire une première idée du contenu de votre corpus, vous pouvez extraire les 10 mots avec le TF-IDF le plus élevé dans vos documents. Par exemple, Claveau et al. (2021) analyse l’ensemble des articles publiés dans les deux journaux principaux de philosophie de l’économie. Après avoir classifié ces articles en différentes communautés, ils utilisent le TF-IDF pour comprendre les thématiques discutées par chacune de ces communautés.7