4  Analyse Sémantique Latente

Author

Wilson Toussile

Introduction

Dans un des chapitres précédents, nous avons appris a transformé un corpus de documemnts en Term-Document Matrix, dans laquelle la dimension de représentation des tokens (termes) est le nombre \(d\) de documents, et celui de représentation des documents est le nombre \(n\) de tokens (mots par exemple).

L’Analyse Sémantique Latente (LSA = Latent Semantic Analysis) vise à réduire la dimension de représentation des termes en un nombre optimal de dimensions latentes, permettant ainsi une visualisation des similarités entre termes et documents. Cette analyse sert aussi d’étape préliminaire pour d’autre analyses telles que la classification non-supervisée des documents (Topic Analysis). On peut se servir pour cela de la similarité cosinus dans l’espace des termes.

4.1 LSA

La LSA est une application de la décomposition SVD de la Term-Document Matrix que nous notons \(A\) qui permet d’approximer cette dernière par une matrice \(B\) tel que \(rg([A]_q)< rg(A)\) au sens des moindres carrés, où \(rg([A]_q)=q<rg(A)=r\).

4.1.1 Décomposition SVD

Soit \(A\in\mathbb{R}^{t*d}\) de rang \(rg(A)=r_A\).

La décompoition SVD de \(A\) est donnée par \[ A = U\Lambda {}^tV, \]

  • \(U\in\mathbb{R}^{t*d}\) est une matrice unitaire

  • \(\Lambda\in\mathbb{R}^{d*d}\) est une matrice diagonale ayant les coefficients diagonaux \(\lambda_k\geq 0\), dont exactement \(r\) sont \(>0\) et distincts

  • \({}^tV\in\mathbb{R}^{d*d}\) est une matrice unitaire

Propriétés

  • Les \(\lambda_k\) sont les valeurs singulières de \(A\), ie les racines des valeurs propres de \({}^tAA\).
  • Les colonnes de \({}^tV\) sont les vecteurs propres (orthonormés) associés aux valeurs propres \(\lambda_k^2\) de \({}^tAA\)
  • Les Les colonnes de \(^{}U\) sont les vecteurs propres (orthonormés) associés aux valeurs propres \(\lambda_k^2\) de \(A{}^tA\)

Notes

  1. \({}^tAA\) et \(A{}^tA\) ont les mêmes valeurs propres \(>0\).
  2. Les \(\lambda_k>0\) sont rangés dans l’ordre décroissant sur la diagonale de \(\Lambda\), et les permutation associées sont aussi appliquées aux colonnes de \({}^tV\) et aux lignes de \(U\).

Prop

Soit \(0<q<r\). Notons

  • \([U]_q\in\mathbb{R}^{t*q}\) la sous-matrice de \(U\) constituée des \(q\) premières colonnes
  • \([\Lambda]_q\in\mathbb{R}^{q*q}\) la sous-matrice de \(\Lambda\) constituée des \(q\) premières lignes et des \(q\) premières colonnes
  • \([{}^tV]_q\in\mathbb{R}^{q*d}\) la sous-matrice de \({}^tV\) constituée des \(q\) premières lignes.

Alors \([A]_q=[U]_q[\Lambda]_q[{}^tV]_q\) est une solution au pb d’optimisation

\[ \min_{rg(X)=q}\|A-X\|^2 \]

4.1.2 Représentation des termes et documents dans les dimensions latentes

Supposons que l’on retienne \(q\) dimensions latentes qu’on peut encore appelées concepts:

  • La ligne \(i\) de la matrice \([U]_q\), que nous notons \(\widehat{t}_i\) donne les importances du terme \(i\) pour les différents concepts
  • La colonne \(j\) de la matrice \([{}^tV]_q\), que nous notons \(\widehat{d}_j\) donne les importances du document \(j\) pour les différents concepts.

Notes: Dans l’espace \(\mathbb{R}^q\) des concepts:

  1. Les termes sont représentés par les \(\widehat{t}_i\)

  2. Les documents par les \(\widehat{d}_j\).

4.2 Similarité cos

4.2.1 Terme-Terme

