VBTextFinder : un moteur de recherche de mot dans son contexte
en VBA, VB6 et VB .Net
https://github.com/PatriceDargenton/VBTextFinder
Ancien dépôt : https://codes-sources.commentcamarche.net/source/46695
Documentation : VBTextFinder.html
Code source : VBTextFinder.vbproj.html
http://patrice.dargenton.free.fr/CodesSources/index.html
Version 1.25 du 05/08/2024
VBTextFinder permet de retrouver l'ensemble des phrases (et paragraphes) contenant un mot donné que l'on recherche dans un corpus documentaire préalablement indexé (un corpus est un ensemble cohérent de documents).
Comment ça marche ? c'est très simple : lors de l'indexation d'un document, les phrases sont découpées en mots, et une collection de mots est construite en complétant la liste des numéros de phrase contenant ce mot, toutes les phrases étant conservées en intégralité avec l'index des mots qui en font partie. Ensuite, pour retrouver l'ensemble des phrases contenant un mot donné présent dans l'index, il suffit de parcourir la liste des phrases référencées par ce mot, cette recherche étant quasi-instantanée, même avec de gros document. Tout le travail est fait dans l'objet Collection de VB (une hashtable dans la version DotNet).
En bonus, certaines statistiques sont disponibles. De plus, si on précise des codes mnémoniques courts associés de façon unique à chaque document indexé, alors VBTextFinder est capable de produire un index alphabétique ou fréquentiel avec ces codes mnémoniques. Par exemple, si j'indexe plusieurs documentations de mes logiciels avec les codes mnémoniques suivants :
VBWaveComp.txt (VBWC)
VBSpamCheck.txt (VBSC)
VBLocker.txt (VBLck)
VBBrainBox.txt (VBBB)
VB2Html.txt (VB2H)
ODBCDotNet.txt (ODBCDN)
DVDClass.txt (DVDC)
VBTextFinder peux alors produire un index alphabétique dont voici un extrait :
...
applicable (1 : VBBB)
applicables (3 : VBBB)
application (45 : DVDC, ODBCDN, VB2H, VBBB, VBLck, VBSC, VBWC)
applications (16 : DVDC, VBBB, VBLck)
appliquant (1 : VBBB)
appliqué (2 : DVDC, VBBB)
appliquée (1 : VBBB)
appliquées (4 : VBBB)
appliquer (14 : ODBCDN, VBBB, VBSC)
appliqués (2 : DVDC, VBSC)
appliquez (1 : VBWC)
...
et un index fréquentiel dont voici un extrait :
...
57 : audio (DVDC, VBLck, VBWC)
57 : access (DVDC, ODBCDN, VB2H, VBBB)
56 : windows (DVDC, ODBCDN, VB2H, VBBB, VBLck, VBSC, VBWC)
56 : votre (DVDC, ODBCDN, VBBB, VBLck, VBSC, VBWC)
55 : spam (VBSC)
55 : patrice (DVDC, ODBCDN, VB2H, VBBB, VBLck, VBSC, VBWC)
55 : entre (DVDC, ODBCDN, VBBB, VBSC, VBWC)
54 : dargenton (DVDC, ODBCDN, VB2H, VBBB, VBLck, VBSC, VBWC)
53 : votant (DVDC)
53 : règles (VBBB, VBSC, VBWC)
...
Il faut choisir un code mnémotechnique facile à retenir, si on ne précise rien, on utilise par défaut Doc n°1, Doc n°2..., ou rien s'il n'y a qu'un seul document. Ces codes sont stockés dans un fichier ini (simple fichier texte) pour faciliter l'étiquetage.
J'ai développé ce code en un week-end !... mais je le peaufine depuis plus de 4 ans ! je me suis enfin décider à le publier ; la version DotNet possède quelques fonctionnalités en plus et sa présentation des résultats est plus pertinente, cependant j'ai fait attention à ce que l'index soit compatible entre les versions.
Autre bonus : il y a une version Excel ainsi qu'une version Word : les utilisateurs du VBA Excel ou Word sont encore plus nombreux que ceux de VB ! ces deux versions sont bien la preuve que l'environnement VBA est un environnement de développement complet en Visual Basic, il n'y a guère que la compilation optimisée qui manque. Vous pouvez constater que le code source est strictement identique à 100% à celui de VB6, j'ai juste utilisé la compilation conditionnelle pour switcher l'initialisation du code entre les différentes versions. En fait, seuls les contrôles de l'interface ne peuvent pas être copiés/collés entre VB6 et VBA Word ou Excel, mais cela fonctionne entre Word et Excel. Les contrôles ne sont pas identiques, mais tout est compatible en faisant attention à deux ou trois subtilités.
Table des matières
Fonctionnalités supplémentaires de la version DotNet
Précisions sur la gestion des accents
Exemple : recherche dans les proverbes
Pour indexer une série de fichiers .txt
Pour indexer une série de fichiers .doc ou .htm ou .html
Pour indexer une arborescence de fichiers
Pour indexer des documents contenants des caractères exotiques : Unicode
Pour indexer les accents de façon à les distinguer dans les recherches
Arguments possibles pour la ligne de commande
Fichier externe pour les séparateurs de phrase
Fichier externe pour les séparateurs de mot
Fichier externe pour les mots courants
Fichier externe pour les mots du dictionnaire
Intersection d'index d'un texte dans deux langues
Outil pour extraire les citations
Mise en évidence des occurrences dans la page html
Détection des chapitres (ou autres sections)
Exemples de génération de mots clés
Recherche d'une expression exacte
Recherche de mots et expressions : solution palliative
Version 1.03 du 18/05/2008 (première version sur VBFrance)
Version 0.01 du 10/04/2004 : Première version beta
Historique des versions VBA/VB6
Indexation d'autres types de document
- Exportation : les résultats de recherche peuvent être copiés / collés dans le presse papier ;
- Choix du nombre de paragraphes à afficher avant ou après chaque phrase afin de mieux saisir le contexte dans certain cas (1, 2 ou 3 paragraphes avant et après dans les versions VBA et VB6, et illimité dans la version DotNet via la barre de défilement à gauche) ;
- Gestion des fichiers Word .doc ou bien Html : il y a une procédure pour convertir automatiquement le fichier en .txt en utilisant l'automation de Word ; on peut aussi utiliser les menus contextuels dans l'explorateur de Windows afin d'indexer rapidement un document à la volée ;
- Affichage d'un indicateur si le mot est trouvé directement pendant la frappe, avec le nombre d'occurrences correspondant ;
- Mémorisation des mots recherchés successivement (comme dans la barre d'outil de Google) ;
- Mode hypertexte : il est activé lorsque l'on fait un double-clic sur un mot dans les phrases affichées dans la zone des résultats de recherche (pour les versions VBA, il faut ensuite cliquer sur le bouton Rechercher) ;
- Sauvegarde : si au moment de quitter l'application on souhaite conserver l'index, une sauvegarde de l'index est effectuée dans le fichier VBTextFinder.idx. Au lancement de VBTextFinder, si ce fichier est présent (dans le dossier de l'application), on propose de le recharger ;
- Création d'un index des mots dans Word (avec la liste des codes document le contenant) selon un tri alphabétique ou fréquentiel au choix (cf. la fonction équivalente de VBDico) : les versions VBA et VB6 sont limitées en taille, Word refusant de trier une trop grande liste de mots (il suffit de le tester sous Word : menu Tableau : Trier...) ; Astuce : il suffit d'utiliser la version DotNet, elle fonctionne aussi avec un index créé à partir des versions VBA et VB6, et elle n'utilise pas le tri de Word.
- Affichage de toutes les occurrences en html (et non seulement en partie), et mise en évidence en couleurs ou en gras des occurrences ;
- Gestion des accents en option (en VBA ou VB6 les accents sont toujours pris en compte, en DotNet, les accents sont ignorés par défaut), voir ci-dessous pour le détail ;
- Sélection de plusieurs fichiers à indexer (ou a convertir au préalable), par exemple *.txt, *.doc ou *.html ;
- Création d'une liste de mot clés : il s'agit de la liste des n mots les plus fréquents, une fois que l'on a retiré les mots non signifiants tel que : de le la et..., voir les exemples ici ;
- Gestion d'un dictionnaire : en décochant "Mots dico" les index seront générés sans les mots qui font partie du dictionnaire, ce qui permet de lister tous les mots propres indexés ;
- Gestion des mots courants : en décochant "Mots courants" les index seront générés sans les mots courants ;
- Gestion des fichiers externes en option ;
- Outil pour extraire les citations ;
- Détection des chapitres ;
- Désallocation en RAM : instantanée en DotNet, et assez long en VBA et VB6 : de l'utilité du ramasse-miettes !
- La version VBA/VB6 indexe les accents, de sorte qu'il faut obligatoirement saisir les mots avec les accents pour pouvoir les retrouver (on risque donc de ne pas trouver les mots auxquels les accents manquent). La version DotNet peut indexer avec ou sans les accents, c'est configurable (par défaut les accents ne sont pas indexés, on ne risque donc pas d'oublier des mots lors d'une recherche) ;
- La version VBA/VB6 indexe "cœur" avec œ collé et peut trouver la phrase même si on tape oe séparé : on peut donc taper aussi bien cœur que coeur pour trouver cœur ou coeur indistinctement ; tandis qu'avec la version DotNet, cela dépend si on indexe les accents ou pas : si oui, alors ces lettres sont distinctes et donc indépendantes (ce qu'on ne peut pas faire en VBA/VB6), et si les accents ne sont pas indexés (fonctionnement par défaut), cela fonctionne comme dans la version VBA/VB6 ;
- Substitution des caractères : lors de la conversion en .txt des fichiers .doc ou .html, la version VBA/VB6 substitue les caractères spéciaux en caractères normaux (par exemple … en ...). Dans la version DotNet, ce défaut est corrigé (on peut facilement le corriger aussi dans la version VB6/VBA, il suffit d'ajouter : oWrd.ActiveDocument.SaveAs : AllowSubstitutions:=False) ;
- Voir aussi : Pour indexer des documents contenants des caractères exotiques : Unicode.
Le fichier d'exemple Proverbes.txt fourni est situé dans le même répertoire que l'application VBTextFinder : cliquez sur le bouton "Ajouter le(s) document(s)", ensuite fermez simplement le document VBTextFinder.ini qui s'est affiché : c'est prêt : vous pouvez commencez une recherche : tapez par exemple temps dans la zone de recherche : vous obtenez les proverbes contenant le mot temps dans le proverbe ou bien son explication.
Ces fichiers doivent tous figurer dans un dossier unique. Dans ce cas, il suffit de sélectionner le filtre *.txt (il est déjà sélectionné par défaut, sinon faire un double-clic dans la zone "Chemin des documents à indexer"), puis de cliquer sur le bouton Ajouter le(s) document(s).
La procédure est la même avec les filtres *.doc ou *.htm?.
VBTextFinder ne peut pas le faire directement, mais si les noms des fichiers sont uniques, il est possible de lancer une recherche sur ces fichiers, puis de les copier/coller dans un seul dossier.
Si votre document contient des caractères par exemple grec, vous devez cocher l'option Unicode (sinon ces caractères seront transformés en ?). Cette option est utilisée non seulement lors de l'indexation, mais aussi lors de la production des rapports, pour le format du fichier .idx, pour l'affichage des occurrences, et lors de la transformation des fichiers .doc en .txt : il faut donc ré-indexer ces documents, le cas échéant. L'index .idx conserve l'information si cette option est active ou pas : si l'option a été activée dans l'index, et qu'elle n'est pas activée actuellement, alors VBTextFinder l'active temporairement (Unicode sera affiché dans la barre de titre de l'application). VBTextFinder permet les recherches de mot grec par exemple, même en ignorant la casse (majuscule/minuscule).
Si on ajoute des documents à l'index, il faut éviter de modifier l'option déjà appliquée pour les premiers documents, sinon les résultats seront incohérents (on peut éventuellement appliquer l'option Unicode, mais on ne peut pas décocher Unicode si les documents contiennent des caractères non latin : ils seront transformés en ?).
Unicode (en version UTF-8) est un très bon choix d'encodage concernant le rapport capacité / encombrement des fichiers (les fichiers ne sont que légèrement plus gros, et non pas deux fois plus gros), son seul inconvénient est que certains logiciels (par exemple l'utilitaire Windiff), ne gèrent pas l'Unicode : par exemple les accents sont alors représentés par des caractères codés.
Note : le découpage en mots ne fonctionne pas du tout avec certaines langues. Du coup, lorsque l'on tape un mot, il n'est pas trouvé immédiatement (il est mal indexé). Mais si on clique sur Chercher, une recherche non indexée est alors effectuée après l'échec de la recherche indexée, et les phrases contenant les occurrences peuvent ainsi être affichées.
Depuis la version 1.22 du 01/06/2019, VBTextFinder détecte automatiquement la présence de caractères Unicode dans les documents. Pour y parvenir, il suffit de comparer si les fichiers textes des documents sont identiques ou pas avec ou sans l'option Unicode : S'ils sont identiques, clairement cela signifie qu'il n'y avait pas de caractère Unicode dans le document. Lorsqu'on indexe plusieurs documents (*.doc), VBTextFinder va ajouter dans le fichier VBTextFinder.ini après le code document si celui-ci requiert un format Unicode. Ensuite, si on réindexe un dossier depuis les fichiers textes déjà convertis (*.txt), via le fichier ini on retiendra l'éventuel format Unicode de chaque document (VBTextFinder ne détecte pas le format d'encodage du fichier texte — je n'ai pas encore trouvé une manière fiable d'y parvenir —, mais il conserve l'information dans le fichier .ini et prochainement dans l'index .idx).
Pour retrouver ces fameux caractères Unicode dans un document, il faut créer un fichier texte avec et sans l'option Unicode et comparer ces deux versions textes via par exemple l'utilitaire WinMerge : souvent on ne trouve que quelques caractères Unicode, parfois non indispensables (certains ont un équivalent non Unicode). Par contre, si votre document contient des caractères Grec par exemple, l'option Unicode sera indispensable.
Pour pouvoir faire des recherches en distinguant des accents, il faut cocher l'option Accent. Dans ce cas, il faut ré-indexer les documents (comme pour l'option Unicode, voir paragraphe précédent). On peut conserver un index avec et un autre sans accent dans le même dossier, du moment que les fichiers .idx sont distincts.
VBTextFinder peut fonctionner via l'ajout de menus contextuel. Pour cela, vous pouvez les ajouter via le bouton +, le menu "Indexer pour une recherche (VBTF)" est alors ajouté pour les clés suivantes (HKCR) de la base de registre :
Fichier texte : .txt : txtfile
Fichier MS-Word : .doc : Word.Document.8
Fichier Html : .htm ou .html : htmlfile
Dossier : Directory
Ces menus permettent d'indexer directement les types de document via le menu contextuel qui apparaît lorsque l'on clique avec le bouton droit de la souris sur un de ces types de fichier dans l'explorateur de fichiers. Ces menus fonctionnent également pour des raccourcis vers un de ces types de fichier. Ces menus ne sont pas adaptés pour une utilisation avec plusieurs fichiers sélectionnés (car cela ouvre plusieurs instances de VBTextFinder, utilisez plutôt un filtre *.txt dans ce cas).
Une clé pour les fichiers .idx est également créée pour ouvrir les index VBTextFinder dans le logiciel.
Le bouton - permet de retirer proprement ces clés ajoutées (désinstallation du logiciel, ou bien en cas de déplacement du logiciel).
Pour la version DotNet, vous pouvez passer un chemin complet d'un dossier ou fichier à indexer (1 et 1 seul). Vous pouvez aussi passer un chemin complet vers un fichier index .idx : dans ce cas, VBTextFinder s'ouvre directement sans poser de question, prêt à utiliser (idéal pour un moteur de recherche déjà configuré sur un corpus préalablement indexé).
Pour la version VBA/VB6, c'est pareil sauf que l'indexation d'un dossier n'est pas traitée.
Pour pouvoir modifier la liste interne des séparateurs de phrase, il suffit de créer un fichier : "\Dico\SeparateursPhrase.txt". Par défaut, la liste des séparateurs de phrase est ".:?!;|".
Pour pouvoir modifier la liste interne des séparateurs de mot, il suffit de créer un fichier : "\Dico\SeparateursMot.txt". Par défaut, la liste des séparateurs de mot est " ,&~'`‘’()[]{}<>–-+±*/¦\@=°%#$€£§…«»". Liste à laquelle est ajouté les guillemets (") et la tabulation (Chr$(9)).
Pour produire les mots clés en ignorant les mots courant, il est aussi possible d'indiquer une liste dans un fichier externe : "\Dico\MotsCourants.txt". Dans ce cas elle remplace la liste interne.
Cette liste doit commencer et se terminer par un espace, exemple : " de la le les ".
En décochant "Mots dico" les index seront générés sans les mots qui font partie du dictionnaire, ce qui permet de lister tous les mots propres indexés. Le dictionnaire utilisé se trouve ici :
www.pallier.org/ressources/dicofr/liste.de.mots.francais.frgut.txt (3.6 Mo ou 800 Ko ici)
Et le fichier externe doit être placé ici : \Dico\liste.de.mots.francais.frgut.txt
VBTextFinder propose un outil pour faire l'intersection d'un index simple d'un texte dans une langue, avec celui du même texte dans une autre langue, de façon à lister les mots communs à deux langues (mots qui ne sont pas traduits, par exemple les noms propres).
Pour utiliser l'outil, il faut donc disposer d'un texte en plusieurs langues (au moins deux langues) : d'abord il faut produire l'index simple du texte dans la première langue (Fr par défaut), ensuite il faut produire l'index simple du texte dans une autre langue : il faut donc quitter l'application puis relancer l'indexation de la version par exemple anglaise cette fois du même texte. Enfin, une fois que vous avez produit une liste d'index dans le même répertoire (IndexSimple_Fr.txt et IndexSimple_En.txt), vous pouvez lancer la comparaison, c'est-à-dire l'intersection de ces fichiers (IndexSimple_Fr_En.txt).
Note : pour l'index simple, les options Mots courants et numériques sont disponibles, mais pas l'option Mots du dictionnaire. Pour le choix des codes langues, voir ici et là.
Cet outil permet d'extraire les fragments délimités par les signes : "", ‘’, “”, `´, «», ‹› et ''. L'imbrication de citations est gérée à condition d'avoir des délimiteurs distincts (sinon cela ne fonctionne pas). La détection de citations s'étendant sur plus d'une phrase n'est pas prise en charge.
On ne peut mettre en évidence les balises elles-mêmes, qui servent à cela (<SPAN class='Oc1'> </SPAN>) : on ne peut donc surligner span, class, oc (ni <b> </b> si on utilise l'option mise en caractères gras), ni des sous-ensembles comme spa, pan, cla, las, sp, cl, la, as, ss, ...
Liste des couleurs html utilisables :
http://htmlhelp.com/cgi-bin/color.cgi
Note : ce fonctionnement peut être pris en défaut si des caractères collés (ex. cœur) sont utilisés (bug non encore résolu).
Lorsque qu'une ligne commence par un mot clé spécifique, par exemple Chapitre, alors on note le chapitre : numéro et intitulé complet. Une liste de mots clés acceptés peut être définis dans le fichier externe Dico\Chapitrage.txt : il est composé d'une suite de paires définies par d'abord le mot clé à détecter en début de phrase, puis le code du chapitre correspondant, exemple :
Chapitre;Chap;Livre;Livre
Lorsqu'une ligne commence par "Chapitre XXX : Titre du chapitre XXX", alors le chapitre n°XXX est enregistré et son intitulé complet aussi (toute la ligne).
Lorsqu'une ligne commence par "Livre XXX : Titre du livre XXX", alors la section de type Livre n°XXX est enregistrée et son intitulé complet aussi (toute la ligne), etc.
Lorsque qu'une ligne commence comme un type de chapitre, et que la ligne n'est pas un chapitre (détection intempestive), alors on peut indiquer avec le signe - que l'on doit ignorer la ligne en tant que chapitre, exemple :
Livre publié;-Livre;Livre;Livre
Si une ligne commence par "Livre publié", alors cette ligne sera ignorée, par contre, les autres lignes qui commencent par Livre (par exemple "Livre premier"), seront bien détectées en tant que début de section livre.
Pour l'indexation des fichiers Excel et MS-Access, il y a une définition de "chapitres" spécifiques et exclusifs, pour éviter la détection intempestive d'autres types de chapitre dans le contenu des feuilles Excel ou tables MS-Access, voici les types de "chapitres" qui ont été définis (et qui vont aller de pair avec les logiciels XL2Csv/XL2Txt et DBComp) :
Pour Excel (fichier externe Dico\ChapitrageExcel.txt) :
Feuille Excel n°;Feuil.
Pour MS-Access (fichier externe Dico\ChapitrageAccess.txt) :
Structure Table Access n°;Struc.Table
Table Access n°;Table
Module VBA Access n°;ModVBA
Formulaire VBA Access n°;FrmVBA
Etat VBA Access n°;EtatVBA
Définition Requête Access n°;DefRq
Requête Access n°;Rq
Requêtes systèmes Access;RqSys (l'ensemble des requêtes systèmes)
Notes :
- Les types exclusifs par défaut sont codés en dur dans le logiciel, et on peut aussi les personnaliser, comme pour le chapitrage général, via les fichiers de configuration Dico\ChapitrageExcel.txt et Dico\ChapitrageAccess.txt ;
- Si la détection des chapitres est utilisée, alors le format du fichier index est conservé avec un numéro de version spécifique (1.15), qui ne peut pas être relu avec une version antérieure du logiciel VBTextFinder. Sinon, la version 1.0 compatible sera utilisée comme dans les précédentes versions.
Nombre de mots distincts indexés : 1238
spam courriel vbspamcheck com faux courriels antispam positifs www spams outlook fr html fichier express réception id free domaines clé boîte base logiciel légitimes exemple domaine cas patrice message dossier dbx dargenton
Nombre de mots distincts indexés : 1504
html oeuvre votant imdb dvdclass classement www films com film votants votes champ single dvd version fr long type voté null text50 oeuvres interdit données code scores calcul titre notes web moyenne identifiant table mnémonique index cas affinités 2 unique partir exemple critiques base auteur access 1 0
Nombre de mots distincts indexés : 1016
1 odbc excel fichier dsn version données 2007 pilote 11 source exemple via microsoft 0 type requêtes access 8 nombre fonction champs base windows requête valeurs sql http driver défaut passe décimal
Nombre de mots distincts indexés : 547
www com vb code 2 version html vb2html aspx 2005 vbfrance projet id codeproject asp fichier useritems mode fichiers bricomix 2007 vbtohtml projets mots génération convertir clés 2008
Nombre de mots distincts indexés : 1865
logique vbbrainbox base faits règles données 1 règle expert 0 net fr 2 turbo exemple application fiabilité version système ordre html floue chaînage access variable complexité cas www variables méta x valeur ia problème expertise dbtofile http com systèmes voir régime problèmes np monotone mdb
Nombre de mots distincts indexés : 1549
0 1 audio db 2 g compression www kbps spectre com gd 10 signal fréquence 11 fréquences cd fichier wav qualité tfr media 5 3 version vbwavecomp log khz fichiers 12 wma2 wma perte calcul bits 96 windows énergie rapport 13 logiciel aspx 50
Nombre de mots distincts indexés : 1077
com logiciel www code version licence aspx 2 clé asp net codeproject vblocker client activation versions vb6 protection microsoft cryptage 0
- Dans l'affichage html, conserver le mode hypertexte par défaut sur chaque mot affiché (en html, cf. le dictionnaire en ligne ultime : www.tv5.fr/TV5Site/alexandria/definition.php) ;
- Interface avec onglets : Rechercher, Indexer et Outils ;
- Trouver une autre ergonomie pour pouvoir agrandir uniquement le paragraphe sur lequel on est, puis le rétrécir, sans perdre le mot sélectionné (tout en conservant le mode hypertexte sur double clic) ;
- Boutons suivant et précédant, comme dans un navigateur : recherche suivante ou précédente (lorsque l'on revient en arrière, bien se repositionner sur le dernier mot cliqué, comme une navigation hypertexte) ; autres boutons utiles : occurrence suivante ou précédente du mot en cours, comme dans la barre d'outils Google (laquelle contient un bouton pour chaque mot, chaque nouveau clic passe à l'occurrence suivante du mot) ;
- Bouton pour effacer l'index en RAM, sans avoir à quitter ;
- Sélection des fichiers à indexer : pouvoir sélectionner plusieurs fichiers (sans avoir à faire *.txt) ;
- ComboBox avec auto-complétion pour la saisie d'un mot à rechercher, fonctionnant comme la barre d'outil Google : compléter avec une précédente recherche (grâce à l'historique des recherches), et compléter aussi avec les mots existants (comme Google Suggest). Les précédentes recherches sont affichées dans la première moitié de la zone, tandis que les suggestions sont affichées dans la seconde : pourquoi choisir quand on peut tout avoir !
- Comptage du nombre de mots indexés par document (oDoc.iNbMotsIndexes), et calcul des autres statistiques concernant les documents indexés : nombre de paragraphes, phrases... ;
- Séparateur de phrase : il faudrait considérer 2 caractères successifs au lieu d'un seul caractère ; par exemple le point ne délimite pas toujours une phrase, il peut s'agir d'un point décimal ou bien d'un séparateur de nom de domaine dans un lien hypertexte. Considérer donc un point suivi d'un espace ou bien d'un retour à la ligne pour séparer les phrases ;
- Possibilité de lire les fichiers de configuration externes au logiciel, tel que la liste des mots fréquents, les séparateurs de phrases et mots (sauf les caractères invisibles tels que tabulation ou retour à la ligne, à moins de coder en xml).
- Ignorer les mots courants pour réduire la taille de l'index, soit en limitant le nombre d'occurrences dans les phrases d'un mot (cela ne fonctionnera qu'à partir de gros document), soit en se basant sur une liste de mot courant (définition assez floue : mot très fréquents et non signifiant : et, est, dans, le, ...). Compter quand même toutes les occurrences mais sans conserver les numéros de phrases ; Ignorer les mots courant pourrait être une option d'indexation ;
- Charger l'index des phrases indépendamment de celui des mots afin de lancer plus rapidement le logiciel (on n'a besoin des phrases que pour les afficher, pas pour savoir si un mot est présent). Tout l'index est chargé en RAM, si l'index est vraiment trop gros, c'est-à-dire plus gros que la RAM physique disponible, il faudra probablement dans ce cas stocker les phrases dans une base de données (l'index devrait tenir en RAM dans tous les cas, à moins de faire un moteur de recherche généraliste sur le web par exemple) ;
- Compression des phrases et les mots de l'index du dictionnaire suivant une arborescence : construire un arbre des débuts et fins de mot et de phrase possibles à partir des documents indexés. Voir les liens.
- Mots contenant des chiffres : option pour n'indexer que les lettres, en ignorant les nombres, et chaque chiffre devient un séparateur de mot ;
- Gestion des caractères doubles : oe ae... on pourrait les indexer deux fois (collés ou pas) pour être sûr de les trouver dans tous les cas (utile seulement si on indexe les accents en DotNet, car sinon on a déjà cette fonctionnalité) ;
- Gérer les options d'indexation en ligne de commande : liste des fichiers à indexer, fichier ini (pour les codes document), fichier index à utiliser, ... cela permettrait de faire des batchs de mise à jour automatique d'un index en fonction du contenu d'un dossier ;
- Gestion automatique des codes document : dans la fenêtre résultat, on a la place pour indiquer le nom du fichier complet, mais pour l'affichage des statistiques c'est utile d'avoir un code document (à moins que les noms de fichiers soient assez courts : option automatique dans ce cas) ; idée : insérer le code document directement dans le fichier Word, de façon à l'associer automatiquement au document lors de son indexation ; option pour ignorer les codes document : ne plus afficher le fichier .ini ;
- Inclure la date et l'heure de chaque document indexé (pour pouvoir détecter les mises à jour requises) ; autre idée : l'URL du document en option afin de pouvoir produire un lien vers ce document (il faudrait pouvoir pointer directement sur le mot trouvé du document) ;
- Inclure la version du logiciel d'indexation (en particulier VBA, VB6 ou DotNet), et inclure les options d'indexation : avec accents, ... ;
- Indexation des documents Excel : voir XL2Csv ;
- Mots clés : exclure les verbes conjugués, ou alors comptabiliser leur fréquence avec le verbe à l'infinitif (mais comment reconnaître un verbe conjugué ? via une liste complète ?) ;
- Comparer la fréquence des mots d'un texte (sans les mots courants) par rapport à leur fréquence en général, pour donner une idée de l'importance donnée à ces mots dans ce texte ;
- Suggérer une orthographe différente en cas d'échec (comme Google) : utiliser une distance d'édition lors de l'indexation ? (comment éviter ce calcul sur l'ensemble des mots de l'index ?).
Il suffit de croiser des recherches simples de mot, en calculant leur intersection, afin de retrouver les documents indexés qui contiennent chacun de ces mots. On peut définir un vecteur comme étant un résultat de recherche sous forme d'une suite de 0 et de 1 de longueur égale au nombre de document indexés : lorsque le produit de deux vecteurs n'est pas nul, cela signifie qu'il contient l'ensemble des documents contenant l'ensemble des mots recherchés ; on peut envisager de créer à la volée les vecteurs lors d'une recherche (il n'est pas nécessaire de créer et stocker les vecteurs à l'avance) ; on peut envisager aussi la même recherche au niveau des phrases cette fois (les vecteurs seront alors de très grande taille).
Dans ce cas, il faut ajouter une information lors de l'index : la position du mot (numéro du mot dans le document, ou bien n° du mot dans la phrase, mais cela compliquera les calculs). On peut envisager de calculer une sorte de distance entre les résultats, basée sur la position des mots, phrases, paragraphes : on pourrait ainsi détecter les mots proches, donc faire des recherches capable de tenir compte des expressions ainsi que des opérateurs évolués (par exemple tel que NEAR : mot "près de").
En attendant une solution vraiment efficace, il existe une solution palliative. En effet, le parcours des phrases ne prend que quelques secondes : on peut simplement rechercher celles qui satisfont les critères demandées, c'est-à-dire celle qui contiennent l'ensemble des mots ou expressions à rechercher. L'inconvénient, c'est que lorsque le nombre de documents à parcourir double, le temps de recherche double aussi, car on n'utilise pas l'index dans ce cas. L'avantage, c'est que l'on peut rechercher n'importe quelle combinaison de mots ou expression délimitée entre guillemets (caractère "), et même des parties de mot contenues dans la phrase. S'il y a au moins un guillemet ou espace, on utilise la recherche d'expression, sinon on conserve le système classique de recherche rapide, basé sur l'index des mots.
Note : la recherche d'expressions ne fonctionne que sur une seule phrase (elle ne fonctionne pas sur un paragraphe).
Les requêtes Linq semblent tout à fait adaptées à leur exploitation dans VBTextFinder, par exemple la construction de l'index fréquentiel ou alphabétique ne requiert qu'une seule ligne de code !
' Pour compiler ce code sous VB9/2008, ajouter la référence System.Core 3.5 (framework cible 3.5 au lieu de 2.0),
' puis cocher System.Linq (et Option Infer : On)
Dim aMots(m_htMots.Count - 1) As clsMot
m_htMots.Values.CopyTo(aMots, 0)
Dim indexFreq = From mot In aMots _
Order By mot.iNbOccurences Descending, mot.sMot _
Select mot.sMot, mot.iNbOccurences
Dim indexAlphab = From mot In aMots _
Order By mot.sMot _
Select mot.sMot, mot.iNbOccurences
Pour construire ces index sans les mots du dictionnaire, cela se complique : il y a bien une instruction Except, mais elle ne fonctionne que par valeur :
Dim indexDico = index.Except(dico)
Pas de problème pour afficher les index des mots hors dictionnaire, mais dès que l'on veut afficher le nombre d'occurrences correspondantes, je n'ai pas réussi à obtenir un code qui fonctionne dans tous les cas : ou bien ce sont les occurrences qui posent problème, ou bien ce sont les accents, ou bien les performances sont rédhibitoires... la suite au prochain épisode !
Dès que j'aurai trouvé la solution, j'envisage également de programmer des recherches de plusieurs mots, ainsi que des recherches d'expression, car toutes les fonctions membres des chaînes de caractères (String) sont permises dans les requêtes Linq. Pour les performances, il faut faire attention par exemple à ne pas trier avant de faire une autre opération, car le tri déclanche l'exécution de la 1ère requête Linq, ce qui empêche l'optimisation du compilateur avec les autres requêtes (au final, je ne pense pas que les requêtes Linq seront utiles pour les recherches d'expression, car cette technologie optimise et simplifie avant tout le code source, pas le code exécutable).
Voici 101 exemples de programmation Linq :
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
Voir le lien suivant pour la fonction Except :
www.codeproject.com/KB/linq/Fluid_Linq_Except.aspx
- Version VBA Excel : VBTextFinder.xls : pas de pré-requis hormis Excel à partir de la version 97 ;
- Version VBA Word : VBTextFinder.doc : pas de pré-requis hormis Word à partir de la version 97 ;
- Version en VB6 : Le logiciel runtime (gratuit) de Visual Basic 6 (VB6) doit être installé : C:\WINDOWS\system32\msvbvm60.dll (pour cela, installez n'importe quel logiciel packagé capable d'installer le runtime VB6, par exemple : http://patrice.dargenton.free.fr/gravity/gravityinst.zip : 1.6 Mo). Cependant, il vous faudra VB6 pour compiler le code source afin de produire l'exécutable ;
- Version DotNet : Si la plateforme .Net n'est pas déjà installée sur votre machine (vous recevrez l'erreur 0xc0000135), vous pouvez l'installer en la téléchargeant via Microsoft Update, ou bien ici :
Microsoft .NET Framework 4.0
www.microsoft.com/fr-fr/download/details.aspx?id=17851
Voir ici pour plus de détail.
https://github.com/PatriceDargenton/VBTextFinder/blob/master/Changelog.md
- Correction d'un bug lors de l'affichage html.
- Glossaire, détection des accents manquants : réinitialisation des compteurs à chaque lancement.
- Correction de l'indexation avec les accents.
- Possibilité d'afficher tous les espaces insécables (car en fait on ne peut pas prévoir tous les cas corrects, par exemple l'espace insécable devant les unités), du coup on a maintenant le menu Afficher les espaces insécables (tous) et afficher les espaces insécables à vérifier ;
- Glossaire : détection des accents manquants sur les majuscules (activation de l'option AllowAccentedUppercase : autoriser les majuscules accentuées, ou plutôt exiger les accents sur les majuscules) ;
- Affichage des occurrences en html : bug de plantage corrigé ;
- Détection de la présence ou l'absence de caractères Unicodes lors de la conversion .doc en .txt ;
- VBTextFinder.ini : Changement du séparateur : en | pour tenir compte du possible C: (chemin absolu au lieu de relatif), et maintenant aussi de la présence possible de caractère Unicode détectée. Une copie de sauvegarde est maintenant effectuée au préalable : VBTextFinder.ini -> VBTextFinder-ini.bak ;
- En mode Unicode, gestion de l'espace fine insécable (Alt+8239 = 0x202F), en plus de l'espace insécable ordinaire (160) ;
- Index des citations : les lignes avec un seul " sont maintenant incluses aussi ;
- Désactivation (suite à une nouvelle erreur apparue : "L'objet a été supprimé") : Correction du bug : division par zéro ("Attempted to divide by zero") fixé dans la version 1.21 ;
- Passage du DotNet 4.0 à la version 4.5.1.
- Correction du bug : division par zéro ("Attempted to divide by zero") qui apparaissait parfois sur un Windows configuré en anglais ;
- Nouveau dictionnaire français : en plus de frgut : DELA et LibreOffice ;
- Conversion d'un document Word en texte brut (.doc en .txt) : Correction du bug : "Microsoft Word : Espace mémoire insuffisant. Une fois terminée, cette action ne pourra pas être annulée. Continuer ?" : Supprimer tous les signets cachés de la table des matières, ce avant de supprimer le retrait à gauche via Selection.ParagraphFormat.CharacterUnitFirstLineIndent = 0.
- Détection des majuscules intempestives ;
- Détection des espaces insécables intempestifs.
- Affichage du tiret devant les occurrences trouvées : optionnel ;
- Indexer tout type de fichier, pas seulement .txt, .doc ou .htm? ;
- Couleur de fond de la zone Chapitres (depuis Windows 7) : blanc.
- Menu Htm/Html : ne fonctionne plus, remplacé par *.* ;
- Glossaire des mots hors dictionnaire de Word : Intégration de VBDico dans VBTextFinder, pour un seul document (et non une liste de documents). Si le document est un fichier .txt, la langue choisie est celle précisée dans l'interface de VBTextFinder, tandis que si le document est un fichier Word .doc ou .htm/html, alors la langue est celle du document. Word (version >= 2000) doit être installé sur la machine pour pouvoir créer le glossaire, car on utilise les dictionnaires de Word, et seulement ceux-là : Fr, Uk, Us et Es (la correspondance entre le code langue et le code dictionnaire de Word est programmé en dur dans l'application), ces dictionnaires doivent être installés dans Word ;
- Indexation : si le document est en mode plan, il n'y a plus de bug ;
- Index : Fixage de la langue dans le document index, avec vérification activée. Distinction entre les langues anglaises UK et US. Si on change la langue du dictionnaire, il faut le recharger (bug corrigé) ;
- Options (dans l'onglet Config.) pour afficher dans les résultats de recherche les n° de paragraphe, de phrase, d'occurrence, selon une numérotation propre à chaque document ou alors globale à l'ensemble des documents, ainsi qu'une option pour afficher les informations relatives au document ;
- Passage en VB 2010, avec le DotNet 4.0.
- Affichage des chapitres même lorsqu'il n'y a qu'un seul document indexé (ne pas ouvrir VBTextFinder.ini dans ce cas) ;
- Indexation Excel et MS-Access : définition de "chapitres" spécifiques et exclusifs (pour éviter la détection intempestive d'autres types de chapitre dans le contenu des feuilles Excel ou tables MS-Access).
- Détection des chapitres (ou autres sections) : version du fichier index spécifique 1.15 dans ce cas ;
- Recherche d'expressions : conservation des espaces (et remplacement des espaces insécables par des espaces simples pour faciliter les recherches, lors de la conversion doc en txt) ;
- Mode d'indexation Unicode et Accent en option ;
- Mode Web/Html pour afficher la totalité des occurrences (le contrôle WebBrowser est plus performant que le contrôle TextBox pour les documents volumineux), et aussi pour afficher les occurrences en gras (insertion de balises <b> </b> autour des occurrences), ou bien en couleurs. Le résultat peut être visualisé dans un navigateur externe, et aussi en texte simple ;
- Correction du bug "Mémoire insuffisante" (5097 ou -2146823191) lors de l'affichage de l'index sous Word : il s'agit en fait du dossier temporaire de l'utilisateur (%temp%) qui est trop gros (Microsoft ne pensait pas qu'on pouvait utiliser Windows XP si longtemps sans réinstaller :-) ;
- Conversion des documents Word .doc en texte .txt : ne pas ajouter d'espace de présentation (AddBiDiMarks:=False) et supprimer tous les retraits avant d'exporter en texte.
- Correction du bug des versions 1.12 et 1.13 concernant l'affichage multiple d'une phrase lorsqu'elle contient plusieurs occurrences d'un mot trouvé.
- Correction du bug de la version 1.12 avec le menu : exporter toutes les phrases.
- Dictionnaire disponible en anglais ;
- Affichage des n° de phrase et paragraphe toujours de façon globale pour l'ensemble des documents (avant on affichait le n° local de phrase du document en mode phrase, et le n° global de phrase sur l'ensemble des documents en mode paragraphe ; ce défaut existe toujours dans les versions VB6/VBA) ; amélioration de la conservation de la sélection en cours lorsque l'on affiche plus ou moins de paragraphes ;
- Bug corrigé : lorsqu'un paragraphe contenait plusieurs phrases trouvées, l'affichage des paragraphes suivants ne fonctionnait pas ;
- Recherche d'expressions (sans utiliser l'index des mots).
- Outil pour extraire les citations ;
- Amélioration de l'intersection d'index : à partir de 3 langues, conservation de la liste des mots appartenant à toutes les traductions (réduction du risque de trouver des mots communs à plusieurs langues et qui ne sont pas des mots propres : pas intéressants) ;
- Ne pas indexer tout document dont le nom commence par index ;
- Conversion .doc en .txt : ne pas autoriser la substitution de caractère (par exemple la substitution de «» en "", ou bien l'espace insécable par un espace simple ; ce défaut existe toujours dans les versions VB6/VBA, il faut ajouter : oWrd.ActiveDocument.SaveAs : AllowSubstitutions:=False).
- Outil pour faire l'intersection d'un index simple d'un texte dans une langue, avec celui du même texte dans une autre langue, de façon à lister les mots communs à deux langues (dont les mots propres) ;
- Sauvegarde de la position de la fenêtre, ainsi que des options de présentation ;
- Option de langue pour le dictionnaire et les mots courant, pour la génération de l'index (pour le moment, il n'y a pas encore de dictionnaire dans d'autres langues, et le dico. d'origine en français peut conserver le même nom) ;
- Option pour afficher l'index simple (sans la fréquence ni les codes documents, selon les cas) ;
- Option pour indiquer le nombre de mots clés à sélectionner ;
- Option pour ne pas afficher les numériques dans l'index ;
- Option pour ne pas afficher la fréquence ni les codes document dans l'index produit ;
- Option pour ne pas afficher les numéros de paragraphe et de phrase ;
- Onglets pour séparer les fonctions.
- Fichier externe possible pour :
- Mots courants : "\Dico\MotsCourants.txt" ;
- Séparateurs de phrase : "\Dico\SeparateursPhrase.txt" ;
- Séparateurs de mot : "\Dico\SeparateursMot.txt" ;
- Case à cocher pour les Mots courants (comme pour les mots du dictionnaire) : possibilité de produire un index alphabétique ou fréquentiel avec ou sans les mots courants ;
- Index en lecture seule possible (par exemple sur un CD-Rom, mais il reste à désactiver l'indexation, à moins d'utiliser un dossier temporaire sur le disque dur) ;
- Amélioration du code source : Try Catch, Using, message délégués, ...
- Corrections mineures (info-bulle du bouton "Ajouter le(s) document(s)", documentation, ...).
- Gestion d'un dictionnaire.
- Vérification si un document est déjà indexé (via le nom du fichier, comme dans la version DotNet) : avant, on pouvait ajouter plusieurs fois le même document, et cela produisait des anomalies dans la recherche (les modes phrase et paragraphe n'étaient plus tout à fait cohérents).
- Full Text Search Tool (n'affiche pas les occurrences trouvées)
www.codeproject.com/KB/cs/Text_Search.aspx
- Full-Text Search: Fast, Damn Fast and DotLucene By Dan Letecky
Search 3.5 GB of text in 0.1 second! (pour site web internet ou intranet)
www.codeproject.com/useritems/damnfastsearch.asp
- Seekafile Server 1.0 - Flexible open-source search server By Dan Letecky
Windows Service that indexes DOC, PDF, XLS, PPT, RTF, HTML, TXT, XML, and other file formats
Desktop and ASP.NET search samples included
(il faut installer le serveur, construire l'index, puis installer le client : pas complètement trivial à tester)
www.codeproject.com/KB/IP/seekafile.aspx
- Populating a Search Engine with a C# Spider
How-to build an ASP.NET search engine link-spider using C# (Pour site web)
www.codeproject.com/article.asp?tag=11786751643738175
- Word Search Engine (ne semble pas fonctionner en français)
www.codeproject.com/KB/string/wse1.aspx
- Permet de retrouver des fichiers Word contenant un groupe de mots (pas super fiable)
www.vbfrance.com/code.aspx?ID=39560
- Indexation des documents pdf (code source en C++ MFC)
Code to extract plain text from a PDF file : source code that shows how to decompress and extract text from PDF documents
www.codeproject.com/KB/cpp/ExtractPDFText.aspx
- Using the IFilter interface to extract text from various document types (dont pdf)
www.codeproject.com/KB/cs/IFilter.aspx
- Using DocxToText to Extract Text from DOCX Files (Word 2007)
www.codeproject.com/office/ExtractTextFromDOCXs.asp
Pour utiliser ces logiciels, il faudra soit incorporer le code source, soit gérer les arguments en ligne de commande, sinon la procédure d'indexation ne sera pas automatique :
- VB2Html : Créer un rapport Html d'un projet Visual Basic 6, 7, 8 et 9 : Pour indexer le code source (VB2Txt)
- Dbx2Txt : Convertir un fichier Dbx (Outlook Express) en Txt : Limitation : Le contenu texte des courriels html n'est pas extrait
- XL2Csv : Convertir un fichier Excel en fichiers Csv (ou en 1 fichier txt) : Limitation : le type de donnée doit être unique par colonne Excel
- DBComp : le comparateur de structure de base de données Access
- Dictionnaire optimisé
www.csharpfr.com/code.aspx?ID=46038
- Dictionnaires, anagrammes : algos efficaces
www.vbfrance.com/code.aspx?ID=30125
- Stormpedia : Analyser le sens des mots via une analyse de leurs fréquences
www.csharpfr.com/code.aspx?ID=44950
- WordCloud - A Squarified Treemap of Word Frequency
www.codeproject.com/csharp/wordcloud.asp
- A generic frequency table in C#
www.codeproject.com/useritems/FrequencyTable.asp
- Detect a written text's language, By Carsten Zeumer
An article on how to detect the language of a written text
www.codeproject.com/KB/recipes/DialogueMaster_Babel.aspx
Du même auteur : détecter l'encodage d'un texte
www.codeproject.com/KB/recipes/DetectEncoding.aspx
- Correction orthographique : Super Fast Spell Checking in C#
Use a Binary Search Tree to perform super fast spell checking. Support for custom dictionaries
www.codeproject.com/useritems/SuperFastSpellCheck.asp
- Soundex Implementation in C# and VB.NET
A simple soundex implementation in C# and VB.NET to recognize phonetically similar words based on basic soundex algorithms
www.codeproject.com/KB/aspnet/Soundex.aspx
- Implement Phonetic ("Sounds-like") Name Searches with Double Metaphone Part V: .NET Implementation
www.codeproject.com/cs/algorithms/dmetaphone5.asp
- Algorithme Soundex
www.csharpfr.com/code.aspx?ID=39423
- VBDico : Faire un glossaire des mots hors dictionnaire en parcourant un document Word (assez lent)
www.vbfrance.com/code.aspx?ID=20449
- GoogleFight : Mon correcteur orthographique favori !
Comparer la fréquence de deux orthographes d'un mot sur Google
www.vbfrance.com/code.aspx?ID=20641
- Corpus de texte
www.revue-texto.net/Liens/Liens_index.html#corp
- Extraire les informations d'un fichier Word sans l'ouvrir en VBA
www.vbfrance.com/code.aspx?ID=45781
- Microsoft Indexing Service and OLE DB By Ali Hamdar
How we can access Windows Indexing Service using OLE DB
www.codeproject.com/KB/database/indexingservice.aspx
- Liste des mots conjugués et dérivés du dictionnaire
(4 doublons rencontrés : Esquimaude, Esquimaudes, Internet et Napoléon)
www.pallier.org/ressources/dicofr/liste.de.mots.francais.frgut.txt
Autre liste : http://brunews.free.fr/Dico.zip
- Autres logiciels de Brunews : http://brunews.com/brunews/index.html
VERBEUR 74 Ko: Conjugaison complète de 6287 verbes français, un genre Bescherelle (les verbes sont intégrés dans le logiciel).
http://brunews.com/brunews/download/Verbeur.zip
CHERCHER 5 Ko: Recherche les fichiers contenant le texte indiqué, dans DLL et EXE sur demande, ultra rapide.
http://brunews.com/brunews/download/FindInFile.zip
LESMOTS 768 Ko: Aide pour mots croisés ou Scrabble, sa base modifiable comporte déjà 290027 mots.
http://brunews.com/brunews/download/LesMots.rar
- Le dictionnaire en ligne ultime
www.tv5.fr/TV5Site/alexandria/definition.php
- Proverbes, sentences et maximes
www.vbfrance.com/code.aspx?ID=31830
- Jouer au Literati, TextExpress, le mot le plus long, etc!
(contient une liste des mots du dico sans accent, accès à un dico en ligne)
www.vbfrance.com/code.aspx?ID=36617
- Instantor et sanzereur : nombreux outils d'analyse et de traitement de la langue
www.areopage.net/instantor.html
www.areopage.net/sanzereur.html