3. Mineure « Data Science » Frédéric Pennerath
Le problème de la recherche d’information
(information retrieval)
Ensemble de
références
Application
cliente
Moteur de
recherche
d’information
Ensemble de
documents
Documents :
– Textes (bases documentaires)
– Hypertextes, documents XML/HTML
– R.I multimédia : images, vidéo, sons, etc
Granularité des réponses :
– Page web (URL)
– Documents (pdf,.doc, etc)
– Section, chapitre, page
– Paragraphes
Langage de requête :
– Mots clés pour le texte
– Requête par l’exemple (image, son, etc)
– Algèbre : opérateurs logiques, opérateurs
de proximité
Requête Réponse
4. Mineure « Data Science » Frédéric Pennerath
Objectifs
1. Démystifier les moteurs de recherche :
– Problème résolu depuis longtemps (bases documentaires)
– Théorie très simple : recherche linéaire dans des listes
2. Prétexte à introduire des notions connexes
– Modèles IR : modèle booléen, vectoriel, probabiliste
– Algorithmique : indexation, optimisation des requêtes, B-tree, correction
orthographique
– Fouille de texte et traitement automatique du langage naturel (TALN)
– Problématique du Big Data : parallélisme des données (Map Reduce), NoSQL
– TechniquesWeb : crawling /scraping
5. Mineure « Data Science » Frédéric Pennerath
La préhistoire de la recherche d’information :
l’approche de type « grep »
• Principe du grep :
grep(requête Q)
Liste L
pour chaque document D,
si D satisfait Q, ajouter la référence de D à L
fin pour
retourner L
• Avantage : requête sophistiquée (expressions régulières)
• Inconvénient :
– Parcours de toute la base documentaire à chaque requête
– Très lent car pas de prétraitement
– Inutilisable pour la recherche sur le Web
6. Mineure « Data Science » Frédéric Pennerath
RECHERCHE D’INFORMATION
MODÈLE LOGIQUE
ET
IMPLÉMENTATION
7. Mineure « Data Science » Frédéric Pennerath
Index inversé
(inverted index)
Principe :
– Index inversé = ensemble (liste) des documents associés à / contenant un terme
– Vocabulaire = ensemble des termes indexés
– Les index inversés sont calculés offline.
– Le traitement online d’une requête combine les index inversés :
recherche(requête « M1 et M2 »)
Index L1 <- ensemble des documents contenant M1
Index L2 <- ensemble des documents contenant M2
Liste L <- intersection de L1 et L2
retourner L
Avantage :
– Rapide car minimise le traitement online
Inconvénient :
– Nécessite des capacités de stockage importantes.
– Que se passe t-il si un terme de la requête n’est pas dans le vocabulaire ?
8. Mineure « Data Science » Frédéric Pennerath
Langage de requêtes booléennes :
• Opérateurs logiques ET, OU, NON
• Langage des premiers moteurs de recherche
• Exemple : vienne AND NOT(autriche OR département)
• Peu adapté à l’usage :
– Liste de résultats trop longue ou trop courte
– Résultat « à plat » : pas de tri des résultats par importance
– Utilité du OU et du NON discutable : la conjonction de termes est la plus naturelle
pour décrire le concept recherché.
Exemple : vienne AND isère
ET (x)
OU (x)
ET NON (x)
9. Mineure « Data Science » Frédéric Pennerath
Implémentation d’un index inversé
• Chaque document dispose d’un identifiant unique entier (UID)
• Chaque mot est associé à la liste des UIDs des documents contenant ce mot,
rangés par UID croissant.
• Cette liste est stockée dans un fichier que l’on peut lire rapidement selon
une lecture séquentielle des blocs disque.
vienne 1 4 5 9 12 15
isère 2 4 5 6 9
vienne ET isère 4 5 9
10. Mineure « Data Science » Frédéric Pennerath
Traitement séquentiel de l’opérateur ET
intersection(fichier index L1, fichier index L2)
entier uid1 = lire(L1), uid2 = lire(L2);
créer fichier index L vide;
tant que uid1 et uid2 sont définis
si(uid1 < uid2) uid1 = lire(L1);
sinon si(uid1 > uid2) uid2 = lire(L2);
sinon
écrire uid1 dans L; uid1 = lire(L1); uid2 = lire(L2);
fsi
fin tant que
retourner L
L1 1 4 5 9 12 15
L2 2 4 5 6 9
L 4 5 9
NB: possibilité d’accélérer
l’algorithme avec des « skip lists »
11. Mineure « Data Science » Frédéric Pennerath
Traitement séquentiel de l’opérateur NON
• Problème : l’index de NON(M) est énorme et non stockable.
• Solution :
– l’opérateur NON n’est acceptable que dans le cas d’une requête « M1 ET NON M2 ».
– Dans ce cas l’algorithme s’apparente au calcul d’une intersection.
intersectionEtNegation(fichier index L1, fichier index L2)
entier uid1 = lire(L1), uid2 = lire(L2);
créer fichier index L vide;
tant que uid1 et uid2 sont définis
si(uid1 < uid2) { uid1 = lire(L1); écrire uid1 dans L; }
sinon si(uid1 > uid2) uid2 = lire(L2);
sinon
écrire uid1 dans L; uid1 = lire(L1); uid2 = lire(L2);
fsi
fin tant que
tant que uid1 est défini { écrire uid1 dans L; uid1 = lire(L1); }
retourner L
12. Mineure « Data Science » Frédéric Pennerath
Optimisation du moteur de requête
• Accès aux index d’un mot grâce à un B-tree
• Composition des opérations par accumulation en mémoire (cache)
• Ordonnancement des opérations pour minimiser la taille du résultat et le temps de
calcul
1. Mettre la requête sous forme DNF (disjunctive normal form)
2. Négation à la fin des conjonctions
3. Ordonner les conjonctions en commençant par les index les plus courts.
• Exemple : (A and not B and (C or D) and E)
– Réécriture : (A and not B and C and E) or (A and not B and D and E)
– Ordonnancement : (((E and C) and A) and not B) or …
– Calcul :
L ← intersection(LE,LC)
L ← intersection(L,LA)
L ← intersectionEtNegation(L,LB)
Terme Fréquence
A 100M
B 20M
C 30M
D 50M
E 1M
13. Mineure « Data Science » Frédéric Pennerath
RECHERCHE D’INFORMATION
MODÈLEVECTORIEL
ET
IMPLÉMENTATION
14. Mineure « Data Science » Frédéric Pennerath
Le modèle vectoriel :
Modèle booléen peu adapté :
– Réponses binaires trop rigides (trop ou pas assez de résultats)
– Pas de classement des résultats
Introduction du modèle vectoriel :
– Représentation des requêtes et des documents par des vecteurs
– Chaque terme du vocabulaire est une dimension de l’espace vectoriel.
– Approche « sac de mots » : un vecteur équivaut à un ensemble pondéré de mots.
– Deux vecteurs sont similaires s’ils sont alignés.
→ Score d’un document d pour une requête q : angle entre d et q
𝑠𝑖𝑚 𝑞, 𝑑 = cos 𝑞, 𝑑 =
𝑞 ⋅ 𝑑
𝑞 ⋅ 𝑑
Avantages :
– Classement des résultats selon un score.
– Pas de différence entre requêtes et documents : requête par document possible.
– Possibilité d’appliquer les méthodes de classification numérique (SVM, etc)
t1
t2
t3
t4
t5 t6
t7
dim = nbr. de termes
15. Mineure « Data Science » Frédéric Pennerath
Les coordonnées tf-idf :
Comment calculer le poids wd,t (coordonnée) d’un terme t dans un document d ?
𝑑 =
𝑡∈𝑉𝑜𝑐𝑎𝑏.
𝑤𝑑,𝑡 ⋅ 𝑢𝑡
Le poids wd,t doit être d’autant plus grand que :
– Le terme t est informatif (rare dans l’ensemble des documents)
– Le terme t est présent dans le document d.
Modèle tf-idf : poids = information (en bits) pour coder les occurrences de t
𝑤𝑑,𝑡 = 𝑡𝑓𝑑,𝑡 × 𝑖𝑑𝑓𝑡 = 𝑡𝑓𝑑,𝑡 × log2
𝑁
𝑁𝑡
– tfd,t (term frequency) : nbr. d’occurrences de t dans le document d
– idft (inverse document frequency) : information pour coder une seule occurrence de t
– N : nbr. de documents / Nt : nbr. de documents contenant t
Questions : à quelle condition deux documents
– Sont parfaitement similaires (𝑠𝑖𝑚 𝑑1, 𝑑2 = 1) ?
– Ne partagent aucune similarité (𝑠𝑖𝑚 𝑑1, 𝑑2 = 0) ?
17. Mineure « Data Science » Frédéric Pennerath
Implémentation du modèle tf-idf :
structure des index
Intégration dans les index :
• Chaque index de terme t est associé à son idft
• Chaque entrée dans l’index du terme t contient tft,d en plus du docID de d.
vienne / 20 bits 1/10
isère / 18 bits 1/2
tft,d
idft
4/2
3/1
5/7 9/4
docID
4/4 9/5
1
…
4.104
…
4 103
docID
Algorithme de calcul des similarités :
• Les docID sont traités un par un en progressant en parallèle dans les index des termes
de la requête
• Le score de chaque docID est calculé.
• Une file de priorité contient en permanence les k meilleurs docIDs trouvés.
𝒅
19. Mineure « Data Science » Frédéric Pennerath
Implémentation du modèle tf-idf :
parcours des index
Entrées : requête q, nbr. de réponses attendues k, table d’index I[]
Sortie : liste L des k meilleures réponses
créer une file de priorité F de couples(docID, score) maximale sur les scores
créer une file de priorité D de triplets (index, docID, tf-idf) minimale sur docID
pour chaque terme t de la requête q
insérer (I[t], d, tf * I[t].idf) dans D
où (d, tf) est la première entrée de l’index I[t] du terme t
fin pour
docIdCourant <- 1; score <- 0;
tant que D n’est pas vide
(index I, docID d, tf-idf) <- D.retirerMinimum()
si(d == docIdCourant)
score <- score + tf-idf
si I n’a pas été entièrement lu
(d, tf) <- lire prochaine entrée de I
D.insérer(I, d, tf * I.idf);
fin si
sinon
score <- score / norme[docIdCourant];
F.insérer((docIdCourant , score)); F.écrêter(k);
score <- 0; docIdCourant <- d
fin si
fin tant que
recopier F dans L; retourner L
20. Mineure « Data Science » Frédéric Pennerath
RECHERCHE D’INFORMATION
MODÈLE PROBABILISTE
ET
IMPLÉMENTATION
21. Mineure « Data Science » Frédéric Pennerath
Le modèle probabiliste :
1er principe : Probability Ranking Principle
Problème : à quelle condition 𝑅 = 1|𝑄, 𝐷 ?
Réponse : si
𝑃 𝑅 = 1 𝑄, 𝐷 > 𝑃(𝑅 = 0|𝑄, 𝐷)
Calcul d’un score 𝒔𝑸(𝑫)
𝑠𝑄(𝐷) =
𝑃 𝑅 = 1 𝑄, 𝐷
𝑃 𝑅 = 0 𝑄, 𝐷
=
𝑃 𝐷 𝑅 = 1, 𝑄 × 𝑃 𝑅 = 1 𝑄
𝑃 𝐷 𝑅 = 0, 𝑄 × 𝑃 𝑅 = 0 𝑄
∝
𝑃 𝐷 𝑅 = 1, 𝑄
𝑃 𝐷 𝑅 = 0, 𝑄
– Tri des documents par ordre décroissant de 𝑠𝑄(𝐷)
– Ne gère pas la redondance entre documents
𝑅 : relevance
𝑄 : query
𝐷 : document
D
Q R
24. Mineure « Data Science » Frédéric Pennerath
Le modèle probabiliste BM25
(Spärck Jones et al. 2000)
Problème : jeu d’apprentissage par requête contraignant / irréaliste
Hypothèses :
– Pas de documents pertinents : 𝑝𝑡 = 𝑃 𝑡 ∈ 𝐷 𝑅 = 1, 𝑡 ∈ 𝑄 =
1
2
– Mais prise en compte du nombre d’occurrences d’un terme dans le document
relativement à sa longueur
Résultat :
𝑅𝑆𝑉𝑄 𝐷 =
𝑡∈𝑄
𝑖𝑑𝑓𝑡 ×
𝑘1 + 1 𝑡𝑓𝑡,𝑑
𝑘1 1 − 𝑏 + 𝑏
𝐿𝑑
𝐿
+ 𝑡𝑓𝑡,𝑑
Typiquement 𝑏 = 0,75 et 1,2 < 𝑘1 < 2
Fréquence de 𝑡 dans
le document 𝑑
Longueur du document 𝑑
Longueur moyenne
des documents
25. Mineure « Data Science » Frédéric Pennerath
INTRODUCTION AUTALN
(TRAITEMENT AUTOMATIQUE DU
LANGAGE NATUREL)
PRÉTRAITEMENT DUTEXTE POUR
L’APPRENTISSAGE ET LA RECHERCHE
D’INFORMATION
26. Mineure « Data Science » Frédéric Pennerath
Définition du vocabulaire
Question : quels sont les termes à indexer ?
Plusieurs problèmes :
– Un terme est une notion spécifique à un langage.
Exemple : mot pain en français/anglais
=> Intérêt de dissocier les termes par langage pour des index plus courts
– Les « stop words » produisent des index inutiles et couteux :
Exemple : en français un, le, la, est. En anglais a, the, is etc.
– Synonymie : plusieurs mots désignent le même objet ou la même action :
Exemple : formes conjuguées des verbes, accord des noms et adjectifs réguliers ou
irréguliers, synonymes, etc.
→ nécessité de réaliser une recherche modulo les formes conjuguées
– Polysémie : un même mot peut avoir plusieurs sens
Exemple : les poules du couvent couvent.
27. Mineure « Data Science » Frédéric Pennerath
Prétraitement des textes à indexer
1. Segmentation du texte : séparation d’un document en unités d’indexation
(paragraphes, pages, etc)
2. Identification de la langue de chaque unité
3. Tokenization : séparation du texte d’une unité en une liste de mots (token)
Problème complexe spécifique à la langue :
• En français, gestion des traits d’union, des apostrophes :
Ex : l’article = (l + article), fait-il = (fait + il) mais chef-d’œuvre = (chef-d’œuvre)
• En chinois, les mots sont une suite d’idéogrammes qui ne sont pas séparés par des espaces !
4. Elimination des « stop words » de la langue
5. Normalisation simple des mots (minuscules, accents)
6. Décomposition de mots (allemand, etc)
7. Normalisation par racinisation ou lemmatisation
28. Mineure « Data Science » Frédéric Pennerath
Identification de la langue (Baldwin 2010)
Remarques :
• Le cosinus est utilisé comme mesure de similarité pour K-NN.
• Pour une détection rapide, K-NN sur des vecteurs prototypes moyennés (quelques uns
par langue)
• La classification peut se faire sans tokenisation (sur le codage binaire brut)
Unité
textuel
Extraction
des n-grams
(n=1, 2 ou 3)
Classifieur
(K-NN,
SVM,
Naive Bayes)
Vecteur
d’occurrences
des différents
items
Langue
Vecteurs d’occurrences
pour des textes de
référence
29. Mineure « Data Science » Frédéric Pennerath
Racinisation versus lemmatisation des mots
Racinisation (stemming) :
– Suite de règles ad hoc de simplification d’un mot spécifiques au langage pour
obtenir une racine (stem)
Ex: suis/es/est → être, ent/ant → *, *s → *, *ité → *, *ement → *, …
– Stemmers : snowball.tartarus.org
– Avantages : simple à implémenter, rapide
– Inconvénient : approximatif
Ex de confusion : majorité / major → major
Ex de dissociation : contraindre → contraind / contraint → contraint
Lemmatisation (lemmatization) :
– Analyse morpho-syntaxique : construction d’un arbre syntaxique
– Chaque mot est étiqueté par son lemme (représentant), son genre, son
nombre, sa fonction, etc.
– Avantage : rigoureux et précis (en théorie)
– Inconvénient : couteux et gain faible dans le cadre de la RI
30. Mineure « Data Science » Frédéric Pennerath
Calcul de similarité entre termes
et correction orthographique
Que faire lorsqu’un terme de la requête n’est pas dans le dictionnaire ?
→ Correction orthographique :
– Distance d’édition : nombre minimal de transformations
• Avec ajout, suppression, remplacement de caractères
• Avec en plus permutation de caractère
– Problème de programmation dynamique :
→
0
c→
1
ca→
2
cas→
3
→s
1
c→s
1
ca→s
2
cas→s
2
→sa
2
c→sa
2
ca→sa
1
cas→sa
2
→sac
3
c→sac
2
ca→sac
2
cas→sac
2
Remplacement
de an par bm
Suppression de an
Ajout
de bm
Temps ≈ 3 × 𝑛 × 𝑚
𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚−1 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚−1
𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚
𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚
𝑑𝑠𝑎𝑛𝑠 𝑝𝑒𝑟𝑚𝑢𝑡. 𝑐𝑎𝑠, 𝑠𝑎𝑐 = 2
𝑑𝑎𝑣𝑒𝑐 𝑝𝑒𝑟𝑚𝑢𝑡. 𝑐𝑎𝑠, 𝑠𝑎𝑐 = 1
𝑑 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚 = 𝑚𝑖𝑛
𝑑 𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚 + 𝑐𝑠𝑢𝑝𝑝𝑟 𝑎𝑛
𝑑 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚 + 𝑐𝑎𝑗𝑜𝑢𝑡 𝑏𝑚
𝑑 𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚−1 + 𝑐𝑟𝑒𝑚𝑝𝑙 𝑎𝑛, 𝑏𝑚
31. Mineure « Data Science » Frédéric Pennerath
Calcul rapide de termes similaires :
approche fondée sur les permutations circulaires
Problème : le calcul de la distance d’édition d’un terme R de la requête avec tous les termes
du vocabulaire est trop long.
→ Se focaliser sur les termes partageant un grand nombre de lettres consécutives avec R
– Création d’un dictionnaire contenant toutes les rotations circulaires des termes.
– Recherche des termes du dictionnaire préfixés par R supprimé des k derniers caractères
– Calcul de la distance d’édition sur ces sous-ensembles de termes
Exemple : k = 2 et requête = linx
linx
linx
inxl
nxli
xlin
linux
linux
inuxl
nuxli
uxlin
xlinu
lynx
lynx
ynxl
nxly
xlyn
linx
li
in
nx
xl
lin
lin
inl
nli
32. Mineure « Data Science » Frédéric Pennerath
Calcul rapide de termes similaires :
approche fondée sur les n-grams
Idée : deux termes sont proches s’ils partagent
de nombreux n-grams.
Principe :
1. Chaque terme est décomposé en n-grams.
Ex : trigrams(albatos) =
{alb,lba,bat,ato,tos}
2. Chaque terme Ti du vocabulaire est
indexé selon ses n-grams.
3. Les index des n-grams du terme R de la
requête sont parcourus.
4. L’indice de Jaccard J(R,Ti) est calculé
dynamiquement par comptage desTi dans
les index des n-grams de R.
5. Seuls les termes Ti dont l’indice J(R,Ti) est
supérieur à un seuil donné sont
conservés.
6. Leur distance d’édition d(R,Ti) est
finalement calculée.
alb 1 2
lba 1 2
bat 1 2
ato
atr 1 2
tro
tre 1
tos
ros 2
albâtre < albatros
Trigrams
de
albatos
375
,
0
3
6
5
3
albatros
albatos,
429
,
0
3
5
5
3
albatre
albatos,
J
J
B
A
B
A
B
A
B
A
B
A
J
,
R
n
g
i
i
R
i
R
i
i
R
i
i
i
T
L
g
T
N
T
N
n
T
n
R
T
N
T
n
R
n
T
n
R
n
T
R
J
grams
avec
1
1
grams
grams
grams
grams
,
2
33. Mineure « Data Science » Frédéric Pennerath
Elastic Search / Solr
Bases de données NoSQL orientée documents
• Index base de données
• Type ensemble de documents similaires
tables
• Documents tuples
• Champs colonnes
+ un vrai moteur de recherche d’information :
• Lucene : moteur de recherche Java
• Indexation en continue
• Fonctionnement en cluster
• Fonctionnalités avancées