Partage
  • Partager sur Facebook
  • Partager sur Twitter

Développement solution d'OCR d'un PDF

Ruby, Javacript, AngularJS

    7 janvier 2019 à 9:24:03

    Bien le bonjour!

    Je viens à vous avec un question à laquelle j'ai du mal à répondre seul. Je cherche, pour mon travail, un moyen d'OCRiser un PDF. C'est à dire, pour ceux qui ne savent pas de quoi il s'agit, récupérer le texte sur un PDF et l'utiliser ensuite. En ruby on rails j'y arrive très bien avec le gem PDF-reader. Par contre il m'est difficile de traiter ce texte correctement.

    Pourquoi?

    Parce que mes documents PDF ne sont pas forcément des pages de texte ligne par ligne, mais sont des CVs. Je peux donc avoir toutes sortes de formes, apparences,...

    Donc la question finale de ce sujet ce serait. Serait-il possible de détecter les "Blocs" de texte? Ce qui séparerait ainsi les expériences, les éducations, les coordonnées, etc... Et du coup traiter ces données en cherchant quel "bloc" commence par "Expériences" et savoir que ce "Bloc" sont les expériences. 

    Si cela est possible en Ruby on rails ou javascript je suis preneur de la moindre informations que vous pouvez m'apportez!

    Merci d'avance!

    Bonne semaine!

    • Partager sur Facebook
    • Partager sur Twitter
      7 janvier 2019 à 14:14:27

      Bonjour Maf,

      Bien sur que c'est possible, la plus parts des API servant à faire de l'OCR ont une fonction pour récupérer par "blob"/"group"/"region" etc.

      Exemple avec Google vision :

      En fait ca dépend surtout de ton API qui fournit l'info, il faut regarder dans les descriptions fonctionnelles.

      • Partager sur Facebook
      • Partager sur Twitter

      Try->Fail->Learn->Converge to success :{\displaystyle Q[s,a]:=(1-\alpha )Q[s,a]+\alpha (r+\gamma ~max_{a'}Q[s',a'])}

        7 janvier 2019 à 15:05:46

        Ah super je vais chercher plus en détails alors! Pour l'instant j'utilise le Gem ruby on rails PDF-reader mais une librairie Javascript fera tout aussi bien le taff je pense!

        Je retourne me plonger dans de la doc et vous tiens au courant!!

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          7 janvier 2019 à 19:27:47

          Bah, en fait une fois que l'API google t'a decouper les block, t'a juste a le passer dans n'importe quelle lib d'OCR.
          • Partager sur Facebook
          • Partager sur Twitter

          Architecte logiciel - Software craftsmanship convaincu.

            8 janvier 2019 à 9:39:09

            Bonjour,

            En effet les textes d'un PDF ne sont pas ordonnés.

            J'avais réalisé un programme qui lui aussi permettait d'analyser le contenu de documents PDF. Comme tu le fais ça consistait à découper le contenu en bloc de texte, puis en sortir des caractéristiques (quelles sont les premières lettres, taille et style de police, longueur...).

            Tu mets quelques documents d'exemple dans un modèle de machine-learning en associant à chaque bloc sa nature, et ensuite ton modèle pourra trouver de lui-même où est le nom, l'âge, les expériences, l'éducation, la photo, etc...

            Je l'avais fait sur des grands ensembles de document, le résultat est stupéfiant. J'arrivais à deviner que tel bloc était un titre, une légende, un numéro de page, un nom d'auteur, une référence, un résumé... et tout cela avec une marge d'erreur inférieure à celle d'un humain.

            • Partager sur Facebook
            • Partager sur Twitter

            cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

              8 janvier 2019 à 10:24:52

              Bonjour

              Tout cela m'a l'air bien complexe mais c'est exactement ce que je cherche à faire!! J'ai juste quelques questions si vous le permettez. En quoi avez vous développé ce programme? car je ne peux utiliser que des langages web, en priorité Ruby on rails et Javascript.

              J'ai un peu de mal avec le machin-learning, je n'en ai jamais fais même. Avez vous une sorte de tuto, de bible du machin-learning qui me permettrait d'en mettre en place rapidement?

              Merci d'avance,

              bonne journée

              EDIT:

              Bon finalement j'ai fais énormément de recherche et je pense avoir une idée de comment fonctionne le machine learning mais certaines zones restent flous. 

              Comme par exemple, où sont stocké les modeles? En DB?

              Comment l'IA va pouvoir comparer une chaine de caractères à d'autres? J'ai du mal à voir comment il peut définir un chaine comme un nom et prenom alors que les modèles sont 2 mots un à coté de l'autres, parfois 3 ou 4 mots si plusieurs prénoms.. Et un nom d'entreprise peut très bien être le même format qu'un prénom et comment il peut faire la différence entre ces 2 choses la? 

              Une fois la comparaison faites, imaginons que celle ci soit réussie. La nouvelle données doit être enregistré pour servir de modèle. Mais qu'est ce qui va prouver qu'il ne s'est pas trompé? Et l'enregistrement ce fait en DB aussi du coup? si c'est bien en DB que cela se fait ^^

              Merci d'avance

              -
              Edité par Maf. 8 janvier 2019 à 14:07:37

              • Partager sur Facebook
              • Partager sur Twitter
                8 janvier 2019 à 18:00:54

                De mon côté tout était fait en Java SE. J'ai créé une appli de bureau avec une UI en Swing. Pour la partie machine learning, on utilisait Wapiti, un script en C utilisant la méthode CRF et développé par un chercheur français. C'est particulièrement efficace pour traiter des données ayant un lien entre elles, comme le langage ou, ici, des suites de blocs de texte.

                C'est une implémentation comme une autre, tu peux en trouver dans plusieurs langages ou faire appel à des webservices de machine learning (souvent payants au vu de la conso de ressources).

                Pour le machine learning, tu peux réussir à l'utiliser sans forcément comprendre les notions mathématiques derrière. La partie minimale à maîtriser, c'est savoir formater tes données, créer un modèle et l'utiliser.


                Pour le stockage des modèles ça dépend de quel outil de learning tu utilises. Avec celui que l'utilise (Wapiti) tout fonctionne en ligne de commande (appelées depuis Java) avec des fichiers en entrée et en sortie.
                Pour permettre à l'IA de te comprendre, il lui faut des données formatées. Dans ton cas, ce seront les caractéristiques des blocs de texte. Par exemple : les 3 premières lettres, la taille de la police, le style gras ou non, le nombre de mots...

                Ainsi, chaque PDF sera transformé en une suite d'ensemble de caractéristiques.

                Tu vas manuellement indiquer à partir de plusieurs PDF quel bloc est le nom, l'âge, le numéro de téléphone, etc... Tu auras ainsi le résultat que tu veux obtenir pour ce bloc

                Tu vas utiliser ces données pour créer un modèle. Pour cela, tu calcules les caractéristiques que tu donnes au programme d’apprentissage, avec les résultats attendus. En sortie, tu obtiens un modèle.

                Désormais, avec n'importe quel PDF, tu calcules des caractéristiques, tu les traites avec le modèle, qui lui te donnera les résultats déduis des caractéristiques, d'après son apprentissage.

                Pour ta question sur l'endroit où stocker tout ça c'est libre, ce sont des détails d'architecture et ils peuvent dépendre de ton moteur d'apprentissage. Pour ma part c'était des fichiers, avec 1 ligne = paragraphe, et chaque colonne de la ligne correspondait à une caractéristique (avec un espace en séparateur). Le résultat attendu était la dernière colonne de la ligne. C'est le format attendu par Wapiti.

                Pour les données utilisées pour créer le modèle, c'est un humain qui doit renseigner la valeur correcte. Il n'y a ainsi pas d'erreur sur les données d’apprentissage.

                Quand tu utilises le modèle ensuite, les données ne sont pas "ingérées" par celui-ci. Il ne change pas sa méthode de calcul et n'est pas pollué par ses propres erreurs. 

                Toute la performance dépendra de la qualité des données d'entrée et de la pertinence des caractéristiques calculées. Tu as aussi la possibilité de guider le moteur d'apprentissage sur la manière d'exploiter les caractéristiques. Cela permet de configurer l'importance de chaque caractéristique, et d'indiquer si elles doivent s'influencer entre elles (mais là ça devient plus complexe, il m'a fallu 4 mois pour bien le gérer. Cf "template" dans Wapiti).

                Donc oui c'est un peu compliqué, mais les performances sont là :) Pour des CV tu dois facilement dépasser 95% des données récupérées sans erreur.

                Si tu veux un moteur de machine learning bien documenté et robuste tu as TensorFlow qui est open source, et maintenu par Google.

                Si c'est pour automatiser la saisie de quelques CV dans votre système d'information c'est peut-être aller trop loin. Si par contre vous voyez à grande échelle, le temps de dev peut devenir rentable.
                Sinon, si ta boîte veut une solution sur-mesure pour intégrer les CV (ou tout autre doc) à votre SI, je vous le fait pour 15-20k€ d'ici à cet été !

                -
                Edité par The_Javatar 8 janvier 2019 à 18:05:24

                • Partager sur Facebook
                • Partager sur Twitter

                cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

                  9 janvier 2019 à 8:57:22

                  Wow! Un énorme merci pour cette réponse complète! Je vais bien lire tout ça et faire de mon mieux! Je vous tiendrez informé de mon avancement!

                  Merci pour le temps passé pour me répondre! Merci Beaucoup et bonne journée!

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 janvier 2019 à 9:29:18

                    Après il n'y a pas forcément besoin de machine learning pour cette tache,

                    si c'est à petite échelle c'est un peu sortir le bazooka pour tuer une mouche.

                    Tu peux juste faire une base de connaissance, avec des mots clef servant à identifier chaque "zone" en leur donnant une pondération.

                    Avec un peu d'intelligence algorithmique tu peux identifier les principales, par exemple :

                    [X] chiffres+ "rue | chemin | avenue| etc" => C'est la zone adresse.

                    Les Regex sont utiles dans ce cas là.

                    Par exemple, si tu trouve un mail dans la zone, c'est +10 pour la zone "contact", si tu trouve un numéro de téléphone, c'est +10 aussi. Si tu vois le mot "numéro" ou "téléphone", c'est juste +1, car il peut parler de ces choses dans ses expériences.

                    Si tu vois le mots "stage" ou "CDI" etc, c'est +X pour la zone "Expérience".

                    Bref, t'as compris le concept, tu fais un dico de mot clef par zone, et tu fais une recherche trié par pondération, avec un seuil, si t'es à +X, alors tu considère que c'est suffisant pour que cette zone soit correctement identifié.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Try->Fail->Learn->Converge to success :{\displaystyle Q[s,a]:=(1-\alpha )Q[s,a]+\alpha (r+\gamma ~max_{a'}Q[s',a'])}

                      9 janvier 2019 à 13:32:26

                      j'aime beaucoup cette méthode également! Après discussion avec mon patron, on va je pense commencer par un algorithme simple sans machine learning. Puis une fois qu'on aura un algorithme qui fonctionne bien seul, travailler sur une machine learning pour un travail encore plus poussé. Donc finalement le premier problème ce serait un gem ou une API capable de détecter les blocs sur un PDF. Pour l'instant je pensais simplement chercher le texte compris entre les mots clefs tel que "Experiences" et "Formations". Cela ressortirait donc les expériences mais imaginons que les expériences soient après les formations et d'autres tests sont à faire. Bref ça va être un algorithme plutôt complexe mais je devrais m'en sortir! 

                      Merci pour cette réponse

                      Bonne journée

                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 janvier 2019 à 14:26:51

                        La méthode algorithmique marchera bien si les CV sont bien structurés, vous aurez des résultats plus rapidement. 

                        Il y a aussi des solutions toutes prêtes et plutôt efficaces qui existent : https://aircto.com/resume-parser

                        Mais c'est plus amusant à faire soi-même ;) 

                        • Partager sur Facebook
                        • Partager sur Twitter

                        cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

                          9 janvier 2019 à 15:22:18

                          Ca a l'air d'être exactement ce qu'on cherche à faire! Merci! 

                          Certes c'est plus amusant à faire soit même mais on est un peu court sur les durées et j'ai pas encore les compétences de faire quelque chose de fiable en peu de temps (Je sors tout juste de mes études)

                          Je vais me pencher sur cette API, en comparer d'autres niveau prix et on verra ce que cela donne. 

                          Merci bonne journée

                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 janvier 2019 à 15:28:33

                            Si les CV sont bien structurés, alors ca fonctionnera.

                            Si le CV est mal structuré, alors peut être que c'est une raison suffisante pour ne pas l'embaucher x)

                            Je dis ça comme ça, mais dans un sens, le fait de tout passer via un OCR pour lire un CV, on perd le côté "travaillé" du CV, qui lui aussi à son importance.

                            Si l'algo n'arrive pas à comprendre le CV, alors peut être que c'est aussi à prendre en compte.

                            La question c'est, comme on fait pour savoir si un CV est bâclé, raté, incompressible ou pas ? Il faudra p'tet voir une vois le CV analysé ce que donne l'analyse, et si le résultat semble avoir un format assez proche des autres ou non. En dans ces cas là, il faudra l’analyser à la main car ça pourrait éventuellement être un CV réussi, mais très graphique.

                            Il ne faut pas oublié que la plupart des CV actuellement sont de moins en moins verbeux. D'ailleurs, il arrive aussi de tomber sur des CV web, et non pas au format PDF. J'ai un ami qui par exemple "note" ses compétences techniques un comme comme sur ce forum, c'est à dire colorié 3 cases sur 5 pour dire qu'on a un niveau intermédiaire, ou 5 cases sur 5 pour dire qu'on est un expert.

                            Dans ce cas, l'OCR va voir des carrés, qu'il va sans doute considérer comme étant de la déco, alors qu'en fait ça a une réelle valeur.

                            -
                            Edité par Tiffado 9 janvier 2019 à 15:32:41

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 janvier 2019 à 15:35:46

                              Pour le CV original, on aura toujours la possibilité de le voir. L'OCR du CV permettrait juste à l'utilisateur de ne pas avoir à remplir un formulaire d'une 10aine de page pour y mettre des informations qui sont deja sur son CV.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Développement solution d'OCR d'un PDF

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown