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!
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!!
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.
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
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é !
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é.
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!
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.
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.
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.
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.
Try->Fail->Learn->Converge to success :
Architecte logiciel - Software craftsmanship convaincu.
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr
Try->Fail->Learn->Converge to success :
CTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr