Skip to content

charlesdlrsa/get_zat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

72 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Get_zat : notre projet de recherche d'informations

Auteurs : Erwan de Kergaradec et Charles de la Roche Saint André

Introduction

Vous trouverez dans ce ReadME l'ensemble de nos résultats concernant notre projet scolaire de "Fondements à la recherche d'informations". Ce premier projet a pour objectif de mettre en œuvre les notions fondamentales d’indexation et de modèles de recherche vues en cours par la réalisation d’un petit moteur de recherche ad-hoc. Il s'appuie sur la base statique de documents textuels CACM contenant un ensemble de corpus, questions et réponses associées.
Chacune des parties ci-dessous détaille le contenu de nos fichiers .py contenus dans le dossier code ainsi que les rôles respectifs de nos fonctions.
La dernière partie explique comment lancer notre code contenu dans le fichier main.py pour retrouver les mêmes résultats et faire vos propres recherches sur le corpus CACM.

Lecture des datasets

Toutes les fonctions de lecture des datasets sont présentes dans notre fichier file_manager.py.
Elles nous permettent de lire nos datasets de documents, questions et réponses associées et de stocker les informations sous forme de dictionnaires python dont :

  • les clefs sont les identifiants des documents, questions et réponses
  • les valeurs sont les données textuelles associées à chaque document, question, réponse

Voici les différentes informations recoltées sur les collections :

  • collection de documents : 3204 documents
  • collection de questions : 64 questions
  • collection de réponses : 52 réponses

Traitement linguistique

Les fonctions filtrant nos données linguistiques se situent dans le fichier nlp_processing.py.
Elles nous permettent de :

  • tokeniser nos textes
  • supprimer les chiffres
  • supprimer les mots communs
  • raciniser les mots

Une fois notre collection de documents tokenisée, nous trouvons les informations suivantes :

  • nombre de tokens de notre collection : 108 113 tokens
  • graphe de la fréquence (f) vs rang (r) pour tous les tokens de la collection :

Indexation

La construction de notre index inversé a lieu dans le fichier browser.py au sein de la fonction build_index_inv.
Notre index inversé est un dictionnaire dont :

  • les clefs sont les tokens de notre collection de documents
  • les valeurs sont des dictionnaires dont:
    • les clefs sont les identifiants de nos documents contenant le token
    • les valeurs sont les fréquences d'apparition du token dans le document en question

Nous avons pu déterminer de cet index inversé la taille de notre vocabulaire : 5405 tokens.

Moteur de recherche booléen

Nous avons mis en place un modèle de recherche booléen présent dans le fichier browser.py au sein de la fonction boolean_request.
Ce modèle de recherche se base sur une requête contenant deux mots clefs et un opérateur.
Assez basiquement, on prétraite nos deux mots de la même manière que notre collection de documents, puis on regarde quels documents contiennent le premier mot et quels documents contiennent le second mot.
Ensuite, en fonction de l'opérateur (AND, OR, NOT), on renvoie la liste triée de documents correspondants à notre requête booléenne.

Modèle de recherche vectoriel

Nous avons ensuite mis en place un modèle de recherche vectoriel plus élaboré également présent dans le fichier browser.py au sein de la fonction compute_vectors.
Ce modèle fait appel à plusieurs classes se trouvant dans le fichier vectorizers.py et correspondant aux pondérations évoquées ci-dessous.
Il s'agit ici de vectoriser chaque phrase dans une représentation de tout le vocabulaire de notre corpus. La dimension de chaque vecteur correspond donc à la taille du vocabulaire.

Pondération booléenne

Dans le cas de la pondération booléenne, la vectorisation est assez simple : le vecteur d'un document contient un 1 dans la colonne i si le mot représenté par la colonne i est contenu dans ce document, sinon cela vaut 0. La requête est vectorisée de la même manière. On peut alors cacluler une distance de similarité entre chaque document et la requête ce qui permet de renvoyer tous les documents 'proches' de la requête.

Pondération tf-idf

Cette fois-ci le poids associé à la colonne i est différent : on calcule la fréquence d'apparition du mot représenté par la colonne i dans chaque document ainsi que sa fréquence d'apparition dans tout le corpus.
Cela permet d'accorder moins d'importance aux mots très présents dans le corpus et se focaliser sur les mots-clés.
La requête peut ici est vectorisée selon la méthode booléenne ou tf-idf.
On peut donc encore calculer une distance de similarité entre ces vecteurs.

Pondération tf-idf normalisée

Au sein de cette méthode de pondération, il s'agit de reprendre la pondération tf-idf mais on normalise chaque vecteur.

Pondération fréquence normalisée

Dans ce cas, on calcule encore la fréquence du mot représenté par la colonne i mais on divise cette valeur par la fréquence maximale pour chaque doc_id, ce qui assure également des poids compris entre 0 et 1 mais propose une variante.

Evaluation pour la collection CACM

Afin d'évaluer la collection CACM, nous avons d'abord réalisé un apprentissage sur cette collection (en choisissant un type de vectorisation).
Nous nous sommes servis des fichiers query.txt et qrels.txt afin de tester notre moteur de recherche ainsi entrainé.
Il s'agit de prédire les documents pertinents pour chaque requête de query.txt et de le comparer aux réponses du fichiers qrels.txt. Ceci nous permet de calculer la précision et le rappel pour un seuil de similarité fixé.

Afin de tracer le graphe Précision-Rappel ci-dessous, nous avons fait varier le seuil de similarité (faisant ainsi varier le degré de précision du moteur de recherche). Voici le graphe obtenu pour le modèle tf-idf :

Expérimentez-vous même !

Voici les différentes étapes à suivre afin de pouvoir lancer par vous-même notre code.

1. Installer le package python virtualenv :

pip3 install virtualenv or pip install virtualenv

2. Allez dans le répertoire de votre choix, créez-y un environnement virtuel et activez le :

cd ./your_directory

virtualenv venv

  • Linux / MacOS: source venv/bin/activate

  • Windows: .\venv\Scripts\activate.bat

3. Allez dans le dossier venv et clonez-y le projet github :

cd ./venv

git clone git@github.com:charlesdlrsa/get_zat.git en ssh
git clone https://github.com/charlesdlrsa/get_zat.git en https

4. Pour lancer notre code, vous avez besoin d'installer certains "requirements".

cd ./get_zat

pip3 install -r requirements.txt or pip install -r requirements.txt


5. Vous pouvez lancer notre code et retrouver tous les résultats du ReadMe :

python3 main.py or python main.py

Vous devriez voir apparaitre dans votre console nos différents résultats.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages