Chapitre 5 RECHERCHE D’INFORMATION Mineure « Data Science » Frédéric Pennerath INTRODUCTION Mineure « Data Science » Frédéric Pennerath Le problème de la recherche d’information (information retrieval) Documents : Ensemble de documents Application cliente Requête Moteur de recherche d’information 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é Mineure « Data Science » Frédéric Pennerath – – – Textes (bases documentaires) Hypertextes, documents XML/HTML R.I multimédia : images, vidéo, sons, etc Réponse Ensemble de références Granularité des réponses : – – – – Page web (URL) Documents (pdf,.doc, etc) Section, chapitre, page Paragraphes 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 – Techniques Web : crawling /scraping 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 Mineure « Data Science » Frédéric Pennerath RECHERCHE D’INFORMATION MODÈLE LOGIQUE ET IMPLÉMENTATION 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 ? 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) ET (x) OU (x) ET NON (x) • 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 Mineure « Data Science » Frédéric Pennerath Implémentation d’un index inversé vienne 1 4 5 9 12 15 vienne ET isère isère 2 4 5 6 4 5 9 9 • 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. Mineure « Data Science » Frédéric Pennerath Traitement séquentiel de l’opérateur ET L1 1 4 5 9 12 15 L L2 2 4 5 6 4 5 9 9 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 Mineure « Data Science » Frédéric Pennerath NB: possibilité d’accélérer l’algorithme avec des « skip lists » 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 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. 2. 3. • Mettre la requête sous forme DNF (disjunctive normal form) Négation à la fin des conjonctions 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 … Terme – Calcul : L ← intersection(LE,LC) L ← intersection(L,LA) L ← intersectionEtNegation(L,LB) Mineure « Data Science » Frédéric Pennerath Fréquence A 100M B 20M C 30M D 50M E 1M RECHERCHE D’INFORMATION MODÈLE VECTORIEL ET IMPLÉMENTATION Mineure « Data Science » Frédéric Pennerath Le modèle vectoriel : t7 Modèle booléen peu adapté : t5 – Réponses binaires trop rigides (trop ou pas assez de résultats) – Pas de classement des résultats t6 t4 Introduction du modèle vectoriel : – – – – t3 t1 dim = nbr. de termes 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) Mineure « Data Science » Frédéric Pennerath t2 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 𝑤𝑑,𝑡 = 𝑡𝑓𝑑,𝑡 × 𝑖𝑑𝑓𝑡 = 𝑡𝑓𝑑,𝑡 × log 2 𝑁 𝑁𝑡 – 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) ? Mineure « Data Science » Frédéric Pennerath Exemple de calcul de similarité Termes tfvienne tfisère 1 10 2 2 3 0 3 0 0 4 2 4 𝑑 = … tf−idf𝑡,𝑑 𝑡∈𝑉𝑜𝑐𝑎𝑏. Doc-ID Terme (bits) DocID vienne 20 1 4 ⋅ 104 isère 18 2 2 ⋅ 104 3 102 4 103 idf … Calcul de la similarité entre la requête « vienne isère » et le document 1 : tf−idf1,𝑣𝑖𝑒𝑛𝑛𝑒 ⋅ 𝑢𝑣𝑖𝑒𝑛𝑛𝑒 + tf−idf1,𝑖𝑠è𝑟𝑒 ⋅ 𝑢𝑖𝑠è𝑟𝑒 𝑞 𝑑1 𝑢𝑣𝑖𝑒𝑛𝑛𝑒 + 𝑢𝑖𝑠è𝑟𝑒 ⋅ = ⋅ 𝑞 2 𝑑1 𝑑1 ⇒ cos 𝑞, 𝑑1 = 1 10 ⋅ 20 + 2 ⋅ 18 = 41 ⋅ 10−4 4 4 ⋅ 10 2 ⋅ Mineure « Data Science » Frédéric Pennerath cos(𝑞, 𝑑2 ) = 1 3 ⋅ 20 = 21 ⋅ 10−4 4 2 2 ⋅ 10 ⋅ 𝒅 2 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. docID 𝒅 idft docID tft,d vienne / 20 bits isère / 18 bits 1/10 1/2 4/2 3/1 5/7 4/4 9/4 9/5 1 4.104 … … 4 103 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. Mineure « Data Science » Frédéric Pennerath Implémentation du modèle tf-idf : traitement en ligne d’une requête vienne / 20 bits 1/10 isère / 18 bits 1/2 4/2 3/1 5/7 4/4 9/4 9/5 DocId Somme tf-idf DocId Score 1 3 4 5 9 200 236 112 140 170 18 41 11,2.10 5,9.10-3-3 3 4 5 9 112 140 170 18 40 513 0,9.10-3 5,9.10 8,5.10 4 9 170 40 80 File des DocId en cours de traitement Mineure « Data Science » Frédéric Pennerath File de priorité des 2 meilleurs DocID triés par score décroissant DocId 𝒅 1 4.104 3 2.104 4 104 5 14.104 9 2.104 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 Mineure « Data Science » Frédéric Pennerath RECHERCHE D’INFORMATION MODÈLE PROBABILISTE ET IMPLÉMENTATION 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|𝑄, 𝐷) 𝑅 : relevance 𝑄 : query 𝐷 : document 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 Mineure « Data Science » Frédéric Pennerath Q R D Le modèle probabiliste : 2ème principe : Binary Independance Model (BIM) Hyp 1 : les termes d’un document sont indépendants cond à 𝑄 et 𝑅 : 𝑃 𝐷 𝑅 = 𝑟, 𝑄 = 𝑄, 𝑅 𝑃(𝑡 ∈ 𝐷|𝑅 = 𝑟, 𝑄) 𝑡∈𝐷 × 1 − 𝑃 𝑡 ∈ 𝐷 𝑅 = 𝑟, 𝑄 𝑡∉𝐷 Hyp 2 : les termes hors requête sont indépendants de 𝑅 : 𝑃 𝑡 ∈ 𝐷 𝑅 = 0, 𝑡 ∉ 𝑄 = 𝑃 𝑡 ∈ 𝐷 𝑅 = 0, 𝑡 ∉ 𝑄 ⇒ 𝑠𝑄 (𝐷) ∝ 𝑡∈𝑄∩𝐷 𝑝𝑡 1 − 𝑢𝑡 𝑝 = 𝑃 𝑡 ∈ 𝐷 𝑅 = 1, 𝑡 ∈ 𝑄 × 𝑎𝑣𝑒𝑐 𝑡 𝑢𝑡 = 𝑃 𝑡 ∈ 𝐷 𝑅 = 0, 𝑡 ∈ 𝑄 1 − 𝑝𝑡 𝑢𝑡 Retrieval Status Value : 𝑅𝑆𝑉𝑄 𝐷 = log 𝑡∈𝑄∩𝐷 Mineure « Data Science » Frédéric Pennerath 𝑝𝑡 1 − 𝑢𝑡 + log 1 − 𝑝𝑡 𝑢𝑡 𝑇1 … 𝑇𝑉 D Le modèle probabiliste : Apprentissage des paramètres 𝑝𝑡 et 𝑢𝑡 Coefficient de Laplace Hyp : il existe un jeu d’apprentissage 𝐷 + 𝑄 ∪ 𝐷− 𝑄 pour la requête 𝑄 : 𝑝𝑡 = 𝑃 𝑡 ∈ 𝐷 𝑅 = 1, 𝑡 ∈ 𝑄 = 𝑢𝑡 = 𝑃 𝑡 ∈ 𝐷 𝑅 = 0, 𝑡 ∈ 𝑄 = 𝑁 𝐷 ∈ 𝐷+ 𝑄 , 𝑡 ∈ 𝐷 + 𝛼 𝑁 𝐷+ 𝑄 + 2𝛼 𝑁 𝐷 ∈ 𝐷− 𝑄 , 𝑡 ∈ 𝐷 + 𝛼 𝑁 𝐷− 𝑄 + 2𝛼 1 − 𝑢𝑡 𝑁 − 𝑑𝑓𝑡 = log 𝑢𝑡 𝑑𝑓𝑡 − 𝑁𝑄+ 𝑡 ⇒ 𝑅𝑆𝑉𝑄 𝐷 = ≃ log log 𝑡∈𝑄∩𝐷 Mineure « Data Science » Frédéric Pennerath 𝑑𝑓𝑡 − 𝑁𝑄+ 𝑡 + 𝛼 = 𝑁 − 𝑁𝑄+ + 2𝛼 Fréquence de 𝑡 dans les documents Remarque : on retrouve les coefficients idf : log = 𝑁𝑄+ 𝑡 + 𝛼 𝑁𝑄+ + 2𝛼 𝑁 − 𝑑𝑓𝑡 𝑁 ≃ log = 𝑖𝑑𝑓𝑡 𝑑𝑓𝑡 𝑑𝑓𝑡 𝑝𝑡 + 𝑖𝑑𝑓𝑡 1 − 𝑝𝑡 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 − 𝑏 + 𝑏 𝑑 + 𝑡𝑓𝑡,𝑑 𝐿 Fréquence de 𝑡 dans le document 𝑑 Longueur du document 𝑑 Typiquement 𝑏 = 0,75 et 1,2 < 𝑘1 < 2 Mineure « Data Science » Frédéric Pennerath Longueur moyenne des documents INTRODUCTION AU TALN (TRAITEMENT AUTOMATIQUE DU LANGAGE NATUREL) PRÉTRAITEMENT DU TEXTE POUR L’APPRENTISSAGE ET LA RECHERCHE D’INFORMATION 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. 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 Mineure « Data Science » Frédéric Pennerath Identification de la langue (Baldwin 2010) Vecteurs d’occurrences pour des textes de référence Unité textuel Extraction des n-grams (n=1, 2 ou 3) Vecteur d’occurrences des différents items Classifieur (K-NN, SVM, Naive Bayes) Langue 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) 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 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 : 𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚−1 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚−1 Ajout de bm Remplacement de an par bm 𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚 Suppression de an 𝑑 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚 𝑑𝑠𝑎𝑛𝑠 𝑝𝑒𝑟𝑚𝑢𝑡. 𝑐𝑎𝑠, 𝑠𝑎𝑐 = 2 𝑑𝑎𝑣𝑒𝑐 𝑝𝑒𝑟𝑚𝑢𝑡. 𝑐𝑎𝑠, 𝑠𝑎𝑐 = 1 → 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 Temps ≈ 3 × 𝑛 × 𝑚 𝑑 𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚 + 𝑐𝑠𝑢𝑝𝑝𝑟 𝑎𝑛 𝑑 𝑎1 … 𝑎𝑛 → 𝑏1 … 𝑏𝑚 + 𝑐𝑎𝑗𝑜𝑢𝑡 𝑏𝑚 = 𝑚𝑖𝑛 𝑑 𝑎1 … 𝑎𝑛−1 → 𝑏1 … 𝑏𝑚−1 + 𝑐𝑟𝑒𝑚𝑝𝑙 𝑎𝑛 , 𝑏𝑚 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 linx li inxl in nxli nx xlin xl Mineure « Data Science » Frédéric Pennerath linux lynx lin linux lynx lin inuxl ynxl inl nuxli nxly nli uxlin xlyn xlinu Calcul rapide de termes similaires : approche fondée sur les n-grams Mineure « Data Science » Frédéric Pennerath A B J R, Ti avec N R Ti A B J A, B n gramsR n gramsTi n gramsR n gramsTi N R Ti R n 1 Ti n 1 N R Ti g LT gn grams R i A B A B albâtre < albatros Trigrams de albatos 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 des Ti 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 tos atr 1 tro 2 tre 1 ros 2 2 J albatos, albatre 3 0,429 553 J albatos, albatros 3 0,375 563 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 Mineure « Data Science » Frédéric Pennerath