Voici la description d’un sous-projet de On the Shoulders of Cloud Giants. Il s’agit de moissonner (ie. web scraper, récupérer et organiser certaines données du web de manière automatisée) les blogues qui parlent de jeux de rôle sur table pour identifier qui cite qui.
Les codes sont en Python et ils utilisent des libraries courantes. Ils se trouvent ici : https://github.com/pmartinolli/pyTTRPGblogScraping
Visualisation du résultat en JavaScript : https://observablehq.com/@pascaliensis/ttrpg-blog-communities-who-cites-who
Les fichiers de programme .py sont installés dans un répertoire. Les fichiers produits (.csv et .txt) sont écrits dans le répertoire parent du répertoire des programmes.
Fonctionnement de la moissonneuse
Nom du programme : pyTTRPGblogCitationWS.py
- On fournit une liste de blogues pour démarrer le moissonnage. Ce sont des URLs (une par ligne) dans un fichier
manual_urls.txt
- Le programme parcourt les URLs et produit un fichier
blog_urls_iteration_1.csv
- Il contient l’URL du blog citant, l’URL du blog cité et les mots-clés contrôlés trouvés dans le blogue citant.
- Le processus peut être interrompu en tout temps et relancé. Le prochain fichier sera nommé
blog_urls_iteration_2.csv
et ainsi de suite. C’est très pratique car parfois (souvent?) le processus bloque sur certaines URLs. Il faut alors redémarrer le kernel de Python et relancer le programme. - Un blogue citant qui a été analysé une fois ne l’est plus par la suite.
- Pour automatiser l’insertion d’une nouvelle entrée dans le fichier csv, il faut que le blogue citant ET le blogue cité :
- Soient chacun de type “blogue” (plusieurs techniques sont utilisées)
- Parlent de jeu de rôle sur table (liste de mots-clés contrôlés à repérer sur la page d’accueil du blogue, à l’exclusion du texte des liens). Les mots-clés contrôlés sont dans le code dans une liste nommée
rpg_keywords
- Mécanismes d’exclusion
- À l’intérieur du code, il y a la possibilité d’alimenter une liste nommée
url_traps
avec les URLs qui ont fait boguer le programme. - Pour éviter de tester des URLs qui ont déjà été évaluées et rejetées (ni blogue, ou blog non JDR, ou erreurs), une liste d’exclusion est stockée dans une variable
exclusion_list_urls
et dans un fichier texte nomméexclusion_list.txt
. C’est le premier test quand une nouvelle URL doit être évaluée. Cela accélère considérablement le programme.
- À l’intérieur du code, il y a la possibilité d’alimenter une liste nommée
Nettoyage du fichier de résultat
Nom du programme : pyTTRPGblogCleaner.py
Tout fichier doit être nettoyé avant d’être utilisé par un programme d’analyse ou de visualisation. Or le fichier généré par la moissonneuse est tout spécialement chevelu et hirsute.
Fonctionnement principal :
- Il supprime les indicatifs .com, .fr, etc.
- Il supprime les lignes doublons et les auto-citations qui auraient pu se glisser (citant = cité)
- Il supprime les “non blogues de JDR”
- Il renomme la colonne
Citing...
enSource
et la colonneCited...
enTarget
(car c’est souvent ce qu’attendent certains programmes comme GEPHI). - Un fichier
clean_citing_cited_TTRPG_blog_list.csv
est produit.
Et ensuite ?
Visualiser et analyser les données
(à venir dans un prochain billet)
Citation fine
Utiliser les URL testées positives pour archiver tous les billets de tous les blogues retenus (lorsque leurs auteurs autorisent le moissonnage). Puis utiliser ces billets archivés pour faire une analyse plus fine des citations.
-
- En effet, avec la méthode actuelle les liens de citation sont principalement ceux dans le bandeau actuel de navigation du blogue, avec peut être une dizaine de billets les plus récents.
- En analysant les citations dans chaque billet on a un maillage plus fin des relations puisque ces citations sont localisées sur des informations spécifiques plutôt qu’être mentionnées de manière générique dans la zone de navigation.
- On pourra peut être même comparer les deux types de citation.
- Il y a un aspect préservation aussi car on ne sait pas si Google ou d’autres plateformes de blogue fermeront leurs services.
Annexe : extraire les URLs de départ depuis Obsidian
J’avais stocké des centaines d’URL dans des notes Obsidian.md. Voici un programme qui parcourt un coffre (vault) Obsidian.md et qui créé le fichier manual_urls.txt
pour démarrer le programme de moissonnage.
Nom du programme : pyURLfromObsidianMD.py
Auto-réflexions en cours de projet (20240624)
- Le web scraping est vraiment un processus fragile. Souvent, j’ai corrigé le code pour éviter que ça plante. Maintenant, ça roule mieux (du moins pas de plantage en 24h non-stop) mais c’est lent. J’ai produit 33 000 paires en 72h dans un fichier csv qui fait 3.8 Mo. Je pensais que ça irait plus vite.
- J’ai fait l’erreur de créer/mettre à jour les fichiers sur un infonuage. Cela était sûrement une des raisons du plantage et des couacs divers. Maintenant, tout tourne sur le disque dur mais non synchronisé. À noter pour l’application de la méthode file over app : en cas de mise à jour intensive de fichiers, les infonuages sont à éviter.
- Émotionnellement, c’est super satisfaisant de s’endormir ou de partir en randonnée et de savoir que le code tourne tout seul et produit des choses en notre absence.
- Plus généralement, le fait de chercher «qui cite qui» dans ce contexte permet de mettre un peu d’ordre dans le chaos des blogues existants. A part utiliser des recommandations ou des listes sélectionnées de blogues, il n’y a aucun moyen de mesurer l’impact, l’étendue, la forme, etc. des communautés de rôlistes blogueurs.
- J’ai hâte d’assister à un pic d’URL à chercher (pour l’instant ça ne fait que monter) pour avoir l’impression d’avoir fait le tour. Bien que je sais que ce soit un peu illusoire car beaucoup de blogues :
- refusent d’être moissonnés,
- ou bien ils ont disparu,
- ou bien mon code ne sait pas les identifier. Cette dernière catégorie est particuli`èrement déchirante car c’est ce qui arrive pour les sites web “maison”. Or les blogues ayant souvent une valeur fortement DIY, cela écarte tous les blogues vraiment DIY et donne un biais de sélection aux blogues qui ont choisi des plateformes “mainstream” pré-construite comme WordPress ou Blogger. Exemple : https://ludomancien.com/
- Il faudra que je repasse sur certaines adresses (et que je revois mes critères de
rpg_keywords
) car je vois qu’elles sont écartées par erreur. Je me baserai sur les adresses les plus citées et celles qui ont été classées comme Non-blogue de JDR.- NB: je pense savoir pourquoi: à un moment donné, il y a eu un problème de connexion sur certains blogues qui se sont retrouvés dans la liste d’exclusion. Il faudra donc retraiter toute la liste d’exclusion à la fin.
Auto-réflexions II (20240702)
- J’ai abandonné l’idée de réinjection continue des URL citées en URL citantes.
- D’abord, je fais une passe complète sur le premier jeu d’URL. Puis quand c’est terminé, je me base sur les URL citées pour constituer le second jeu d’URL.
- Auparavant, la constante réinjections des URL citées faisait que le processus entrait en profondeur dans certaines explorations et ainsi créait un énorme biais.
- J’utilise le programme
pyTTRPGblogCitationIterationX.py
pour extraire les URL de l’itération finale de la première phase.
La visualisation ci-dessus a été faite avec le logiciel open source Gephi. Open > Spreadsheet > Ouvrir le fichier clean_citing_cited_TTRPG_blog_list.csv
qui contient 12000 arêtes (edges) et 4700 noeuds (nodes). Ça produit un gros carré. Aller dans le panneau Layout > —Choose a layout > OpenOrd > RUN
Je me considère comme un « programmeur du dimanche ». J’ai appris Turbo Pascal au lycée au siècle passé. Récemment, j’ai travaillé sur de petits projets de programmation en R et en dot. Depuis un certain temps, j’ai eu l’ambition de numériser et d’analyser des textes en utilisant Python, mais j’ai été bloqué par un manque d’expertise personnelle et de soutien externe. C’est alors que ChatGPT est survenue…
Avantages de ChatGPT pour les chercheurs non-programmeurs
Inconvénients
Comment ?
Objectifs du projet
Problèmes rencontrés
Avec les fichiers PDFs
Avec Python
Structure des dossiers et fichiers
Apocalypse World 1st ed.pdf
Apocalypse World 2nd ed.pdf
HomebrewB&B.pdf
B&B1sted.pdf
GURPS B&B.pdf
B&F2e.pdf
Explications :
HomebrewB&B.pdf
est ignoré).B&F2e.pdf
est ignoré).Yragatheque
est le niveau le plus haut. C’est la racine de l’arbre de la collection des PDFs.A, B, C
,… sont le 2e niveau. C’est la classification alphabétique de tous les jeux.Apocalypse Word
est au 3e niveau. À ce niveau se trouvent les noms des jeux._working_directory
contient les fichiers csv produits, les listes d’autorité et la base de données SQLite._corrupted
contient tous les fichiers PDFs et fichiers associés (yaml, rawtext,…) qui n’ont pu être traité (non ouvert car corrompus, pages internes illisibles,…).Scripts et flux de numérisation
Les fichiers nommés
00-nom
sont des scripts Python._working_directory
s’il n’existe pas..yaml
,.rawtext
et.ocrtext
qui peuvent subsister de traitements précédents.yaml
du même nom que le fichiers pdf, au même emplacement, avec comme variables :metadata.csv
à partir de tous les fichiers .yaml de toute la collection.metadata.csv
pour y ajouter des colonnes (et donc des nouvelles variables yaml), modifier le contenu, etc. Il est recommandé de faire une sauvegarde du fichier modifié (exemple :metadata.backup.csv
) pour ne pas écraser toutes ces modifications manuelles.metadata.csv
et réécrit tous les fichiers.yaml
de la collection avec le nouveau contenu..rawtext
de même nom que le pdf au même emplacement, contenant l’extraction du texte si le fichier pdf est au format numérique ou s’il y a une couche d’OCR extractible. Si l’extraction ne fonctionne pas ou pose problème, un fichier est créé tout de même mais vide..rawtext
est vide ou tout petit, on lance une numérisation via Tesseract qui va créer un fichier.orctext
au même endroit que le fichier pdf. C’est un processus assez long..yaml
, accompagné du fichier.rawtext
ou.ocrtext
(le plus gros) correspondant, dans une base de données SQlite nomméeTTRPG_LLM.sqlite
Prochainement
metadata.csv
et exportées dans les fichiers .yaml ne sont pas intégrées dans la base SQLite.game
: le QID de la famille de jeu (cela devrait être presque du 100%)La première partie de ce billet a été partiellement retouchée par ChatGPT Mar 23 Version le 21 avril 2023. Billet modifié le 11 mai 2023.
Commentaire de ChatGPT à propos de ce billet :
(sic transit gloria mundi)