Comprendre l’analyse sémantique latente (LSA)

Comprendre l’analyse sémantique latente (LSA)
TL;DR
L’analyse sémantique latente (LSA) est une technique de traitement du langage naturel (NLP) utilisée pour découvrir les relations entre les termes et les documents dans un corpus textuel. Elle réduit les données textuelles de grande dimension en une représentation de plus faible dimension en appliquant la décomposition en valeurs singulières (SVD) à la matrice termes-documents. Ce processus capture la structure sémantique latente des données, en regroupant les mots et les documents similaires en fonction de leurs significations contextuelles. La LSA est couramment utilisée dans des tâches comme le regroupement de documents, la recherche d’informations, et la modélisation de sujets. En révélant des motifs cachés dans les données, la LSA améliore la compréhension et l’organisation de grands ensembles de données textuelles.
Introduction
Vous êtes-vous déjà demandé comment les moteurs de recherche comprennent ce que vous cherchez, même lorsque vous n’utilisez pas les mots exacts ? C’est là qu’intervient l’analyse sémantique latente (LSA).
La LSA identifie les liens sous-jacents entre les mots en reconnaissant les motifs et les relations dans le texte. Par exemple, lorsque vous recherchez “meilleures chaussures de running,” vous pouvez obtenir des résultats sur des comparaisons de marques de chaussures, des avis sur des chaussures, et même des conseils de course. Tous ces résultats sont pertinents pour votre recherche, même si les mots exacts que vous avez utilisés n’y figurent pas. La LSA rend cela possible en reconnaissant les motifs dans le texte et en découvrant les relations entre les mots. Cela aide des systèmes comme les moteurs de recherche, les algorithmes de recommandation et les chatbots propulsés par l’IA à comprendre le contexte et le sens, pas seulement les mots-clés.
Voyons maintenant en détail ce qu’est la LSA, son fonctionnement, son importance, ses avantages, ses défis et ses applications.
Qu’est-ce que la LSA ?
L’analyse sémantique latente est une méthode de traitement du langage naturel (NLP) qui utilise des techniques mathématiques comme la décomposition en valeurs singulières (SVD) pour identifier les associations et les significations contextuelles des mots au sein de grands ensembles de textes.
Les origines de la LSA remontent à la fin des années 1980. Elle a d’abord été appliquée pour découvrir des structures sémantiques cachées dans le texte. En 1988, Scott Deerwester et ses collègues ont breveté une technique de recherche d’informations. Cette technique reposait sur une structure sémantique latente appelée indexation sémantique latente (LSI). Elle était révolutionnaire, car elle permettait aux systèmes de récupérer des documents pertinents sans correspondances exactes de mots-clés, à une époque où la correspondance par mots-clés était la principale méthode de recherche d’informations. Au lieu de cela, elle s’appuyait sur les connexions sémantiques sous-jacentes entre les termes.
Vous pouvez considérer la LSA comme un bibliothécaire intelligent qui remarque les motifs cachés dans le texte et relie les mots et les idées de manière significative.
Figure- Réseau sémantique des chaussures de running
Figure : Réseau sémantique des chaussures de running
Avec la LSA, les systèmes peuvent :
Trouver des relations cachées entre les mots et les idées
Mieux comprendre le texte et améliorer la recherche d’informations
Améliorer les résultats de recherche en reliant des termes associés
Trouver des significations plus profondes dans de grandes collections de textes
La LSA est une approche d’apprentissage non supervisé qui ne nécessite pas de données étiquetées pour découvrir les relations et les structures au sein du texte. Elle utilise la décomposition en valeurs singulières (SVD) pour réduire la dimensionnalité de la matrice termes-documents, en la transformant en un ensemble plus réduit de caractéristiques latentes. Ces caractéristiques capturent les motifs les plus significatifs dans les données, mettant en évidence les relations sémantiques sous-jacentes.
Comment fonctionne la LSA ?
La LSA implique quatre étapes. Nous allons passer en revue l’implémentation de chaque étape à l’aide de la bibliothèque Python scikit-learn.
Prétraitement du texte
Création de la matrice document-terme
Décomposition en valeurs singulières (SVD)
Données encodées par sujets
Figure- Step-by-Step Breakdown of LSA.png
Figure : Décomposition étape par étape de la LSA
Prétraitement du texte
Nous préparons nos données textuelles brutes sous forme de documents stockés comme chaînes dans une liste.
documents = [
"tall green tree sway",
"short green bush stand",
"tall yellow tree glow",
"short yellow flower bloom”
]
Figure- The Document-Term Matrix.png
Matrice document-terme
Une matrice document-terme représente les fréquences des termes apparaissant dans la collection de documents textuels.
Figure : La matrice document-terme
Cette matrice document-terme peut être générée à l’aide du modèle CountVectorizer dans scikit-learn.
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
document_term_matrix = vectorizer.fit_transform(documents)
Ce processus a transformé chaque document en vecteur.
Figure- Documents to Vectors.png
Figure : Documents en vecteurs
Nous pouvons utiliser document_term_matrix.todense() pour afficher notre matrice document-terme.
document_term_matrix.todense()
Sortie :
Figure- The Output
Figure : La sortie
La matrice obtenue montre chaque ligne comme un vecteur. Chaque ligne correspond à un document, et les colonnes représentent les termes. Les valeurs indiquent combien de fois chaque terme apparaît dans chaque document.
Décomposition en valeurs singulières
La SVD est une technique mathématique utilisée pour simplifier des jeux de données complexes. La SVD décompose une matrice A en trois matrices distinctes :
_A=UΣVT_
A : __Une matrice document-terme représentant les documents et leurs fréquences de termes.
U : Une matrice document-sujet orthogonale montrant à quel point chaque document est lié à chaque sujet.
Σ : Une matrice diagonale de valeurs singulières capturant l’importance des sujets.
_VT_ : Une matrice terme-sujet orthogonale montrant les relations entre les termes et les sujets.
Figure- SVD in Our Use Case
Figure : SVD dans notre cas d’utilisation
Réduction de dimensionnalité avec SVD tronquée
La réduction de dimensionnalité est une capacité inhérente de la SVD. La technique simplifie les jeux de données en réduisant le nombre de caractéristiques tout en conservant les informations les plus importantes.
La SVD peut être réalisée à l’aide du modèle TruncatedSVD dans scikit-learn. Elle est appelée SVD « tronquée » parce qu’elle réduit le nombre de caractéristiques dans le jeu de données sans perte significative d’information. Cela en fait un outil efficace pour la réduction de dimensionnalité.
Figure- Dimensionality Reduction
Figure : Réduction de dimensionnalité
Nous allons créer un modèle SVD pour ajuster et transformer notre matrice document-terme.
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=2)
lsa = svd.fit(document_term_matrix)
Ce processus prépare notre modèle à transformer les données d’origine en données encodées par sujets. Nous définissons n_components=2 dans TruncatedSVD pour représenter deux sujets. Un sujet représente des mots qui apparaissent fréquemment ensemble dans les documents.
Dans notre cas, un sujet capture un thème récurrent lié aux arbres et aux plantes. Des mots comme "tall," "green," et "tree" apparaissent ensemble, ce qui montre des motifs sous-jacents dans les données. Ainsi, la SVD compresse les données et révèle leur structure sémantique.
Données encodées par sujet
Les données contiennent maintenant deux colonnes. Chaque colonne représente l’un des deux sujets que nous avons spécifiés dans le TruncatedSVD. Nous utilisons la bibliothèque pandas pour voir la sortie de notre LSA.
import pandas as pd
lsa_transformed = svd.transform(document_term_matrix)
topic_df = pd.DataFrame(lsa_transformed, columns=["Topic 1", "Topic 2"])
topic_df["Original Document"] = documents
print(topic_df[["Original Document", "Topic 1", "Topic 2"]].to_string(index=False))
Sortie :
Figure : La sortie
La sortie affiche les quatre documents originaux aux côtés de valeurs numériques. Les valeurs représentent la force avec laquelle chaque document est associé aux deux sujets. Nous observons que les quatre documents sont fortement associés au Sujet 1. Cependant, il existe une différence nette dans le Sujet 2, où :
Les premier et troisième documents sont négatifs.
Les deuxième et quatrième documents sont positifs.
Cela suggère que les premier et troisième documents se concentrent sur les grands arbres, tandis que les deuxième et quatrième portent sur les petits buissons et les fleurs. Cette représentation numérique aide à distinguer clairement les thèmes dans le texte en fonction des sujets.
Nous pouvons aller plus loin en comprenant ce que représente chaque sujet à travers le dictionnaire et la matrice d’encodage.
Un dictionnaire est une collection de tous les mots uniques dans les documents.
Une matrice d’encodage montre à quel point chaque mot est lié à chaque sujet.
Affichage du dictionnaire
Le dictionnaire fait partie du modèle CountVectorizer, accessible via la méthode .get_feature_names_out().
vocabulary = vectorizer.get_feature_names_out()
print("Dictionary:", vocabulary)
**Sortie :
Figure : La sortie
Ces mots constituent la base pour analyser la manière dont les sujets sont construits.
Affichage de la matrice d’encodage
La matrice d’encodage est stockée sous forme de components_ dans le modèle TruncatedSVD. Elle fournit une correspondance entre les mots et les sujets.
encoding_matrix = pd.DataFrame( svd.components_.T, index=vocabulary, columns=["Topic 1", "Topic 2"] ) print(encoding_matrix)
Sortie :
Figure : La sortie
Chaque ligne correspond à un mot, et chaque colonne correspond à un sujet. Les valeurs indiquent à quel point un mot est associé à chaque sujet.
Interprétation de la matrice d’encodage
Nous nous concentrons sur les valeurs absolues de l’encodage pour identifier les mots les plus importants pour chaque sujet.
encoding_matrix["Abs Topic 1"] = encoding_matrix["Topic 1"].abs()
encoding_matrix["Abs Topic 2"] = encoding_matrix["Topic 2"].abs()
topic_1_top_words = encoding_matrix.sort_values("Abs Topic 1", ascending=False)
topic_2_top_words = encoding_matrix.sort_values("Abs Topic 2", ascending=False)
print("Top Words for Topic 1:")
print(topic_1_top_words[["Topic 1"]].head())
print("Top Words for Topic 2:")
print(topic_2_top_words[["Topic 2"]].head())
Sortie :
Figure- la sortie 4.png
Figure : la sortie
Nous observons que :
Pour le Sujet 1, des mots comme "tall" et "tree" sont importants.
Pour le Sujet 2, des mots comme "short" et "tall" sont importants.
Le Sujet 2 contraste avec les mots "short," qui a une valeur positive, et "tall," qui a une valeur négative. Cela montre que le Sujet 2 convient pour distinguer si un document donné est “short” ou “tall.” Les fortes valeurs positives et négatives de ces mots indiquent leur importance au sein de ce sujet. Comme le Sujet 2 a une valeur positive pour le mot “short,” nous pouvons utiliser ce sujet pour déterminer dans quelle mesure un document donné est lié à “short.”
Comparaison avec des techniques similaires
LSA est souvent comparée à d'autres techniques similaires en analyse de texte. Voici une comparaison pour clarifier les idées reçues courantes :
LSA vs. LDA
LDA (Latent Dirichlet Allocation) est un modèle probabiliste qui génère des sujets en supposant une distribution bayésienne hiérarchique. Pendant ce temps, LSA utilise SVD pour réduire la dimensionnalité de la matrice terme-document. Cela fait de LSA une méthode déterministe, car elle utilise des transformations fixes (SVD), donnant le même résultat à chaque fois pour la même entrée.
LDA fournit des probabilités pour les mots au sein des sujets et les sujets au sein des documents. Elle crée des sujets plus cohérents grâce à son cadre probabiliste. Cela la rend plus adaptée aux ensembles de données volumineux et bruités. En revanche, LSA est efficace pour les ensembles de données plus petits et l'exploration des relations sémantiques.
LSA vs. NMF
NMF (Non-negative Matrix Factorization) présente des similitudes avec LSA dans son utilisation de la factorisation matricielle. Cependant, elle impose une contrainte de non-négativité, garantissant que tous les composants sont additifs. Cette contrainte rend les résultats de NMF plus interprétables que ceux de LSA, qui autorise des valeurs négatives dans son processus de factorisation.
Par exemple, les sujets identifiés par NMF ne montreront que des associations positives entre des termes comme "good" et "quality" dans un avis positif. Cela rend NMF plus facile à interpréter. Une autre distinction réside dans la cohérence des résultats. LSA donne le même résultat en raison de son utilisation de SVD. Les résultats de NMF peuvent varier selon l'initialisation et nécessitent souvent plusieurs exécutions pour l'optimisation.
Avantages et défis de LSA
Comprendre les avantages et les défis de LSA est essentiel pour l'appliquer efficacement dans les tâches de traitement du langage naturel.
Avantages
Voici quelques-uns des principaux avantages de LSA :
Amélioration de la recherche d'information : LSA améliore la précision des moteurs de recherche en tenant compte du sens sémantique des mots. Cela permet d'obtenir des résultats de recherche plus pertinents.
Réduction de la dimensionnalité : LSA simplifie les données complexes en réduisant le nombre de dimensions dans la matrice document-terme. Cela rend les données plus faciles à gérer et à interpréter.
Analyse sémantique : LSA capture les relations sémantiques latentes entre les termes et les documents. Cela aide dans des tâches comme le regroupement de documents et la modélisation de sujets.
Défis
Voici quelques-uns des défis associés à LSA :
Hypothèse de relations linéaires : LSA suppose des relations linéaires entre les termes et les concepts. Cela peut ne pas toujours correspondre à la véritable nature du langage. Par conséquent, cela peut entraîner des inexactitudes, comme des interprétations erronées du sens des mots.
Ordre des mots : LSA ne prend pas en compte l'ordre des mots dans un document, ce qui peut être crucial pour comprendre le contexte et le sens.
Gestion des synonymes et de la polysémie : LSA peut avoir des difficultés avec les mots ayant plusieurs sens (polysémie) ou les synonymes. Elle ne désambiguïse pas explicitement ces termes.
Applications, outils et fournisseurs de LSA
LSA a une large applicabilité en NLP et en recherche d'information, et elle est prise en charge par divers outils et plateformes qui améliorent son intégration et sa scalabilité.
Applications
LSA est largement utilisée dans des applications concrètes au sein des systèmes de NLP et de recherche d'information. Celles-ci incluent :
Moteurs de recherche : LSA aide à améliorer les résultats de recherche en identifiant les structures sémantiques latentes dans les documents et les requêtes.
Systèmes de recommandation : LSA suggère des éléments pertinents en analysant les relations sémantiques entre les utilisateurs et les éléments sur la base de données historiques ou de préférences.
Regroupement de documents : LSA réduit la dimensionnalité et révèle les relations sémantiques. Cela lui permet de regrouper automatiquement des documents similaires, aidant à organiser de grands corpus de textes.
Chatbots/Applications NLP : LSA améliore les chatbots et autres applications NLP en améliorant la compréhension du contexte et de l’intention.
Outils
Divers outils prennent en charge la mise en œuvre de LSA :
Milvus : Une base de données vectorielle open-source pour stocker et interroger des embeddings vectoriels convertis par des techniques LSA afin d’effectuer des recherches de similarité sémantique.
scikit-learn : Une bibliothèque Python fournissant des utilitaires pour générer des embeddings LSA grâce à des techniques comme SVD.
Gensim : Une bibliothèque Python largement utilisée pour la modélisation de sujets et l’analyse de similarité de documents. Gensim fournit une implémentation efficace de l’indexation sémantique latente (LSI) via sa classe gensim.models.LsiModel.
Connexion à Milvus
Milvus permet un stockage et une récupération efficaces des embeddings. Il est idéal pour effectuer des recherches de similarité vectorielle rapides et précises.
Aperçu du flux de travail
Le processus implique :
Génération d’embeddings : Nous utilisons DefaultEmbeddingFunction pour convertir des documents comme "tall green tree sway" en représentations vectorielles. Ces embeddings sont essentiels pour effectuer des recherches de similarité sémantique.
Stockage dans Milvus : Stockez les embeddings générés avec les métadonnées associées dans Milvus pour une gestion efficace.
Recherche de similarité : Un vecteur de requête est généré à partir d’une phrase de recherche comme "tall green tree sway." Ce vecteur est utilisé pour rechercher dans la collection les correspondances les plus similaires.
Connexion à Milvus
Milvus permet un stockage et une récupération efficaces des embeddings. Il est idéal pour effectuer des recherches de similarité vectorielle rapides et précises.
Aperçu du flux de travail
Le processus implique :
Génération d’embeddings : Nous avons appliqué LSA pour transformer des documents comme "tall green tree sway" en représentations vectorielles. Ces vecteurs encapsulent la structure sémantique du texte.
Stockage dans Milvus : Stockez les vecteurs transformés avec les métadonnées associées dans une collection Milvus.
Recherche de similarité : Utilisez un vecteur de requête comme "tall green tree sway" pour récupérer les documents les plus similaires sémantiquement dans la collection.
Étapes à suivre
Créer une collection Milvus : Initialisez une collection en spécifiant la dimension vectorielle.
Insérer des données : Ajoutez les vecteurs transformés par LSA et leurs métadonnées dans la collection.
Effectuer une recherche de similarité : Interrogez la collection à l’aide d’un vecteur pour trouver les correspondances les plus proches.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
db_name="default"
)
if client.has_collection(collection_name="coll"):
client.drop_collection(collection_name="coll")
client.create_collection(
collection_name="coll",
dimension=2,
)
vectors = lsa_transformed
data = [
{"id": i, "vector": vectors[i], "document": documents[i]}
for i in range(len(vectors))
]
data
res = client.insert(collection_name="coll", data=data)
query_vectors = [lsa_transformed[0]]
res = client.search(
collection_name="coll",
data=query_vectors,
limit=3,
output_fields=["document"],
)
for item in res[0]:
print(f"ID: {item['id']}")
print(f"Distance: {item['distance']}")
print(f"Entity:")
print(f" Document: {item['entity']['document']}\n")
Sortie :
Nous avons récupéré les documents les plus pertinents en fonction de leur proximité sémantique.
FAQ
- Comment LSA gère-t-elle la polysémie, et quelles sont ses limites ?
LSA considère chaque mot comme ayant une seule signification. Cela entraîne des problèmes avec les mots polysémiques, qui provoquent des inexactitudes sémantiques.
- Quels sont les défis computationnels avec LSA sur de grands ensembles de données ?
LSA nécessite la SVD, qui est gourmande en calcul et chronophage, surtout avec de grands ensembles de données. De plus, les dimensions produites par la SVD peuvent être difficiles à interpréter.
- Quelles sont les limites de LSA dans la capture de l’ordre des mots ?
LSA ignore l’ordre des mots, ce qui affecte des tâches comme l’analyse des sentiments, où la séquence des mots (par exemple, "pas bon" vs. "bon pas") influence le sens.
- Comment LSA traite-t-elle les synonymes, et quels défis se posent ?
LSA identifie les relations sémantiques latentes entre les mots. Cependant, elle peut avoir du mal avec les différences subtiles entre synonymes, ce qui complique des tâches comme le regroupement de documents.
- Comment LSA gère-t-elle la parcimonie dans les matrices termes-documents ?
LSA crée des matrices termes-documents creuses, ce qui peut réduire la précision et l’efficacité. Même avec la SVD, cette parcimonie limite ses performances dans des tâches comme la classification de documents.
Sources connexes
Recherche de similarité sémantique suralimentée en production
Recherche de similarité vectorielle d’articles scientifiques ArXiv avec Milvus 2.1
Mise à l’échelle de la recherche avec Milvus : gérer d’immenses ensembles de données avec facilité
Les 10 meilleures techniques de NLP que tout data scientist devrait connaître
Premiers pas avec la recherche hybride sémantique / plein texte avec Milvus 2.5
Nouveautés de Milvus 2.5 : recherche plein texte, optimisation avancée des requêtes, et plus encore
- TL;DR
- Introduction
- Qu’est-ce que la LSA ?
- Comment fonctionne la LSA ?
- Comparaison avec des techniques similaires
- Avantages et défis de LSA
- Applications, outils et fournisseurs de LSA
- FAQ
- Sources connexes
Contenu
Commencez gratuitement, évoluez facilement
Essayez la base de données vectorielle entièrement managée conçue pour vos applications GenAI.
Essayer Zilliz Cloud gratuitement

