Lettres de Fusillés 1940-1944 sur Le Maitron en ligne
Introduction
Le chapitre précédent a permis de détailler un exemple d’analyse NLP à partir d’un jeu de données disponible. Certes, nous avons eu besoin de le nettoyer de tous ses aspects inutiles (HTML, émoticônes, stopwords, etc.), mais en tout état de cause le jeu de données était disponible, globalement clé en main, sans avoir besoin de le construire.
Or, il arrive fréquemment que le jeu de données permettant de faire de l’apprentissage automatique en NLP sur une thématique donnée n’existe pas. Les données sont souvent disponibles en ligne, sur le Web, mais le jeu de données associé n’existe pas. Dans cette situation, il faut alors le construire soi-même, de toute pièce.
Dans cette hypothèse, il faut commencer par obtenir, depuis le Web, l’ensemble des données qui permettront ensuite de créer un jeu de données utilisable.
Deux cas majeurs peuvent être cités dans cette situation, à savoir le cas « facile » et le cas « moins facile » :
-
Cas facile : les données que vous voulez récupérer sont disponibles sur un site web qui dispose d’une API REST. Auquel cas, il suffit d’interroger convenablement l’API pour obtenir les données qui serviront à construire...
Problématique identifiée
Le Maitron en ligne
« Le Maitron » est le nom d’usage d’un ensemble de dictionnaires biographiques consacrés à l’histoire du mouvement social en France. Initié par Jean Maitron (1910-1987), historien spécialiste du mouvement ouvrier, cet ensemble de dictionnaires a débuté en 1964. Il vise à documenter la vie des acteurs du mouvement ouvrier et social, des figures les plus éminentes aux militants moins connus. Le travail de Jean Maitron et de ses successeurs a permis de compiler des milliers de biographies, constituant ainsi une ressource inestimable pour la recherche en histoire et en sciences sociales.
Depuis 2012, il existe Le Maitron en ligne, qui permet de rendre accessibles des dizaines de milliers de fiches biographiques, avant même leur publication papier. Entre autres thématiques, Le Maitron des Fusillés 1940-1944 regroupe toutes les biographies de personnes exécutées sommairement par l’occupant en France, entre 1940 et 1944 (https://maitron.fr/).
Ces fiches biographiques relatives au Maitron des Fusillés 1940-1944 sont majoritairement consacrées à des résistants, qui pour certains étaient condamnés à mort souvent dès le lendemain. Ils avaient parfois la possibilité d’écrire une dernière lettre à...
Obtention d’un jeu de données
1. Contexte
Dans l’idéal, il faudrait obtenir toutes les lettres de fusillés disponibles, y compris celles qui ne sont pas disponibles sur le site du Maitron. Par exemple, le site https://www.mont-valerien.fr publie certaines lettres qui ne sont pas encore disponibles sur le Maitron.
Ici, nous nous restreignons à l’obtention de toutes les lettres de Fusillés, retranscrites, disponibles sur le site du Maitron.
2. Web scraping
Comme le site ne dispose pas d’API, il s’agit ici de requêter en HTTP le site du Maitron, pour obtenir le contenu des pages web incluant une lettre pour construire à proprement parler le jeu de données.
Dans un notebook Jupyter, on crée une cellule dans laquelle on importe les modules suivants :
import pandas as pd
import requests
from bs4 import BeautifulSoup
import time
On utilise BeautifulSoup, bibliothèque spécialisée dans ce type de tâches (https://www.crummy.com/software/BeautifulSoup/bs4/doc/).
On crée une fonction get_page_html dont le but est la récupération du code HTML d’une URL donnée :
def get_page_html(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
print(f"Erreur lors de la récupération de la page {url}")
get_page_html(url)
return None
Comme vu précédemment, les fiches biographiques contenant des lettres de Fusillés sont accessibles au travers d’une page alphabétique A, B, C... On crée donc une fonction extract_article_links qui récupère la liste des URL des fiches biographiques pour une lettre donnée (A, B, C...).
Il apparaît que la liste se trouve systématiquement dans la balise HTML suivante :
<div class='liste-articles'>...</div>
On demande donc à BeautifulSoup de filtrer précisément sur cette balise div munie de la classe ’liste-articles’ en particulier.
Voici le code de cette fonction :...
Rapide exploration du jeu de données
Quelles sont les informations dont nous disposons à propos de ce jeu de données ?
new_df.info()
new_df.describe()
On obtient ceci :
RangeIndex: 310 entries, 0 to 309
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 person_name 310 non-null object
1 article_url 310 non-null object
2 letter 310 non-null object
dtypes: object(3)
On a donc un jeu de données de 310 entrées, correspondant aux 310 lettres de Fusillés, et 3 colonnes.
Poursuivons par un nuage de mots qui, en quelques lignes de code, donne une première idée du contenu de ces lettres :
from wordcloud import WordCloud
import matplotlib.pyplot as plt
plt.figure(figsize = (10,10))
wc = WordCloud(max_words = 20, width = 1500 , height =
800).generate(" ".join(new_df.letter))
plt.title("Nuages de mots")
plt.imshow(wc , interpolation = 'none')
On obtient le nuage de mots suivant :
On observe un lexique temporel : « jour », « heure » et d’une certaine manière « dernière lettre ». Le mot « mort » est présent, tout comme le mot « vie ». Une vertu est visible également : « courage ».
Il peut être intéressant maintenant de connaître les mots les plus présents...
Apprentissage du modèle, différentes approches
Il s’agit de distinguer deux catégories de lettres, suivant l’intuition initiale : des lettres écrites par des athées versus des lettres écrites par des croyants. Et même si le lexique de la croyance n’apparaît pas du tout dans notre première analyse, nous allons tenter de « clusteriser » notre jeu de données en deux catégories, dont nous aurions le vocabulaire représentatif pour chacune d’entre elles.
Le clustering par KMeans est donc particulièrement adapté ici : on a besoin de regrouper des données en un nombre prédéfini de catégories (deux).
1. Approche KMeans
KMeans est un algorithme de clustering (regroupement) qui vise à partitionner un ensemble de données en K groupes distincts non chevauchants. Chaque point de données est attribué au groupe dont le centre (ou centroïde) est le plus proche.
L’algorithme procède comme suit :
1. Initialisation : K points sont choisis comme centroïdes initiaux. Cette étape peut être réalisée de plusieurs manières, comme choisir aléatoirement K points des données ou utiliser une méthode plus sophistiquée comme l’initialisation "k-means++".
2. Attribution des points aux clusters : chaque point de données est attribué au cluster dont le centroïde est le plus proche. La « proximité » est généralement définie en termes de distance euclidienne.
3. Mise à jour des centroïdes : après l’attribution de tous les points, les positions des centroïdes sont recalculées. Typiquement, un nouveau centroïde est positionné au centre géométrique (moyenne) de tous les points du cluster.
4. Itération : les étapes 2 et 3 sont répétées jusqu’à ce que certains critères d’arrêt soient atteints, comme un nombre maximal d’itérations ou une stabilisation des positions des centroïdes.
L’objectif principal de KMeans est de minimiser la somme des distances au carré entre les points et le centroïde de leur cluster respectif. Cet objectif...
Conclusion
En conclusion de cet ouvrage, nous avons effectué un voyage à travers la linguistique et l’application pratique du traitement automatique du langage naturel (TALN) avec Python. Nous avons débuté par les fondements de la linguistique pour ensuite explorer divers outils et techniques du TALN, allant de la traduction à l’analyse de sentiments, en passant par la classification et la reconnaissance de la parole. L’objectif était de fournir au lecteur les outils et les connaissances nécessaires pour rapidement obtenir des résultats significatifs dans le domaine du TALN en utilisant Python.
Dans ce dernier chapitre, nous avons poussé notre exploration encore plus loin. Nous avons abordé le défi complexe d’identifier un corpus informel en ligne - en l’occurrence, un ensemble de lettres écrites par des personnes fusillées en 1943 et 1944 - et celui de répondre à une question ouverte concernant les rapports au communisme ou à la foi religieuse dans la sémantique cachée de ces textes. Pour ce faire, nous avons déployé des techniques avancées comme le web scraping pour construire notre jeu de données, suivi par une analyse en profondeur à l’aide de KMeans, LDA et, finalement, Word2Vec.
Cette approche a non seulement illustré la puissance ainsi que la polyvalence de Python...