Développer un modèle vectoriel sur la base de la représentation VSM. Nous ne réaliserons pas d'évaluation cette année.
Pour le traitement des requêtes, vous pouvez vous référer au transparent 12 du cours. On va traiter la requête en calculant la correspondance RSV par un calcul de cosinus. Ce cosinus est égal au produit scalaire des vecteur d et q divisé par le produit des normes de d et de q. Vous avez déjà stocké tout ce qu'il nous faut dasn les séances précédentes : le fichier outil pour analyser les requêtes, le vocabulaire avec les idf pour créer les vecteurs requêtes, l'index pour calculer les correspondances, les normes des documents dans le TP précédent. Comme nous l'aons vu en cours, fait d'utiliser l'index inversé permet de calculer très rapidement le produit scalaire, en se focalisant sur les dimensions pour lesquelles d et q sont non-nulles en même temps.
On va utiliser la représentation du vocabulaire vu aux TPs précédents, et permettre de traiter une requête fournie en direct.
Le programme de traitement des requêtes ne doit pas relancer la création du vocabulaire, de l'index ou des normes des vecteurs documents.
Votre programme va :
Le coeur de votre travail va donc ici être d'écrire une fonction regroupant le point 4 ci-dessus, et qui retourne les k documents les plus similaires à une requête donnée par la mesure de similarité cosine, où k est un paramètre d'entrée de la fonction.
NOTES : 1. Votre code doit être robuste aux erreurs (par exemple ne pas planter si un terme de la requête n'est pas dans le vocabulaire). 2. Votre code doit donner exactement le même résultat avec le requête “computer” et “computer computer”. 3. Si il y a moins de k documents qui répondent, votre programme ne doit pas planter.
Infos additionnelles pour l'utilisation de l'index inversé A LIRE.
Exemple: Pour la requête "a1" le résultat (sans arrondi, et avec les noms de fichiers initiaux, 10 premiers résultats) est : 1 . CACM-1539 0.7360533125872257 2 . CACM-1218 0.5370128320439512 3 . CACM-1840 0.48823786194521684 4 . CACM-1219 0.48488589645993635 5 . CACM-2121 0.4815574765638951 6 . CACM-1538 0.46689746802257087 7 . CACM-1537 0.46689746802257087 8 . CACM-2103 0.4651415247593109 9 . CACM-1557 0.46135116066409054 10 . CACM-1217 0.45468997397016137
Autre exemple :
Exemple: Pour la requête "infinity" le résultat (sans arrondi, et avec les noms de fichiers initiaux, 10 premiers résultats) est : 1 . CACM-1977 0.20791032426181502 2 . CACM-1638 0.1475147469974677 3 . CACM-1721 0.12743135017963975 4 . CACM-2786 0.11337293099881011 ... il n'y a que 4 documents qui répondent...
Bonus optionnel : si vous avez terminé tous les éléments précédents vous pouvez choisir d'améliorer le système en :
Vous devez écrire un rapport sur l'ensemble de vos travaux durant les 5 séances de TP (génération des vecteurs documents, de l'index inversé, recherche). Vous devez m'indiquer grossièrement les choix faits, et des extraits des résultats de chaque programme en fonction des entrées. Vous devez générer un fichier zip quoi contient l'ensemble de vos codes python écrits (et commentés), avec un README qui décrit un une phrase vos programmes et qui indique leur usage.
Vous devez m'envoyer par mail, réception avant le 10 avril 2024 à 23h59, le pdf et le zip à Philippe.Mulhem@imag.fr avec le titre : “[INFO4-TP-ARI] Nom1 Nom2” avec vos noms si vous être 2 auteurs, et “[INFO4-TP-ARI] Nom” avec votre nom si vous êtes un seul auteur.
Contenu du rapport :
Pour afficher les éléments d'un dictionnaire dans un ordre donné (ici ordre décroissant), on peut utilisé la fonction itemgetter de la librairie operator de Python, de la manièere suivante sur une variable resultat_partiel qui est un dictionnaire qui contient en clé l'identifiant de document et en valeur de cosinus calculé :
import operator from operator import itemgetter ... # affiche les 10 premiers resultats de resultat_partiel (dictionnaire [ "id de doc" : score de cosinus]), trié par ordre décroissant sur les valeurs de cosinus (récupérées par itemgetter(1)) nb=0 for key, value in reversed(sorted(resultat_partiel.items(), key = itemgetter(1))): print (nb+1,". ",key," ",value) nb += 1 if nb >= 10: break