{"word_count": 1088, "character_count": 7830}
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ées1. Sélection du corpus des donnéesSeuls les livrets ou la boîte de base de chaque édition de D&#38;D sont sélectionnées.2. Récolte des différentes éditions en pdfCette 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 fichiersOld Dungeons &#38; Dragons (1974 ed.)1974-odd-mnm : booklet no.1, Men &#38; Magic1974-odd-mnt : booklet no.2, Monsters &#38; Treasures1974-odd-unw : booklet no.3, The Underworld &#38; WildernessAdventures1974-odd-rs : reference sheetD&#38;D boxed set Holmes ed. (1977)1977-ddholmes-boxD&#38;D Moldvay ed. (1981)1981-ddmoldvay-basic : Basic boxed set1981-ddmoldvay-expert : Expert boxed setD&#38;D BECMI Mentzer ed. (1983)1983-ddbecmi-b : Basic boxed set1983-ddbecmi-e : Expert boxed set1983-ddbecmi-c : Companion boxed set1983-ddbecmi-m : Master boxed set1983-ddbecmi-i : Immortal boxed setAdvanced Dungeons &#38; Dragons (1979)1979-add1-mm : Monster Manual1979-add1-phb : Player’s Handbook1979-add1-dmg : Dungeon Master GuideAdvanced Dungeons &#38; Dragons 2nd (1989)1989-add2-phb : Player’s Handbook1989-add2-dmg : Dungeon Master Guide1989-add2-mm : Monstrous Compendium vol.1Advanced Dungeons &#38; Dragons 2nd Revised ed. (1995)1995-add2r-phb : Player’s Handbook1995-add2r-dmg : Dungeon Master Guide1995-add2r-mm : Monster ManualDungeons &#38; Dragons 3rd ed. (2000)2000-dd3-phb : Player’s Handbook2000-dd3-dmg : Dungeon Master Guide2000-dd3-mm : Monster ManualDungeons &#38; Dragons 3.5 ed. (2003)2003-dd35-phb : Player’s Handbook2003-dd35-dmg : Dungeon Master Guide2003-dd35-mm : Monster ManualDungeons &#38; Dragons 4th ed. (2008)2008-dd4-phb : Player’s Handbook2008-dd4-dmg : Dungeon Master Guide2008-dd4-mm : Monster ManualDungeons &#38; Dragons 5h ed. (2014)2014-dd5-phb : Player’s Handbook2014-dd5-dmg : Dungeon Master Guide2014-dd5-mm : Monster Manual4. Déplacement de tous les fichiersTous les pdfs sont placés dans un dossier \pdfraw à la racine du projet.5. Préparation des pdf : OCRJe 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.13Traitement 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 StudioGlobalement 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 folderfiles &#60;- list.files(path="pdfraw", pattern="*.pdf", full.names=TRUE)# put all the files into a bigdata variablebigdata &#60;- lapply(files, pdf_text)Avec PDF Converter Elite 5Traitement 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 exportationsAcrobat 2017Calibre 4.13pdftoolsPDF Conv. 5logicielpropriétairelibrelibrepropriétaireformatsxml 1.0 / txt:plain / txt:acessibletxttxttxtflux du traitement batchinterrompu constammentquelques interruptionscontinucontinudurée du traitement : 33 fichiers, 1Go total30 min. / 30 min. / 30 min.14 min.2 min.5hnb mots total du corpus (6 756 pages) en millions5,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 / 331116Mé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) &#62; 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) &#62; 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 &#60;- list.files(path="pdfraw", pattern="*.pdf", full.names=TRUE)nb_files &#60;- length(files)for(i in 1:nb_files) {  onefile &#60;- pdf_text(files[i]) #1   x &#60;- 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 &#60;- list.files(path="pdfexports/acrobat_xml", pattern="*.xml", full.names=TRUE)bigdata_xml &#60;- lapply(files, read_csv)# ici on s'aperçoit de plein de messages d'erreurlibrary(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 :&#60;[^&#62;]*&#60;[^&#62;]*&#62;[^&#62;]*&#62;|&#60;[^&#62;]*&#62; par rien.Enfin, j’utilise l’option Affichage (View) &#62; 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 étapeJe 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.