\[ cosine(\widehat{t}_i, \widehat{t}_{i'}):=\dfrac{\langle\widehat{t}_i, \widehat{t}_{i'}\rangle}{\|\widehat{t}_i\|\|\widehat{t}_{i'}\|} \]

4.2.2 Document-Document

\[ cosine(\widehat{d}_j, \widehat{d}_{j'}):=\dfrac{\langle\widehat{d}_j, \widehat{d}_{j'}\rangle}{\|\widehat{d}_j\|\|\widehat{d}_{j'}\|} \]

4.2.3 À quoi sert cette similarité?

  • La matrice des similarités entre termes est \[ \left(\cos\left(\widehat{t}_i,\widehat{t}_{i'}\right)\right)_{i,i'} \]
  • Celle des documents \[ \left(\cos\left(\widehat{d}_j,\widehat{d}_{j'}\right)\right)_{j,j'} \]

4.2.3.1 Query

L’analyse sémantique latente peut servir de base pour faire des recherches de documents dans un corpus à partir d’un ensemble de mots clés. Autrement dit, cette analyse permet de construire un moteur de recherche de documents par mots clés. Un mot clé est tout mot apparaissant dans les termes.

Principe

  • Soit \(w\) un ensemble de mots clés, c’est-à-dire un tuple de mots du dictionnare associé au corpus en question. Par exemple, si le dictionnaire de termes est dict=(cameroun, mange, montagne, marché, soleil), \(w\) peut être (mange, soleil).

  • \(w\) est un pseudo-document que l’on représente dans l’espace des documents par le tuple \(w = (0, 1, 0, 0, 1)\) d’indicatrices des mots.

  • Les coordonnées de \(w\) dans les dimensions latentes sont données par \[ query(w) = {}^tw[U]_q[\Lambda]_q^{-1}\in\mathbb{R}^q. \]

  • On calcule alors les similarités entre le pseudo document \(w\) et les documents du corpus

  • Puis le classement des documents du corpus est obtenu selon les valeurs décroissantes des similarités précédentes.

4.2.3.2 Classification non-supervisée

Ces matrices peuvent servir à la classification (non-supervisée) des termes ou documents, par exemple une classification hiérarchique ascendante ou par la méthode des \(K\)-means.

4.3 Choix de la dimension \(q\)

Le choix de la dimension est très souvent fonction de la suite de l’analyse.

Par exemple:

  • Si le but est de visualiser les nuages de termes et|ou des documents, on choisira en général \(q=2\), ou maximum \(3\);

4.3.1 Par seuillage de la variabilité expliquée

  • Si LSA n’est qu’une étape intermédiaire de l’analyse du corpus en question, il vaut mieux tenir compte de la part de variabilité expliquée par les dimensions latentes retenues. Une mesure de la part de la vériabilité expliquée par les \(q\) dimensions latentes est \[ \dfrac{\sum_{k=1}^q\lambda_k}{\sum_{k=1}^d\lambda_k}. \] Une idée intuitive est de sélectionner la plus petite dimension \(q\) pour laquelle la part de la variabilité expliquées est \(\geq\) à un seuil fixé à l’avance (par exemple \(75\%\)).

4.3.2 Éboulie des valeurs singulières

Il s’agit de rechercher un coude dans le graphique des valeurs singulières.

4.4 TP

On considère les documents suivants:

Code
docs = data.frame(
  docs = paste("doc", 0:9, sep=""),
  text = c(
    "Favorite dog fluffy tan",
    "Dog brown cat brown",
    "Favorite hat brown coat pink",
    "Dog hat leash leash",
    "Fluffy coat brown coat",
    "Dog brown fluffy brown coat",
    "Dog white brown spot",
    "White dog pink coat brown dog fluffy",
    "Fluffy dog brown hat favorite",
    "Fluffy dog white coat hat"
  )
)

Tokenisation et construction de la Term-Document Matrix

Code
docs %>% 
  unnest_tokens(word, text) %>%  
  count(docs, word, sort = TRUE) %>%
  bind_tf_idf(word, docs, n) %>%
  select(docs, word, tf_idf) %>%
  pivot_wider(names_from = docs, values_from = tf_idf, values_fill = 0) -> TDtf

Décomposition SVD

Code
TDtf %>%
  select(-word) %>%
  svd() -> dUV

Représentation des nuages des termes et des documents

Code
ggplot() +
  geom_text(aes(x = dUV$u[, 1], y = dUV$u[, 2], label = TDtf$word), color = "steelblue") +
  geom_text(aes(x = dUV$v[, 1], y = dUV$v[,2], label = names(TDtf)[-1]), color = "coral") +
  theme_minimal()

Query

Code
# Norme euclidienne
norm2 = function(x) sqrt(x%*%x)

# Similarité cos
similariteCos = function(d1, d2){
  return(d1%*%d2/(norm2(d1)*norm2(d2)))
}

# Query
query= function(w){
  dict = TDtf$word
  iw = sapply(dict, function(u) ifelse(u %in% w, 1, 0))
  q = iw%*%dUV$u[,1:2]%*%solve(diag(dUV$d[1:2]))
  Vq = dUV$v[,1:2]
  similarites = apply(Vq, 1, function(d) similariteCos(d, q[1,]))
  df = data.frame(docs = names(TDtf)[-1], similarites = similarites) %>%
    arrange(desc(similarites))
  return(df)
}
Code
w = c("hat", "dog")
query(w)
   docs similarites
1  doc9   0.9618832
2  doc8   0.9583119
3  doc2   0.9473260
4  doc7   0.9215021
5  doc5   0.9212584
6  doc1   0.9176807
7  doc4   0.9169543
8  doc6   0.9136101
9  doc0   0.9130959
10 doc3   0.3756435

Part de la variabilité expliquée par le 1er plan latent

Code
sum(dUV$d[1:4])/sum(dUV$d)
[1] 0.6571703

Éboulie des valeurs singulières

Code
data.frame(k = 1:length(dUV$d), lambda = dUV$d) %>%
  ggplot(mapping = aes(x = k, y = lambda)) +
    geom_point(color="steelblue")

Le graphique ci-dessus suggère de sélectionner \(q=2\), ce qui correspond à une part de variabilité de 0.3937811

4.5 Références