Accueil  / Semaine 10 / Mise en situation

Mise en situation

Plan

1. La troncature

2. L’analyseur

3. Petit exercice de réchauffement

4. Le classement des résultats de recherche sous Lucene

5. Un mot sur les méthodes de recherche utilisées par Lucene


1. La troncature

Vous avez vu, dans la présentation de la semaine 10, que vous pourriez avoir à utiliser la troncature dans le cadre de votre activité notée sur Lucene.

Sur le site du Service de recherche documentaire DSI, la troncature (stemming) est définie comme suit :

« La troncature est un signe qui remplace une ou plusieurs lettres d’un mot. En général, elle est représentée par l’astérisque *. Selon les auteurs, la troncature est appelée troncation, joker, wildcard ou masque. »

Recourir à la troncature simplifiera la recherche en évitant l’utilisation abusive de l’opérateur logique OU lors de recherches portant sur des mots irréguliers (cheval OU chevaux), sur les différents temps d’un verbe (demander OU demanderait OU demandera), ou sur des mots singuliers ou pluriels (table OU tables), etc.


2. L’analyseur avec troncature française et anglaise

Au lieu d’utiliser l’Analyzer de base, on peut utiliser un Analyzer qui va appliquer la troncature française : org.apache.lucene.analysis.fr.FrenchAnalyzer. Pour l’anglais, on utilisera plutôt org.apache.lucene.analysis.fr.EnglishAnalyzer.


3. Petit exercice de réchauffement

Vous trouverez les fichiers de cette activité sur GitHub.

Afin de vérifier le fonctionnement de Lucene avec le procédé de la troncature, nous vous proposons d’effectuer l’exercice suivant :

- 1. Copiez le programme ajout.java qui vous a été fourni à la semaine 9 du cours sous les noms ajout1.java, ajout_stem_frs.java et ajout_stem_eng.java. Copier le programme recherche.java sous les noms recherche_frs.java et recherche_eng.java

- 2. Dans chacun des programmes, modifiez le nom de la classe ajout ou recherche par le nom du fichier sans l’extension java (ajout1, ajout_stem_frs, ajout_stem_eng, recherche_eng, ou recherche_frs). Assurez-vous que ces fichiers se trouvent directement dans le répertoire où vous avez installé Lucene, par exemple le c :\lucene.

- 3. Dans les fichiers ajout1.java, ajout_stem_frs.java, et ajout_stem_eng.java, remplacez les contenus des cinq documents par les éléments suivants :

String doc1_contenu = "swimming";
String doc2_contenu = "trimming";
String doc3_contenu = "chants";
String doc4_contenu = "chant";

- 4. Modifiez les programmes ajout_stem_frs et recherche_frs de manière qu’ils utilisent d’abord l’analyseur français, pour qu’ils effectuent ensuite la troncature en français. Il faut remplacer les lignes « Analyzer analyseur = new StandardAnalyzer(Version.LUCENE_46) ; » par la ligne « Analyzer analyseur = new FrenchAnalyzer(Version.LUCENE_31) ; » Modifiez aussi le répertoire où l’index sera créé (« index »). (Notez que vous obtiendrez des résultats différents avec « Analyzer analyseur = new FrenchAnalyzer(Version.LUCENE_46) ; ». En effet, Lucene a adopté un modèle de troncature minimaliste après la version 3.1.)

- 5. Modifiez les programmes ajout_stem_eng et recheche_eng de manière qu’ils utilisent l’analyseur anglais, pour qu’ils effectuent ensuite la troncature en anglais. (Indice : Analyzer analyseur = new EnglishAnalyzer(Version.LUCENE_46) ;) Modifiez aussi le répertoire où l’index sera créé (« index »).

- 6. Compilez tous les programmes avec javac. Faites référence aux lignes de commande proposées la semaine dernière.

- 7. Exécutez le programme ajout1, puis le programme recherche, en lui fournissant les données suivantes (notez les résultats dans un tableau) :

- 1er tour : swimming
- 2e tour : trimming
- 3e tour : swim
- 4e tour : trim
- 5e tour : chants
- 6e tour : chant

- 8. Reprenez l’étape 7 avec les programmes ajout_stem_frs et recherche_frs (notez les résultats dans votre tableau).

