Cet essai est un bac à sable pour expérimenter un flux de données et leur traitement en fouille de texte (text mining). Cette première partie compare différentes méthodes pour sortir des données des pdf.
Les fichiers pdf sont extrêmement hétérogènes. Cela va du fichier produit professionnellement et électroniquement au fichier numérisé à la main dans un garage avec plein de bugs dans la structure.
Flux de données
1. Sélection du corpus des données
Seuls les livrets ou la boîte de base de chaque édition de D&D sont sélectionnées.
2. Récolte des différentes éditions en pdf
Cette récolte a été effectuée par des moyens que les lois sur la propriété intellectuelle réprouve. Je brave le risque en me disant que je fais ça dans un but purement académique.
3. Renommage des fichiers
Old Dungeons & Dragons (1974 ed.)
1974-odd-mnm
: booklet no.1, Men & Magic
1974-odd-mnt
: booklet no.2, Monsters & Treasures
1974-odd-unw
: booklet no.3, The Underworld & Wilderness
Adventures
1974-odd-rs
: reference sheet
D&D boxed set Holmes ed. (1977)
1977-ddholmes-box
D&D Moldvay ed. (1981)
1981-ddmoldvay-basic
: Basic boxed set
1981-ddmoldvay-expert
: Expert boxed set
D&D BECMI Mentzer ed. (1983)
1983-ddbecmi-b
: Basic boxed set
1983-ddbecmi-e
: Expert boxed set
1983-ddbecmi-c
: Companion boxed set
1983-ddbecmi-m
: Master boxed set
1983-ddbecmi-i
: Immortal boxed set
Advanced Dungeons & Dragons (1979)
1979-add1-mm
: Monster Manual
1979-add1-phb
: Player’s Handbook
1979-add1-dmg
: Dungeon Master Guide
Advanced Dungeons & Dragons 2nd (1989)
1989-add2-phb
: Player’s Handbook
1989-add2-dmg
: Dungeon Master Guide
1989-add2-mm
: Monstrous Compendium vol.1
Advanced Dungeons & Dragons 2nd Revised ed. (1995)
1995-add2r-phb
: Player’s Handbook
1995-add2r-dmg
: Dungeon Master Guide
1995-add2r-mm
: Monster Manual
Dungeons & Dragons 3rd ed. (2000)
2000-dd3-phb
: Player’s Handbook
2000-dd3-dmg
: Dungeon Master Guide
2000-dd3-mm
: Monster Manual
Dungeons & Dragons 3.5 ed. (2003)
2003-dd35-phb
: Player’s Handbook
2003-dd35-dmg
: Dungeon Master Guide
2003-dd35-mm
: Monster Manual
Dungeons & Dragons 4th ed. (2008)
2008-dd4-phb
: Player’s Handbook
2008-dd4-dmg
: Dungeon Master Guide
2008-dd4-mm
: Monster Manual
Dungeons & Dragons 5h ed. (2014)
2014-dd5-phb
: Player’s Handbook
2014-dd5-dmg
: Dungeon Master Guide
2014-dd5-mm
: Monster Manual
4. Déplacement de tous les fichiers
Tous les pdfs sont placés dans un dossier \pdfraw
à la racine du projet.
5. Préparation des pdf : OCR
Je lance une reconnaissance de caractères (OCR) dans les pdf numérisés qui n’ont pas encore reçu ce traitement. Il y en a peu (2 seulement).
Avec le logiciel Adobe Acrobat 2017 : Passe à 600 dpi. Traitement en lot possible mais la sélection des fichiers à reconnaître doit être faite manuellement.
Dans le logiciel PDF Converter Elite 5, l’OCR se fera toute seule lors de l’exportation (étape 6). Cela va même plus loin puisque ce dernier ignore les OCR effectuées et enregistrées précédemment et il refait les siennes (ça prend un temps fou du coup : 5h).
6. Exportation des PDF aux format TXT et XML.
Quand l’option est disponible, je choisis l’encodage UTF-8.
Avec Adobe Acrobat 2017
- TXT (brut, plain).
- TXT (accessible, acessible).
- XML 1.0 : sans images.
Traitement en lot décevant : 1) automatisation possible via le créateur d’Actions mais beaucoup trop de fenêtres intermittentes stoppant le processus et demandant des clics de validation; 2) quelques erreurs de transcriptions au format txt; 3) le format txt (Accessible) ignore beaucoup contenus de fichiers (0 Ko ou 3 Ko); 4) le format XML 1.0 est mal formé (très dur de le charger dans R) et contient plein d’erreurs.
Avec Calibre 4.13
Traitement en lot décevant aussi (le processus est facile et continu mais l’exportation échoue pour plusieurs PDF). Paramétrage nécessaire pour garder le nom de fichier original.
Avec le package pdftools
de R Studio
Globalement bon et rapide, mais il y a des erreurs et je n’arrive pas à identifier où car les logs d’erreurs ne le disent pas (mentions de PDF error: read ICCBased color space profile error
et PDF error: not an ICC profile, invalid signature
).
Syntaxe du code R pour charger les données :
# install.packages("pdftools")
library(pdftools)
# make a list of all pdf files in pdfraw folder
files <- list.files(path="pdfraw", pattern="*.pdf", full.names=TRUE)
# put all the files into a bigdata variable
bigdata <- lapply(files, pdf_text)
Avec PDF Converter Elite 5
Traitement en lot en continu. Comme mentionné précédemment : le logiciel lance un OCR sur tous les fichiers pdf numérisés, même ceux avec déjà une couche OCR.
Tableau de comparaison des exportations
Acrobat 2017 | Calibre 4.13 | pdftools | PDF Conv. 5 | |
---|---|---|---|---|
logiciel | propriétaire | libre | libre | propriétaire |
formats | xml 1.0 / txt:plain / txt:acessible | txt | txt | txt |
flux du traitement batch | interrompu constamment | quelques interruptions | continu | continu |
durée du traitement : 33 fichiers, 1Go total | 30 min. / 30 min. / 30 min. | 14 min. | 2 min. | 5h |
nb mots total du corpus (6 756 pages) en millions | 5,07 (c) / 4,68 (a) / 2,54 (a) | 3,44 (a) | 5,53 (b) | 4,69 (a) |
fichiers ignorés (ou dont +95% est manquant) | 0 / 4 / 33 | 11 | 1 | 6 |
Méthodes de calcul du nombre de mots du corpus
(a)
Calculé avec le logiciel Notepad++ et son plugin Combine 1.0 (à installer et qui combine tous les fichiers ouverts dans le logiciel dans un nouveau fichier).
Puis avec l’option Affichage (View) > Résumé (Summary) sur le nouveau fichier combiné.
(b)
Calculé en exportant les données de R Studio avec le script suivant :
#install.packages("erer")
library(erer)
write.list(bigdata,"output.txt")
Et ensuite avec l’option Affichage (View) > Résumé (Summary) sur le fichier output.txt
(vu le volume j’ai ignoré le mot result
mais il aurait pu être enlevé en multiremplacement dans NP++ pour un corpus plus petit, voir plus bas).
Bonus : un script R pour sortir les fichiers txt procédés par pdftools dans un dossier /pdfexports/pdftools
:
library(pdftools)
files <- list.files(path="pdfraw", pattern="*.pdf", full.names=TRUE)
nb_files <- length(files)
for(i in 1:nb_files) {
onefile <- pdf_text(files[i]) #1
x <- gsub("pdfraw/","",gsub(".pdf","",files[i])) #2
write(onefile,file=paste("pdfexports/pdftools/",x, ".txt", sep="")) #3
}
# 1. process (i) pdf file into onefile
# 2. strip the path and the .pdf to keep the core name
# 3. write a txt file in the subdirectory
# How to encode in utf-8?
(c)
J’ai tenté de charger les xml générés par Acrobat dans R Studio et créer un fichier compilé mais il y a beaucoup de messages d’erreur.
library(readr)
files <- list.files(path="pdfexports/acrobat_xml", pattern="*.xml", full.names=TRUE)
bigdata_xml <- lapply(files, read_csv)
# ici on s'aperçoit de plein de messages d'erreur
library(erer)
write.list(bigdata_xml,"output_xml.txt")
Du coup, j’ai combiné tous les fichiers xml comme dans le point (a). Puis, toujours dans NP++, je multiremplace (Ctrl+H) en mode Expressions régulières :
<[^>]*<[^>]*>[^>]*>|<[^>]*>
par rien.
Enfin, j’utilise l’option Affichage (View) > Résumé (Summary) pour compter le nombre de mots.
Moralité
- Le format pdf est un format atroce pour faire de la fouille de texte.
- pdftools de R Studio est rapide, gratuit mais il peut manquer des choses dans des pdf mal formés.
- Les exportations xml 1.0 de Acrobat ne sont pas bien formatées, en tout cas pas assez bien pour les charger aisément dans R Studio. Celle en plain txt est meilleure car moins verbeuse. Dans tous les cas, c’est fastidieux de cliquer à la main pour tous les fichiers.
- PDF Converter Elite 5 semble faire une exportation correcte et fluide tant qu’on le laisse tourner pendant la nuit.
Prochaine étape
Je vais faire une analyse plus qualitative des exportations en comparant les différents corpus de txt extraits.
Ce billet a été pré-rédigé dans HackMD puis exporté en html. Je le conseille vivement.
OpenEdition vous propose de citer ce billet de la manière suivante :
Pascal Martinolli (9 avril 2020). Fouille de texte dans les éditions de D&D (Étape 1 : choisir l’extraction pdf). Jeux de rôle sur table. Consulté le 3 octobre 2024 à l’adresse https://doi.org/10.58079/qk4z