pd3f-core
Expérimental, à utiliser avec précaution.
pd3f-core
est un package Python permettant de reconstruire le texte continu original à partir de PDF avec des modèles de langage. pd3f-core
suppose que votre PDF est soit basé sur du texte, soit déjà OCRd. pd3f-core
est au cœur de pd3f : un pipeline d'extraction de texte complet basé sur Docker (y compris OCR).
pd3f-core
utilise d'abord Parsr pour diviser les PDF en lignes et en paragraphes. Ensuite, il utilise le package Python dehyphen pour reconstruire les paragraphes de la manière la plus probable. La probabilité est dérivée en calculant la perplexité avec les modèles de langage basés sur les caractères de Flair. Les traits d'union inutiles sont supprimés, les espaces ou les nouvelles lignes sont conservés ou supprimés en fonction des mots environnants.
Il est principalement développé pour l'allemand mais devrait également fonctionner avec d'autres langues. Le projet en est encore à ses débuts. Attendez-vous à des aspérités et à des changements rapides.
Documentation API de pd3f-core : https://pd3f.github.io/pd3f-core/index.html
Documentation de pd3f (le ) : https://pd3f.com/docs/
Vérifiez si deux lignes peuvent être jointes en supprimant les traits d'union («-»).
Choisissez entre l'ajout d'un simple espace (' ') ou d'une nouvelle ligne ('n') lors de la jonction de lignes.
Vérifiez si le dernier paragraphe d'une page et le premier paragraphe de la page suivante peuvent être joints.
Afin de joindre des paragraphes (et d'inverser les sauts de page), détectez les notes de bas de page et transformez-les en notes de fin. Pour l'instant, les notes de bas de page sont placées à la fin d'un fichier.
Si l'en-tête ou le pied de page sont les mêmes pour toutes les pages, affichez-les une seule fois. Les en-têtes sont placés au début du document et le pied de page jusqu'à la fin. Certaines heuristiques basées sur la similitude des pieds de page sont utilisées. (Distance Jaccard pour le texte et comparaison des formes qui se chevauchent)
pip install pd3f
ou
poetry add pd3f
Démarrez une instance Parsr locale :
docker-compose up
(Vous pouvez également utiliser le tunneling vers une instance Parsr distante (script) ou choisir une adresse distante.)
from pd3f import extract
text , tables = extract ( file_path , tables = False , experimental = False , force_gpu = False , lang = "multi" , fast = False , parsr_location = "localhost:3001" )
Explications des paramètres dans la doc : https://pd3f.github.io/pd3f-core/export.html#pd3f.export.extract
L'utilisation de CUDA accélère l'évaluation avec Flair. Mais vous avez besoin d’un GPU (coûteux). Vous devez configurer votre GPU avec CUDA. Voici un guide pour Ubuntu 18.04
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
(exemple)pd3f-core
avec poésie : poetry add pd3f
La poésie se rend compte qu'elle est exécutée dans un environnement virtuel conda afin de ne pas en créer un nouveau. Étant donné que la configuration de CUDA est difficile, installez-le de la manière la plus simple (avec conda).
Au cœur de pd3f-core
se trouve la sortie JSON de Parsr. Quelques commentaires sur comment et pourquoi certaines choses ont été choisies. Documentation de Parsr sur les différents modules
Parsr dispose de plusieurs modules pour classer les paragraphes en certains types. Ils proposent une liste de détections ainsi qu'une détection de cap. D'après mon expérience, la précision est trop faible pour les deux, nous ne l'utilisons donc pas pour le moment. Cela signifie également que tout le texte extrait (de sortie) est plat (pas de titres, de formats différents, etc.).
Nous activons Dessin + Détection d'image car nous aurons peut-être besoin de comprendre quel paragraphe suit quel autre. Cela peut être utile pour décider de joindre ou non des paragraphes. Mais il est supprimé lors de l'activation du réglage fast
.
Dans la sortie JSON se trouve un champ pageNumber
. Cela vient du module de détection de page. Ainsi, pageNumber
est dérivé de l'en-tête/pied de page de chaque page. Il peut donc être différent de l'index du tableau de pages. Ne relayez pas pageNumber
dans la sortie JSON.
words-to-line-new
ont été utilisés comme ceci. Il n'y a pas d'erreur mais la précision diminue si elle est utilisée autrement.
" words-to-line-new " ,
[
" reading-order-detection " ,
Ne faites pas d'OCR avec Parsr car les résultats sont pires qu'OCRmyPDF (car ce dernier utilise le prétraitement d'image).
Installez et utilisez la poésie.
Licence publique générale Affero 3.0