Indexation documentaire & bases de donnéesDate de publication : 25/02/2004
Par
SQLPro (autres articles) (CV) niveau : intermédiaire A chaque fois que je passe du temps à réfléchir sur le problème de l'indexation textuelle de données, il y a toujours un pro de SQL Server pour me rabrouer ... "passe donc en indexation 'full text', c'est une fonction de base du SGBD !". Préambule 1. Indexation de base 1.1. Mots clefs et index 1.2. Indexation automatique 1.2.1. Le problème 1.2.2. Les mots noirs 1.2.3. Les requêtes 2. Recherches sémantiques 3. Mots mal orthographiés 3.1. Erreur de frappe 3.2. Orthographe défectueuse 4. Mesure de pertinence PréambuleMa réflexion ne date pas d'aujourd'hui j'ai commencé ce genre de travail avant que SQL Server ne propose ce genre de service et ai continué récemment avec des projets dans mon entreprise. Voici donc ces éléments rassemblés dans le présent document et j'espère que vous prendrez plaisir à cette lecture. Quelques définitions Syntaxe Tous les développeurs connaissent le sens du mot syntaxe (enfin, les bons développeurs... !). Je ne ferais donc pas l'injure à nos lecteurs de recopier la notice du petit Robert ni du grand Larousse... Sémantique La connaissance du sens du mot sémantique est moins répandue, d'autant qu'elle dépend du sens des mots donc de la sémantique... Loin d'être une tautologie et bien que ce charabia tende inéluctablement à vous faire sourire, je viens de vous faire pointer de l'intellect toute la difficulté a exercer une distinction entre sémantique et syntaxe... Je ne donnerais qu'une définition par opposition de la sémantique, en indiquant que si la syntaxe s'occupe de la grammaire, la sémantique, elle, s'occupe du sens, c'est à dire de ce que mes mots et les phrases veulent dirent, autrement dit, des idées qu'ils véhiculent. 1. Indexation de base1.1. Mots clefs et indexIl s'agit là d'une vieille méthode largement en usage dans les documents publiés sous forme papier. On y trouve deux modes différents : l'abstract et l'index encore appelé thésaurus. Les abstracts sont en général utilisés dans la documentation juridique et sont placés en tête du document souvent sous le titre. Ils permettent, avant de lire la publication, de connaître le contexte juridique, c'est à dire quels sujet sont traités. Il s'agit essentiellement de mots ou d'expressions, rarement de phrases.
L'index est en général une liste de certains mots savamment choisis, ou bien la totalité des nom propres cités dans un document, avec un renvoi pour chaque page ou se trouve ce mot ou ce nom propre.
A l'origine, les abstracts et index sont créés manuellement et de toute pièces, soit par les auteurs, soit par les éditeurs des publications. Avec l'apparition de l'informatique certains mécanismes de création d'index ont vus le jour. Par exemple Word de Microsoft permet de créer un index à condition de marquer chaque mot du texte à indexer. Inconvénient : un même mot situé à différents endroit du texte doit faire l'objet d'une marque spécifique pour chaque occurrence (fastidieux). Avantage : grande latitude dans le choix des mots à indexer (précision). Dans tous les cas (abstract ou index) nous avons des mots clefs, c'est a dire des mots possédant un sens fort... En effet il ne viendrait pas à l'esprit des auteurs d'indexer des mots comme "le", "mais" ou encore "je", "de" ! Une indexation manuelle d'un document électronique, lorsqu'elle est faite sérieusement reste encore un choix basique mais excellent par sa simplicité... 1.2. Indexation automatiqueMais la tentation est forte de se servir de l'informatique pour indexer de manière automatique des documents à forte contenance textuelle... Nous allons donc étudier la problématique de l'indexation dite "plain texte"... 1.2.1. Le problèmeSoit un ensemble de textes que l'on aura, pour simplifier nos propos, stockés dans une base de données sous le format suivant :
TXT_ID permettant d'identifier de quel texte il s'agit et TXT_TEXTE contenant le texte à indexer. Voici les données qui nous servirons d'exemple pour notre démonstration :
Le premier élément est de constituer une table contenant tous les mots de tous nos texte, mais sans redondance. Voici le format de cette table :
MOD_ID étant l'identifiant du mot et MOT_MOT le mot lui même. Il faut bien entendu créer une table de jointure afin de lier un mot à un texte. Appelons par exemple cette table INDEX :
Si nous regroupons tous les textes en un seul bloc : Le petit chat est mort. Il fait beau, le soleil brille, les oiseaux chantent. Comprendre et entreprendre sont les deux mamelles du commerce. Prendre le temps de vivre, pour soi, mais aussi pour les autres. Dans la vie il y a des hauts et des bas. Ne pas confondre la basse, en fait une guitare, et la contrebasse, en fait un gros violon. Il faut manger pour vivre et non vivre pour manger! Partir c'est mourir un peu. La mort n'est pas une fin en soi! Prudence est mère de sûreté. N'est ce pas les garçons ? Nous devons constater qu'il serait souhaitable de retirer tous les signes de ponctuation afin d'isoler les mots les uns des autres
Retirons donc les virgules, points, points d'exclamation, tirets, etc... Mettons aussi tous les caractères en minuscule (ou en majuscule !). le petit chat est mort il fait beau le soleil brille les oiseaux chantent comprendre et entreprendre sont les deux mamelles du commerce prendre le temps de vivre pour soi mais aussi pour les autres dans la vie il y a des hauts et des bas ne pas confondre la basse en fait une guitare et la contrebasse en fait un gros violon il faut manger pour vivre et non vivre pour manger partir c est mourir un peu la mort n est pas une fin en soi prudence est mère de sûreté n est ce pas les garçons Un autre problème est posé par les accents
Devons nous les laisser ? Le débat est plus délicat qu'il n'y paraît. Une excellente manière de procéder serait de conserver le mot avec ses accents et caractères spéciaux et une version allégée. Dans notre exemple nous retirerons toutes les lettres en dehors du jeu [a .. z] plus le caractère espace. Notez que certains auteurs conseille de conserver le tiret afin de préserver les mots composés... le petit chat est mort il fait beau le soleil brille les oiseaux chantent comprendre et entreprendre sont les deux mamelles du commerce prendre le temps de vivre pour soi mais aussi pour les autres dans la vie il y a des hauts et des bas ne pas confondre la basse en fait une guitare et la contrebasse en fait un gros violon il faut manger pour vivre et non vivre pour manger partir c est mourir un peu la mort n est pas une fin en soi prudence est mere de surete n est ce pas les garcons Nous constatons maintenant que nous avons des lettres isolées, comme "c" et "n" qui sont difficilement interprétable. Il n'y a aucun intérêt à les conserver. De même, certains mots comme "le", "il", "les", "et", c'est à dire, les articles, les pronoms, les conjonctions de coordination
n'ont pas un grand intérêt pour la compréhension du texte. On peut donc les retirer : petit chat est mort fait beau soleil brille oiseaux chantent Comprendre entreprendre sont deux mamelles commerce Prendre temps vivre soi autres Dans vie hauts bas confondre basse fait guitare contrebasse fait gros violon faut manger vivre vivre manger Partir est mourir peu mort est fin soi prudence est mere surete est garcons Nous remarquons en sus que certains mots reviennent fréquemment, comme le mot "est" (verbe être conjugué). On peut aussi le retirer. 1.2.2. Les mots noirsL'ensemble des mots que l'on retire s'appellent des "mots noirs"... Dans notre exemple, on été considéré comme mots noirs : "le", "est", "il", "les", "et", "sont", "du", "de", "pour", "mais", "aussi", "des", "pas", "non" Une idée consiste alors a créer une table des mots noirs afin de paramètrer le retrait de ces mots noirs. Elle pourrait avoir la forme :
Qui pourrait être alimentée comme suit :
Mais attention ! Ne pas placer dans cette table tous les mots qui vous paraissent inintéressant... En effet certains mots qui paraissent de faible intérêt peuvent avoir un sens très précis. Voici quelques exemples de mots à ne pas faire figurer en mots noirs : "car", "or", "mais", "est", "du", "pas", "son". Pourquoi ? Lisez la phrase suivante, qui, je vous l'avoue est un peu tirée par les cheveux : CAR de transport couleur OR, roulant vers l'EST contenant du MAÏS ayant payé son DU et fait quelques PAS dans la neige au SON de la cornemuse. Enfin, parmi les mots noirs, on peut rajouter les chiffres romains, qui sont souvent utilisés pour numéroter des paragraphes de textes : Voici donc quelques ajouts de plus :
et ainsi de suite en considérant que les lettres L, C, D et M représentent respectivement cinquante, cent, cinq cent et mille. Exemple : 1953 = MDCCCCLIII On pourrait aussi élargir notre table des mots noirs, à quelques mots supplémentaires comme : certains certaines aucun aucune soit moins plus avant arriere devant derriere rien fois mi es ex ... Pour mémoire, SQL Server de Microsoft utilise un fichier de mots noirs, pour son indexation textuelle qui est le suivant : II 1 III 2 IV 3 VI 4 VII 5 VIII 6 XI 7 XII 8 XIII 9 XIV 0 XIX $ XV a b c d e f g h i j k l m n o p q r s t u v w x y z XVI XVII XVIII XX XXI XXII XXIII XXIV XXIX XXV XXVI XXVII XXVIII XXX XXXI XXXII XXXIII XXXIV XXXIX XXXV XXXVI XXXVII XXXVIII a adieu afin ah ai aie aient aies ait al. alerte allô alors apr. après arrière as attendu attention au aucun aucune aucunes aucuns audit auquel aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront autant autre autres autrui aux auxdites auxdits auxquelles auxquels avaient avais avait avant avec avez aviez avions avoir avons ayant ayante ayantes ayants ayez ayons aïe bah barbe basta beaucoup bernique bien bigre billiard bis bof bon bougre boum bravissimo bravo car ce ceci cela celle celles celui centième centièmes cents cependant certaines certains ces cet cette ceux chacun chacune chaque chez chic chiche chouette chut ciao ciel cinq cinquante cinquantième cinquantièmes cinquième cinquièmes clac clic comme comment concernant contre corbleu coucou couic crac cric crénom da dame damnation dans de debout depuis derrière des desdites desdits desquelles desquels deux deuxième deuxièmes devaient devais devait devant devante devantes devants devez deviez devions devoir devons devra devrai devraient devrais devrait devras devrez devriez devrions devrons devront dia diantre dix dixième dixièmes dois doit doive doivent doives donc dont doucement douze douzième douzièmes du dudit due dues duquel durant durent dus dussent dut dès dû dût eh elle elles en encontre endéans entre envers es et eu eue eues euh eurent eurêka eus eusse eussent eusses eussiez eussions eut eux excepté eûmes eût eûtes fi fichtre fixe flûte foin fors fouchtra furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes gare grâce gué ha halte hardi hein hem hep heu ho holà hop hormis hors hou hourra hue huit huitante huitantième huitième huitièmes hum hurrah hé hélas il ils jarnicoton je jusque la ladite laquelle las le ledit lequel les lesdites lesdits lesquelles lesquels leur leurs lorsque lui là ma made mais malgré mazette me merci merde mes mien mienne miennes miens milliard milliardième milliardièmes millionième millionièmes millième millièmes mince minute miséricorde moi moins mon morbleu motus moyennant mâtin na ne neuf neuvième neuvièmes ni nonante nonantième nonantièmes nonobstant nos notre nous nul nulle nulles nuls nôtre nôtres octante octantième oh ohé olé on ont onze onzième onzièmes or ou ouais ouf ouille oust ouste outre ouïe où paix palsambleu pan par parbleu parce pardi pardieu parmi pas passé patatras pechère pendant personne peu peuchère peut peuvent peux plein plouf plus plusieurs point pouah pour pourquoi pourra pourrai pourraient pourrais pourrait pourras pourrez pourriez pourrions pourrons pourront pourvu pouvaient pouvais pouvait pouvant pouvante pouvantes pouvants pouvez pouviez pouvions pouvoir pouvons premier premiers première premières psitt pst pu pue pues puis puisque puisse puissent puisses puissiez puissions purent pus pussent put pécaïre pût qq. qqch. qqn quand quant quarante quarantième quarantièmes quatorze quatorzième quatorzièmes quatre quatrième quatrièmes que quel quelle quelles quelqu'un quelqu'une quels qui quiconque quinze quinzième quinzièmes quoi quoique rataplan revoici revoilà rien sa sacristi salut sans saperlipopette sapristi sauf savoir se seize seizième seizièmes selon sept septante septantième septième septièmes sera serai seraient serais serait seras serez seriez serions serons seront ses si sien sienne siennes siens sinon six sixième sixièmes soi soient sois soit soixante soixantième soixantièmes sommes son sont sous soyez soyons stop suis suivant sur ta tandis tant taratata tayaut taïaut te tel telle telles tels tes tien tienne tiennes tiens toi ton touchant tous tout toute toutes treize treizième treizièmes trente trentième trentièmes trois troisième troisièmes tu tudieu turlututu un une unième unièmes v'lan va vers versus veuille veuillent veuilles veuillez veuillons veulent veut veux via vingt vingtième vingtièmes vivement vlan voici voilà vos votre voudra voudrai voudraient voudrais voudrait voudras voudrez voudriez voudrions voudrons voudront voulaient voulais voulait voulant voulante voulantes voulants voulez vouliez voulions vouloir voulons voulu voulue voulues voulurent voulus voulussent voulut voulût vous vs vu vôtre vôtres y zut à ç'a ç'aura ç'aurait ç'avait ça çà ès étaient étais était étant étante étantes étants étiez étions évohé évoé êtes être ô ôté On peut constater au passage que SQL Server est fâché avec les transports en commun puisqu'il élimine le car !!! Juste une suggestion en passant, vous pouvez aussi mettre en mots noirs les chiffres exprimés sous formes de littéraux : deux, trois quatre
onze, treize, vingt, cent, mille, etc ... Le modèle relationnel complet de notre petite application est donc le suivant :
Nous pouvons maintenant procéder à l'alimentation de la table des mots, par les seuls mots retenus :
Dernière phase de notre algorithme, saisir les correspondances entre les mots et les textes dans la table INDEX :
1.2.3. Les requêtesIl s'agit maintenant de trouver les requêtes à mettre en uvre pour répondre à la recherche textuelle. Une bonne manière de résoudre la chose, serait de trouver une seule requête capable de traiter la majorité des cas de figure. Par exemple, paramétrer une seule requête capable de rechercher un texte contenant :
requête OU recherche de texte contenant un mot ou un autre : 'VIVRE' ou 'MANGER' (ou les deux)
requête ET recherche de texte contenant un mot et l'autre : 'VIVRE' et 'MANGER' La requête est basée sur la même requête que précédemment, avec en plus une clause d'agrégation avec un groupage :
recherche de texte contenant trois mots : 'BASSE' et 'GUITARE' et 'CONTREBASSE'
requête combinant des OU et des ET Recherche de texte contenant au moins deux mots sur 3, parmi 'MORT', 'SOI', 'VIVRE'
requête généralisée paramétrable De manière générale :
ou :
Ainsi la première requête (OU avec deux mots) peut s'exprimer :
ANNEXE : primitive en Pascal (Delphi) des fonctions de base : Nettoyage de la chaîne de caractères, découpage de la chaîne en mots et suppression des mots noirs.
2. Recherches sémantiquesMais notre travail n'en est pas pour autant fini. En effet il est souhaitable que si dans notre index, le mot voiture ne soit pas présent, mais qu'en revanche on y trouve véhicule, automobile, bagnole ou encore voitures (au pluriel), la requête effectuée nous trouve des résultats par similitude du concept. C'est la recherche sémantique... Apparentement sémantique d'un mot Un mot peut être apparenté à un autre de quatre manière :
Il convient donc de définir dans la base de données un lien entre divers mots, lien que l'on qualifiera (forme fléchie, synonyme, parent...). Bien entendu il faudra enrichir le "dictionnaire" de ces apparentements sémantiques ou bien acheter un tel dictionnaire sous forme de fichier électronique. 3. Mots mal orthographiésUne autre problématique de la recherche est que l'utilisateur peut avoir mal orthographié un mot. Les études menées à ce sujet ont montré que les principales anomalie d'écriture résidait soit dans l'inversion des lettres d'un mot, soit dans une erreur de frappe ou d'ortographe. 3.1. Erreur de frappePour retrouver un mot dont certaines lettres ont été inversées, il suffit de prendre toutes les lettres de ce mot et de les placer dans un ordre défini, l'ordre alphabétique en l'occurence semble le plus indiqué. Par exemple, notre utilisateur voulant trouver le mot guitare, tappe malencontreusement le mot guitrae. En conservant dans la base de données, pour chaque mot la liste de ses lettres dans l'ordre alphabétique, nous aurions stocké aegirtu. En cas d'échec de la recherche directe du mot on peut alors lister ses lettres dans l'ordre alphabétique et tenter de retrouver un mot contenant les mêmes lettres. Bien évidemment cette technique n'est pas une panacée, car deux mots comme portes et poster comportent les mêmes lettres mais sont dénués de sens commun ! 3.2. Orthographe défectueuseDonal Knuth, a proposé il y a maintenant plusieurs décennies, une méthode simple pour tenter de retrouver un mot mal orthographié. Il est parti du fait que si un mot était mal orthographié, il y avait fort à parier qu'en coupant le mot en deux, alors l'erreur avait toutes les chances de se trouver soit dans le demi mot de droite, soit dans le demi mot de gauche. Suivant cette hypothèse, il en concluait que l'autre demi mot restait bien orthographié. Il recherchait alors dans son dictionnaire les mots commençant par le demi de gauche et ceux finissant par le demi mot de droite. La liste de mots ainsi retrouvée devait alors comporter le mot correctement orthographié. Par exemple, notre utilisateur voulant trouver le mot guitare, l'orthographie guithare. L'algorithme ci-dessus présenté permettra de retrouver les mots commençant par guit... et ceux finissant par ...hare, dont voici la liste : guitare guitariste guitoune cithare 4. Mesure de pertinenceLa plupart des moteurs de recherche associées aux bases de connaissance affectent un poids aux résultats présentés, afin de proposer, en premier les résultats les plus pertinents, et en fin de liste les moins pertinents. Sans entrer dans les détails, on peut concevoir que le poids peut être considéré comme une logique floue ou la correspondance est parfaite (valeur 1) ou vide (valeur 0). Entre les deux, différentes valeurs réelles sont possibles afin de qualifier la pertinence de la recherche. On attribuera une valeur 1 à l'indice de pertinence lorsque tous les mots auront été trouvés exactement tel que saisie. Pour les autres correspondances on pourra par exemple évaluer la diminution de l'indice de chaque mot à l'aide du tableau ci dessous :
Exemple : L'utilisateur recherche "hôpital" et "guitare" Résultats : guitare, hôpital 1 guitare, hôpitaux 0,95 guitare, clinique 0,9 guitare, hospitaliser 0,8 Exemple 2 : L'utilisateur recherche "hôpital" et "guithare" (erreur d'orthographe) Résultats : guitare, hôpital 0,65 guitare, hôpitaux 0,6 guitare, clinique 0,55 guitare, hospitaliser 0,5
|
Copyright © 2004 Frédéric Brouard. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.