Les informations sur le langage python (version 2.7) vous ont été fournies dans le tp précédent. Dans ce TP, vous pouvez utiliser python 2.7 ou 3.7 : faites le choix au début et nanchangez plus ensuite.
Nous allons manipuler un système de recherche d'information développé en deux versions de python: 2.7 et 3.7. Si vous utilisez python 2.7, utiliser la commande python, et avec python 3.7 utiliser les commandes python3 ou python3.7.
On vous fourni contient 3 programmes : pour python 2.7 et 3.7 l'indexation est la même avec: (indexer_gendico_miashs.py, indexer_genindex_miashs.py. Pour la recherche, si vous utilisez python 2.7 moteurderecherche_miashs.py) et avec python 3.7 moteurderecherche_miashs37.py). Ces programmes, quelque soit la version de python, utilisent un fichier d'anti-dictionnaire common_words.txt, fourni, qui contient les 200 mots les plus fréquents du corpus.
Le système que vous aller utiliser est composé de plusieurs programmes :
Dans cette partie, vous devez définir quelle version de python vous utilisez (version 2.x ou 3.x et au dessus), et vous devez installer la librarie python nltk (Natural Language ToolKit) qui permet de faire la troncature des mots par l'algorithme de Porter décrit en cours.
Si vous savez quelle version de python vous utilisez (si vous êtes sur votre machine personnelle par exemple), et si vous savez installer une librarie python avec pip (ou pip3) alors vous n'avez qu'à installer la librairie python avec pip install nltk ou pip3 install nltk, et vous pouvez passer à la suite.
Si vous utilisez python 2.7.x. Vérifiez que vous avez la bonne version en tapant : python –version“ et vérifiez que vous avez bien 2.7.x. Vérifiez que la commande pip existe pour python 2.x (en tapant pip –version). Si cette commande fait une erreur alors faites la suite, sinon faite pip install nltk.
Afin de pouvoir utiliser des librairies spécifiques nécessaires au code qui vous est fourni, vous devez installer le logiciel adéquat en tapant :
wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py python /tmp/get-pip.py --user
Uniquement si le wget ne fonctionne pas, rapatriez : get-pip.py avant de lancer python /tmp/get-pip.py –user .
Les programmes du système de recheche d'information fourni ne fonctionnent que si vous avez installé la librarie python nltk, que vous installez dans un terminal en lançant la commande
~/.local/bin/pip install --user nltk
Si vous utilisez python 3.7.x. Vérifiez que vous avez la bonne version en tapant : python –version” (ou python3, ou python 3.7) et vérifiez que vous avez bien 3.7.x. ou ultérieur.
Vérifiez que la commande pip3 existe pour python 3.x (en tapant pip3 –version). Si cette commande fait une erreur alors faites la suite, sinon faite pip3 install nltk.
Afin de pouvoir utiliser des librairies spécifiques nécessaires au code qui vous est fourni, vous devez installer le logiciel adéquat en tapant :
wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py python /tmp/get-pip.py --user
Uniquement si le wget ne fonctionne pas, rapatriez : get-pip.py avant de lancer python /tmp/get-pip.py –user .
Les programmes du système de recheche d'information fourni ne fonctionnent que si vous avez installé la librarie python nltk, que vous installez dans un terminal en lançant la commande
~/.local/bin/pip3.7 install --user nltk
Si pb avec pip3.7, regarder si pip3.8 ….
Créer un répertoire, par exemple “corpus_tp2” qui va contenir les documents du corpus.
Dans ce répetoire, vous créez 3 documents en anglais (doc-1, doc-2 et doc-3 qui contiennent respectivement :
Le petit système fourni est composé de 3 programmes :
Le fichier d'anti-dictionnaire à utiliser est common_words.txt (cf. ci-dessus partie 1).
Cette partie vous fait utiliser le système, sans le modifier.
1. Lancez la génération du dictionnaire en utilisant le programme indexer_generdico_miashs.py (indexer_generdico_miashs37.py) avec les bons paramètres.
Ce programme génère le fichier de vocabulaire avec, pour chaque ligne :
mot df idf
qui donne pour chaque mot du vocabulaire son df, et son idf (=ln(ND/df), comme vu en cours, avec log népérien)
2. D'après le fichier vocabulaire généré, est-ce que le traitement passe les mots en minuscules ? Changez un mot de l'un des documents et relancez la commande pour vérifier.
3. Est-ce que le traitement utilise de la troncature ? Remplacez le mot “cerebral “du document doc-2 par “cerebrals” pour vérifier et relancer la commande.
4. Expliquer pourquoi le mot “opacity” n'est-il pas dans le fichier vocabulaire généré.
5. Pour vérifier votre supposition, enlevez le mot “opacity” du document doc-3 document et relancer la génération du vocabulaire. Que constatez-vous ? Remettez le mot opacity dans le document doc-3 avant de continuer.
6. Faire un calcul de df et d'idf pour l'un des termes, afin de vérfier que vous êtes d'accord avec les valeurs présentées.
1. Lancez le programme indexer_genindex_MIASHS.py (indexer_genindex_MIASHS37.py) avec les bons paramètres. Ce programme crée le fichier inverse (avec les poids tf.idf tes termes pour les documents) en utilisant le format json (fichier texte).
Le format json représente n'importe quelle structure, par exemple :
{"anterior": [["doc-3", 1.09861228867]], "anteroposterior": [["doc-2", 1.09861228867]]} représente un dictionnaire (cf. tp précédent) avec 2 entrées (les clés) : "anterior" et "anteroposterior". Pour l'entrée "anterior", une liste composée d'un seul couple ["doc-3", 1.09861228867], correspondant au poids tf.idf de anterior dans le document doc-1.
2. Regardez le fichier inverse qui est généré sur vos trois documents. Vérifiez que tous les termes du vocabulaire apparaissent.
3. Vérifiez les valeurs stockées pour le terme “cortex” dans le document doc-2 : refaites-le calcul tf.idf .
1. Lancez le programme de traitement de requêtes moteurderecherche_miashs.py avec les bons paramètres.
Ce programme s'exécute en affichant par exemple, si on pose une requête avec un seul terme “left” :
***************** chargement normes de documents ***************** chargement fichier inverse ***************** chargement antidico --------------------------------------- Bienvenue dans le moteur de recherche ! --------------------------------------- Que cherchez-vous ? left -- Requete avec tf seul avant recherche si terme dans vocabulaire : {u'left': 1} -- Requete avec tf.idf avant recherche si terme dans vocabulaire : {u'left': 1.09861228867} -- Requete avec tf.idf normalise'e pour terme dans vocabulaire : {u'left': 1.0} -- Details du calcul de la correspondance avec le fichier inverse : left Ligne du fichier inverse trate'e : [[u'doc-1', 1.09861228867]] *** Resultat final *** (u'doc-1', ' (', 0.4916981343104934, ')') ***
Ce programme stocke le vecteur requête normalisé pour effectuer le calcul de cosinus.
2. Vérifiez que le programme gère correctement les mots en majuscule (en les transformant en minuscules) et les mots de l'anti-dictionnaire et les éliminant de la requête).
3. Posez la requête “left lung tumor heart” , et faire le calcul du cosinus pour vérifier que le résultat est bien celui du calcul de cosinus.
Cette partie vous fait modifier le système, pour étudier l'impact des éléments. gardez bien les programmes originaux car vous allez vous en servir pour comparaison
Dans cette partie, vous utiliserez les mêmes fichiers documents que précédemment.
1. Vous devez modifier le code du programme d'indexation et de requêtes, afin qu'il n'applique pas l'anti-dictionnaire. Ce traitement est réalisé par la fonction
filtreMotsOutils
de la génération de vocabulaire gendico (utilisée par les autres programmes).
2. Quel est l'impact de ce traitement sur la taille du vocabulaire, et pourquoi ?
3. Ensuite, vous allez modifier le code du programme d'indexation et de requêtes, afin qu'il ne tronque pas les termes, en remettant l'utilisation de l'anti-dictionnaire. Ce traitement est réalisé par la fonction
mot2racine
dans gendico.
4. Quel est l'impact de ce traitement sur la taille du vocabulaire, et pourquoi ?
On va se baser sur le système que vous venez de modifier, sans anti-dictionnaire et sans troncature des termes.
1. Refaire le même traitement que précédemment sur les calculs en écrivant une requête avec au moins 2 termes dont au moins l'un des deux est affecté par la troncature.
2. Comparer le résultat de cette requête sur le sysème modifié et, pour la même requête, sur le système original fourni.
optionnel : non-noté
Un court compte-rendu avec le noms du ou des auteurs (entre 2 et 4 pages) contenant :
Envoyer le document, avant le 30 mars 23h59, au format pdf à Philippe.Mulhem@imag.fr avec le titre : ”[MIASHS-TP2] Nom1 Nom2” avec vos noms si vous être 2 auteurs, et “[MIASHS-TP2] Nom” avec votre nom si vous êtes un seul auteur.