Indexation documentaire & bases de donnéesA 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
|