.. _part2_chap6:
***********************************************************************
Chapitre 6 : Éléments similaires (shingling, min-hashing, LSH)
***********************************************************************
Trouver les **paires d'éléments similaires** (documents quasi-dupliqués, articles,
…) dans une **énorme** collection. Comparer toutes les paires est en
:math:`O(n^2)` — impossible à grande échelle. La chaîne **shingling →
min-hashing → LSH** résout ce problème.
Objectifs
=========
À la fin de ce chapitre, vous devez pouvoir :
- Représenter un document par ses **k-shingles** et la **similarité de Jaccard**
- Compresser les ensembles par des **signatures min-hash**
- Trouver les paires candidates par **LSH** sans comparer toutes les paires
1. Shingling
============
Un **k-shingle** est une sous-chaîne (ou suite de *k* mots) consécutive du document.
Un document devient l'**ensemble de ses k-shingles**. Deux documents proches
partagent beaucoup de shingles.
On mesure la similarité de deux ensembles par la **similarité de Jaccard** :
.. math::
\text{sim}(A, B) = \frac{|A \cap B|}{|A \cup B|}
*(Choix de k : assez grand pour que la probabilité qu'un shingle apparaisse par
hasard soit faible — typiquement k = 5 à 10 pour des caractères.)* On **hache**
souvent les shingles en entiers pour gagner de la place.
2. Min-hashing
==============
Les ensembles de shingles sont énormes. On les **résume** par de courtes
**signatures** qui **préservent la similarité de Jaccard**.
**Principe.** On représente la collection par une **matrice caractéristique**
(lignes = shingles, colonnes = documents, 1 si présent). Une fonction de
**min-hash** :math:`h` correspond à une **permutation** des lignes ; la valeur
min-hash d'une colonne = **le numéro de la première ligne** (dans cette
permutation) où la colonne vaut 1.
**Propriété fondamentale** : pour deux colonnes,
.. math::
\Pr[\,h(A) = h(B)\,] = \text{sim}_{\text{Jaccard}}(A, B)
En utilisant **n** fonctions de min-hash, la **signature** d'un document est le
vecteur de ses *n* valeurs min-hash ; la **fraction** de positions égales entre
deux signatures **estime** leur Jaccard. En pratique, on simule les permutations
par *n* fonctions de hachage.
3. Locality-Sensitive Hashing (LSH)
===================================
But : ne produire qu'un petit nombre de **paires candidates** (celles
probablement similaires), sans examiner les :math:`O(n^2)` paires.
**Technique des bandes** (*banding*). On découpe la signature (longueur *n*) en
**b bandes de r lignes** (:math:`n = b\cdot r`). Pour chaque bande, on **hache** la
tranche de signature de chaque document dans des *buckets*. Deux documents
deviennent **candidats** s'ils tombent dans le **même bucket pour au moins une
bande**.
**Analyse.** Si deux documents ont une similarité *s*, la probabilité qu'ils
soient candidats est :
.. math::
1 - \left(1 - s^{\,r}\right)^{b}
Cette courbe a une forme en **S** : un **seuil** approximatif
:math:`t \approx (1/b)^{1/r}`. On choisit *b* et *r* pour que le seuil sépare bien
les paires similaires (rendues candidates) des dissemblables (écartées).
**Étape finale** : ne vérifier (calcul exact de la similarité) que les **paires
candidates** — bien moins nombreuses.
4. Mesures de distance & autres (brève description)
===================================================
.. list-table::
:header-rows: 1
:widths: 30 70
* - Notion
- Idée
* - **Distances**
- Jaccard, Euclidienne, **Cosinus**, Hamming, édition — chacune adaptée à un type de données.
* - **LSH pour le cosinus**
- **Hyperplans aléatoires** (*random projections* / sketches) : :math:`\Pr[\text{même signe}] = 1 - \theta/\pi`.
* - **LSH pour l'euclidien**
- Projection sur des droites aléatoires découpées en segments.
* - **Applications**
- Détection de **plagiat**, articles d'actualité similaires, résolution d'entités (*entity resolution*), empreintes.
Exercices
=========
.. admonition:: Exercice 1 — Jaccard
:class: tip
``A = {1,2,3,4}``, ``B = {2,3,5}``. Calculez la similarité de Jaccard.
.. raw:: html
▶ Voir la correction
:math:`A\cap B = \{2,3\}` (taille 2) ; :math:`A\cup B = \{1,2,3,4,5\}` (taille 5).
Donc :math:`\text{sim} = 2/5 = 0{,}4`.
.. raw:: html
.. admonition:: Exercice 2 — Banding LSH
:class: tip
Signatures de longueur ``n = 20``, découpées en ``b = 5`` bandes de ``r = 4``.
Pour une paire de similarité ``s = 0,8``, probabilité d'être candidate ?
.. raw:: html
▶ Voir la correction
:math:`1-(1-s^{r})^{b} = 1-(1-0{,}8^{4})^{5} = 1-(1-0{,}4096)^{5}
= 1-0{,}5904^{5} \approx 1-0{,}0717 \approx \mathbf{0{,}93}`.
Une paire très similaire (0,8) a donc ~93 % de chances d'être candidate ; une paire
dissemblable (petit *s*) a une probabilité très faible — c'est l'effet de seuil en S.
.. raw:: html