|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Bonjour,
Alors que je suis en train de travailler sur un projet perso de petite GED, j'ai eu besoin d'un filtre pour l'indexation de SQL Server, afin de reconnaître et indexer le texte contenu dans des images. Voici donc le source de mon IFilter. Il est en version initiale, et est certainement perfectible. Il utilise Tesseract (Google projet d'un OCR open source). Je dois notamment améliorer l'utilisation de cet outil, afin de mieux l'intégrer à mon projet. N'hésitez pas à me contacter si vous avez des questions/suggestions, ou si vous désirez m'aider à l'améliorer ! Code :
|
||
|
|
00
|
|
|
#2 | ||||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Voici en pièce jointe une image que j'ai indexé dans une table de SQL Server (je suis sous XP, je n'ai donc pas pu valider que l'indexation de Windows Search fonctionnait, même si en toute logique, elle doit).
Image indexée : mcd2.PNG Contenu de la table : Code :
Code :
Code :
|
||||||
|
|
10
|
|
|
#3 |
|
Membre éprouvé
![]() Christophe Développeur .NET Inscription : juillet 2009 Messages : 412 ![]() |
Salut,
Merci c'est très intéressant ! Juste une question (suis nul en BDD): le texté extrait est stocké par le système réellement comme index comme une clé primaire par exemple? Merci, A+ PS: Sinon, une remarque: il me semble que dans notre GED, les fichiers sont stockés sur un filesystem et ce sont uniquement les métadonnées (ce qui est extrait du document) qui sont stockées dans la BDD pour gérer les recherches. Apparemment pr une question de perfs... |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
La DLL que je propose est un IFilter, c'est à dire un module utilisé par Index Server / Windows Search (et donc SQL Server) pour indexer les données textuelles d'un document.
Cela ne s'applique donc pas uniquement à SQL Server, mais le moteur de recherche de Windows aussi. Ensuite, dans SQL Server, il s'agit d'allimenter un index fulltext. Ca ne ressemble en rien à un index classique, et son utilisation est toute autre. Pour interroger un index fulltext, on utilise les fonctions CONTAINS ou FREETEXT (ou CONTAINSTABLE et FREETEXTTABLE). Dans l'implémentation que j'ai choisi (qui est indépendante du sujet de ce topic), je stocke le document dans un FileStream aussi. Je ne lis pas les méta-données du fichier (j'ajouterai peut-être cette fonctionnalité dans le future, mais ce n'est pas ce que je cherchais à faire au départ). Je ne stocke rien d'autre dans la base de données. En revanche, lorsque le service d'indexation fulltext va analyser l'image, il va récupérer le texte retourné par l'OCR. Et c'est ça qu'il va mettre dans son index. En revanche, il est impossible de retrouver ce texte, j'ai pris la décision de ne pas le stocker, de la même façon qu'on ne s'amuse pas à recopier le texte contenu dans un document Word ou PDF dans la base de la GED. Le IFilter se contente juste de faire une reconnaissance des caractères sur le fichier, puis de renvoyer au moteur d'indexation le texte détecté. Il n'y a aucune modification du fichier source, ni création d'un autre fichier/donnée. |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Pour lire les méta, je pense me baser sur ces liens :
http://msdn.microsoft.com/fr-fr/library/xddt0dz7.aspx http://www.switchonthecode.com/tutor...ta-with-csharp Le truc chiant, c'est que je vais devoir m'amuser avec les GetChunk(), GetValue() et tout le tralala, que j'avais gentillement esquivé dans le code actuel |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Nathanael MarchandExpert .Net So@t Inscription : octobre 2008 Messages : 3 520 ![]() |
C'est intéressant comme truc ca
N'hésite pas à en faire un article sur Developpez si ca te tente
__________________
Retrouvez moi sur : |
|
00
|
|
|
#7 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Je vais essayer de le compléter avant de faire un tel article.
Il faut absolument que j'ajoute la gestion des méta-données, et si possible, l'interfaçage à une DLL pour l'OCR, plutôt que la méthode actuelle (qui marche, certes). |
|
|
00
|
|
|
#8 |
|
Membre éprouvé
![]() Christophe Développeur .NET Inscription : juillet 2009 Messages : 412 ![]() |
|
|
|
00
|
|
|
#9 | ||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Un petit UP pour vous indiquer que j'ai fini par trouver une DLL permettant d'utiliser Tesseract 3 avec C#.
http://code.google.com/p/tesseractdotnet/ Je ne l'ai pas compilée moi-même, car je n'ai pas VC++ sur mon poste. Ce n'est pas non plus la version qu'on trouve dans le lien ci-dessus, car elle ne fonctionne pas sur mon PC. Il s'agit donc de la version que j'ai trouvé ici : http://code.google.com/p/tesseractdo...es/detail?id=1 (Lien direct : http://tesseractdotnet.googlecode.co...A1327575785561) J'en ai profité aussi pour supprimer les logs de DEBUG. Je n'ai pas ajouté de nouvelle fonctionnalité au programme, en revanche ses performances et sa stabilité doivent être largement améliorées par l'utilisation directe d'une DLL pour faire le travail plutôt qu'un EXE avec génération d'un fichier texte temporaire sur le disque... Cela devrait aussi résoudre d'éventuels problèmes de droits d'accès (le service d'indexation n'a pas forcément accès en écriture/suppression au dossier où se trouve la DLL). Code :
Si vous ne désirez pas l'utiliser, vous pouvez tenter de supprimer la ligne Code :
Si vous voulez utiliser une autre langue, il suffit de vous rendre sur le site du projet TesserAct et télécharger un autre dictionnaire. http://code.google.com/p/tesseract-ocr/ |
||||
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : mars 2005 Messages : 15 ![]() |
Salut,
Serai-t-il possible d'avoir un exemple d’implémentation ? Merci beaucoup ! |
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Bonjour,
Le code ci-dessus compile. Ensuite tu n'as plus qu'à enregistrer convenablement la DLL produite (c'est un peu complexe à faire, il y a des tas de références croisées dans tous les sens) et ensuite ça marche tout seul. En pièce jointe, tu trouveras le projet complet que j'ai créé. |
|
|
00
|
|
|
#12 |
|
Membre expérimenté
![]() Inscription : septembre 2007 Messages : 1 107 ![]() |
Bonjour,
j'utilise actuellement un logiciel OCR et je stocke son contenu dans un ficher .txt. Puis á l'aide d'un streamreader, je stocke le contenu du fichier texte dans ma base sqlserver.(VARCHAR(MAX)), seulement voila, la base étant limité en taille je me demade si l'indexation ne serait pas une solution. Par contre je ne comprends pas ce que vous stocker dans la base, ni comment, Avez-vous un exemple pour faire cela. Merci d'avance |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com