- 9. Reprenez l’étape 7 avec les programmes ajout_stem_eng et recherche_eng (notez les résultats dans votre tableau).

Vous remarquerez que Lucene n’effectue pas de troncature avec l’analyseur standard. Il ne trouve que les mots présentés dans leur intégralité, peu importe la langue.

Vous noterez également que Lucene n’effectue la troncature qu’en une seule langue, selon le paramètre transmis. Ainsi, si la troncature est faite avec le paramètre english, Lucene retrouvera swim pour swimming, mais pas si on choisit la troncature française.

La troncature française est parfois limitée par défaut avec Lucene.


4. Le classement des résultats de recherche sous Lucene

Vous avez noté que Lucene ordonne les résultats de ses recherches, plutôt que de donner les documents trouvés dans l’ordre.

En fait, lors d’une recherche dans un index de Lucene, une série ordonnée de résultats sera retournée. Par défaut, ces résultats seront ordonnés selon un pointage compris entre 0 et 1.

Ce pointage est calculé pour chaque document de l’index en tenant compte de divers facteurs :

- la fréquence du terme recherché dans le document ;
- la fréquence inverse du terme ;
- des valeurs de normalisation et de correction basées sur le nombre de termes compris dans un champ, l’importance accordée à un champ en particulier, etc.

Si vous voulez en savoir plus sur le calcul du pointage lors de l’ordonnancement des résultats, nous vous suggérons de vous référer au chapitre 3.3 de l’excellent livre Lucene in Action de Gospodnetic et Hatcher. Ce chapitre est disponible en format PDF à l’adresse suivante :

http://www.manning.com/hatcher2/

Il est toutefois possible de modifier, au besoin, l’ordre dans lequel les résultats seront retournés afin d’obtenir des résultats par pertinence (avec le pointage, par défaut), par ordre dans lequel les documents se retrouvent dans l’index, par la valeur d’un champ ou de champs spécifiques, etc.

Ces différentes méthodes de tri sont précisées en détail à la section 5.1 du livre Lucene in Action.


5. Un mot sur les méthodes de recherche utilisées par Lucene

Dans les sections 6 à 8, vous vous êtes familiarisé avec les différentes méthodes de recherche d’informations et avec la notion d’index inversé. Évidemment, pour rechercher de l’information, Lucene doit utiliser concrètement des méthodes de recherche et créer des index inversés.

Vous avez probablement compris que la création d’un index inversé est fondamentalement un problème lié aux nombreux tris, à leur efficacité et à leur rapidité.

Pour créer rapidement des index, Lucene utilise une approche légèrement différente de la plupart des outils de recherche traditionnels. Plutôt que de maintenir un seul index, il bâtit plusieurs segments d’index, qu’il fusionne périodiquement. Ainsi, pour chaque nouveau document indexé, Lucene crée un nouveau segment qui sera rapidement fusionné avec d’autres segments plus grands, de manière que les recherches se fassent rapidement.

Si on veut optimiser l’index pour faire une recherche très rapide, Lucene peut fusionner l’ensemble des segments en un seul index.

Pour prévenir les problèmes qui pourraient se présenter entre les processus qui créent des index et ceux qui les modifient, Lucene ne modifie jamais un segment nouvellement créé. Il en crée d’abord une copie qui sera modifiée, puis qui remplacera l’ancienne version du segment.

Cette approche flexible permet de choisir efficacement entre rapidité d’indexage et rapidité de recherche, selon les besoins de l’utilisateur.

Notez finalement qu’un segment d’index sous Lucene contient plusieurs fichiers :

- un index du « dictionnaire » qui contient une entrée pour 100 entrées dans le dictionnaire original ;
- un dictionnaire qui contient une entrée pour chacun des mots uniques recensés ;
- un index contenant le nombre d’occurrences de chaque entrée dans chaque document.

Lucene utilise également toute une série de techniques pour compresser l’espace disque utilisé par ces fichiers sans trop augmenter le temps CPU nécessaire à leur récupération.


Voilà, vous avez expérimenté l’outil de recherche Lucene et effectué quelques modifications à des programmes Java de façon à l’utiliser selon vos goûts. Vous êtes maintenant invité à passer à la section suivante et à faire l’activité notée de la semaine 10.