Copyright HébergementWebs.com - License GPL

Gensim - Guide rapide

Tutoriel gensim   2021-01-04 11:47:04

Gensim - Introduction Ce chapitre vous aidera à comprendre l"histoire et les fonctionnalités de Gensim ainsi que ses utilisations et avantages. Qu"est-ce que Gensim? Gensim = “Generate Similar" est une bibliothèque de traitement du langage naturel (NLP) open source populaire utilisée pour modélisation de sujets non supervisée. Il utilise des modèles académiques de pointe et un apprentissage automatique statistique moderne pour effectuer Création de documents ou de vecteurs de mots Corpora Exécution de l"identification de sujets Exécution de la comparaison de documents (récupération de documents sémantiquement similaires) Analyse de documents en texte brut pour la structure sémantique Outre l"exécution des tâches complexes ci-dessus, Gensim, implémenté en Python et Cython, est conçu pour gérer de grandes collections de texte en utilisant le streaming de données ainsi que des algorithmes en ligne incrémentiels. Cela le rend différent de ces logiciels d"apprentissage automatique qui ne ciblent que le traitement en mémoire. Histoire En 2008, Gensim a commencé comme une collection de Diverses fonctionnalités Voici quelques-unes des fonctionnalités et capacités offertes par Gensim - Évolutivité Gensim peut facilement traiter des corpus de grande taille et à l"échelle du Web en utilisant ses algorithmes de formation incrémentiels en ligne. Il est de nature évolutive, car il n"est pas nécessaire que tout le corpus d"entrée réside entièrement dans la mémoire vive (RAM) à un moment donné. En d"autres termes, tous ses algorithmes sont indépendants de la mémoire par rapport à la taille du corpus. Robuste Gensim est de nature robuste et a été utilisé dans Platform Agnostic Comme nous savons que Python est un langage très polyvalent en tant que pur Python Gensim fonctionne sur toutes les plates-formes ( comme Windows, Mac OS, Linux) qui prend en charge Python et Numpy. Implémentations multicœurs efficaces Afin d"accélérer le traitement et la récupération sur les clusters de machines, Gensim fournit des implémentations multicœurs efficaces de Latent Semantic Analysis (LSA), Latent Dirichlet Allocation (LDA), Random Projections (RP), Hierarchical Dirichlet Process (HDP) . Open Source et abondance de support communautaire Gensim est licencié sous la licence GNU LGPL approuvée par OSI qui lui permet d"être utilisé gratuitement à la fois pour un usage personnel et commercial. Toutes les modifications apportées à Gensim sont à leur tour open-source et bénéficient également du soutien de la communauté. Utilisations de Gensim Gensim a été utilisé et cité dans plus de mille applications commerciales et académiques. Il est également cité par fastText fastText, utilise un réseau de neurones pour l"incorporation de mots, est une bibliothèque pour l"apprentissage de l"incorporation de mots et de la classification de texte. Il est créé par le laboratoire AI Research (FAIR) de Facebook. Ce modèle, fondamentalement, nous permet de créer un algorithme supervisé ou non pour obtenir des représentations vectorielles pour les mots. Word2vec Word2vec, utilisé pour produire l"incorporation de mots, est un groupe de modèles de réseaux neuronaux à deux couches. Les modèles sont essentiellement formés pour reconstruire les contextes linguistiques des mots. LSA (Latent Semantic Analysis) C"est une technique en NLP (Natural Language Processing) qui nous permet d"analyser les relations entre un ensemble de documents et leurs termes contenant. Cela se fait en produisant un ensemble de concepts liés aux documents et aux termes. LDA (Latent Dirichlet Allocation) C"est une technique en PNL qui permet d"expliquer des ensembles d"observations par des groupes non observés. Ces groupes non observés expliquent pourquoi certaines parties des données sont similaires. C"est la raison pour laquelle il s"agit d"un modèle statistique génératif. tf-idf (terme fréquence-fréquence inverse du document) tf-idf, une statistique numérique dans la recherche d"informations, reflète l"importance un mot est un document dans un corpus. Il est souvent utilisé par les moteurs de recherche pour évaluer et classr la pertinence d’un document en fonction d’une requête de l’utilisateur. Il peut également être utilisé pour le filtrage des mots vides dans la synthèse et la classification de texte. Tous seront expliqués en détail dans les sections suivantes. Avantages Gensim est un package NLP qui fait de la modélisation de sujets. Les avantages importants de Gensim sont les suivants - Nous pouvons obtenir les fonctionnalités de modélisation de sujets et d"intégration de mots dans d"autres packages comme "scikit- apprenez " et " R ", mais les fonctionnalités fournies par Gensim pour la création de modèles de sujets et l"incorporation de mots sont sans précédent. Il fournit également des fonctionnalités plus pratiques pour le traitement de texte. Un autre avantage le plus important de Gensim est qu"il nous permet de gérer des fichiers texte volumineux même sans charger le fichier entier en mémoire. Gensim ne nécessite pas d"annotations coûteuses ni de marquage manuel des documents car il utilise des modèles non supervisés. Gensim - Premiers pas Le chapitre éclaire sur les prérequis pour l"installation de Gensim, ses dépendances principales et des informations sur sa version actuelle. Prérequis Afin d"installer Gensim, nous devons avoir Python installé sur nos ordinateurs. Vous pouvez accéder au lien www.python.org/downloads/ et sélectionnez la dernière version de votre système d"exploitation, à savoir Windows et Linux / Unix. Vous pouvez vous référer au lien www.tutorialspoin t.com/python3/index.htm pour un didacticiel de base sur Python. Gensim est pris en charge pour Linux, Windows et Mac OS X. Dépendances de code Gensim doit fonctionner sur n"importe quelle plate-forme prenant en charge Python 2.7 ou 3.5+ et NumPy . Cela dépend en fait du logiciel suivant - Python Gensim est testé avec les versions 2.7, 3.5, 3.6 et 3.7 de Python. Numpy Comme nous le savons, NumPy est un package pour le calcul scientifique avec Python. Il peut également être utilisé comme un conteneur multidimensionnel efficace de données génériques. Gensim dépend du package NumPy pour le calcul des nombres. Pour un tutoriel de base sur Python, vous pouvez vous référer au lien www./numpy/index.htm . smart_open smart_open, une bibliothèque Python 2 et Python 3, est utilisée pour le streaming efficace de très gros fichiers. Il prend en charge le streaming depuis / vers des stockages tels que S3, HDFS, WebHDFS, HTTP, HTTPS, SFTP ou des systèmes de fichiers locaux. Gensim dépend de la bibliothèque Python smart_open pour ouvrir de manière transparente les fichiers sur le stockage distant ainsi que les fichiers compressés. Version actuelle La version actuelle de Gensim est 3.8.0 qui a été publié en juillet 2019. Installation à l"aide de Terminal L"un des moyens les plus simples d"installer Gensim est de exécutez la commande suivante dans votre terminal - pip install --upgrade gensim Installation à l"aide de l"environnement Conda Une autre façon de télécharger Gensim est d"utiliser l"environnement conda . Exécutez la commande suivante dans votre terminal conda - conda install –c conda-forge gensim Installation à l"aide du package source Supposons que si vous avez téléchargé et décompressé le paquet source, alors vous devez exécuter les commandes suivantes - python setup.py test python setup.py install Gensim - Documents & Corpus Ici, nous allons apprendre les concepts de base de Gensim, avec un accent principal sur les documents et le corpus. Concepts de base de Gensim Voici les concepts de base et les termes nécessaires pour comprendre et utiliser Gensim - Document - ZIt fait référence à du texte. Corpus - Il fait référence à une collection de documents. Vecteur - La représentation mathématique d"un document est appelée vecteur. Modèle - Il fait référence à un algorithme utilisé pour transformer des vecteurs à partir d"un représentation à un autre. Qu"est-ce qu"un document? Comme indiqué, il fait référence à un texte. Si l"on va dans le détail, c"est un objet de type séquence de texte qui est connu sous le nom de "str" en Python 3. Par exemple, dans Gensim, un document peut être quelque chose comme - Court tweet de 140 caractères Un seul paragraphe, c"est-à-dire un résumé d"article ou de papier de recherche Article d"actualité Livre Novel Thèses Séquence de texte Un type de séquence de texte est communément appelé "str" en Python 3. Comme on sait qu"en Python, les données textuelles sont gérées avec des chaînes ou plus précisément "str" objets. Les chaînes sont essentiellement des séquences immuables de points de code Unicode et peuvent être écrites de la manière suivante - Guillemets simples - Par exemple , «Salut! Comment vas-tu? ». Cela nous permet également d"incorporer des guillemets doubles. Par exemple, «Salut! "Comment" vas-tu? " Guillemets doubles - Par exemple, " Salut! Comment vas-tu? ". Cela nous permet également d"intégrer des guillemets simples. Par exemple, "Salut! "Comment " allez-vous? " Triple guillemets - Cela peut avoir soit trois chanter le cite comme, "" "Salut! Comment vas-tu? "" ". ou trois guillemets doubles comme, " "Salut! "Comment " allez-vous? " " Tous les espaces seront inclus dans la chaîne littérale. Exemple Voici un exemple de document dans Gensim - Document = "Tutorialspoint.com est la plus grande bibliothèque de didacticiels en ligne et elle est entièrement gratuite également" Qu"est-ce que Corpus? Un corpus peut être défini comme le grand ensemble structuré de machines -des textes lisibles produits dans un cadre communicatif naturel. Dans Gensim, une collection d"objets document est appelée corpus. Le pluriel de corpus est corpora. Rôle du corpus dans Gensim Un corpus dans Gensim remplit les deux rôles suivants - Sert d"entrée pour la formation d"un modèle Le tout premier et important rôle qu"un corpus joue dans Gensim, est comme une entrée pour la formation d"un modèle. Afin d"initialiser les paramètres internes du modèle, lors de la formation, le modèle recherche des thèmes et des sujets communs dans le corpus de formation. Comme discuté ci-dessus, Gensim se concentre sur les modèles non supervisés, par conséquent, il ne nécessite aucune intervention humaine. Sert d"extraction de sujets Une fois le modèle formé, il peut être utilisé pour extraire des sujets des nouveaux documents. Ici, les nouveaux documents sont ceux qui ne sont pas utilisés dans la phase de formation. Exemple Le corpus peut inclure tous les tweets d"une personne en particulier, liste de tous les articles de un journal ou tous les articles de recherche sur un sujet particulier etc. Collecte de corpus Voici un exemple de petit corpus qui contient 5 documents. Ici, chaque document est une chaîne composée d"une seule phrase. t_corpus = [ "Une enquête sur l"opinion des utilisateurs sur le temps de réponse du système informatique ", "Relation de temps de réponse perçu par l"utilisateur à la mesure des erreurs ", " La génération d"arbres aléatoires binaires non ordonnés ", " Le graphe d"intersection des chemins dans les arbres ", "Graph minors IV Largeurs d"arbres et quasi ordonnancement ",] Prétraitement du corpus de collecte Une fois que nous avons collecté le corpus, quelques étapes de pré-traitement doivent être prises pour garder le corpus simple . Nous pouvons simplement supprimer certains mots anglais couramment utilisés comme «le». Nous pouvons également supprimer les mots qui n"apparaissent qu"une seule fois dans le corpus. Par exemple, le Python suivant est utilisé pour minuscules chaque document, le Exemple import pprint t_corpus = [ "Une enquête sur l"opinion des utilisateurs sur le temps de réponse du système informatique ", "Relation entre le temps de réponse perçu par l"utilisateur et la mesure des erreurs ", " La génération d"arbres aléatoires binaires non ordonnés ", " Le graphe d"intersection des chemins dans les arbres ", " Graph mineures IV Largeurs d"arbres et quasi ordonnancement ",] stoplist = set ( "pour un of the and to in ". split (" ")) processor_corpus = [[word for word in document.lower (). split () if word not in stoplist] for document in t_corpus] pprint.pprint (processor_corpus) ] Sortie [[ "survey ", "user ", "opinion ", "computer ", "système ", "réponse ", "heure "], [ "relation ", "utilisateur ", "perçu ", "réponse ", "heure ", "erreur ", "m easurement "], [" generation ", " random ", " binary ", " unordered ", " arbres "], [" intersection ", " graph ", "chemins ", "arbres "], [ "graphe ", "mineurs ", "iv ", "largeurs ", "arbres ", "puits ", "quasi ", "ordering "]] Prétraitement efficace Gensim fournit également une fonction pour un prétraitement plus efficace du corpus. Dans ce type de prétraitement, nous pouvons convertir un document en une liste de jetons minuscules. Nous pouvons également ignorer les jetons qui sont trop courts ou trop longs. Une telle fonction est gensim.utils.simple_preprocess (doc, deacc = False, min_len = 2, max_len = 15) . gensim. utils.simple_preprocess () fucntion Gensim fournit cette fonction pour convertir un document en une liste de les jetons minuscules et aussi pour ignorer les jetons trop courts ou trop longs. Il a les paramètres suivants - doc (str) Il fait référence au document d"entrée sur lequel le prétraitement doit être appliqué. deacc (booléen, facultatif) Ce paramètre est utilisé pour supprimer les marques d"accentuation des jetons. Il utilise deaccent () pour ce faire. min_len (int, facultatif) Avec l"aide de ce paramètre, nous pouvons définir la longueur minimale de un jeton. Les jetons plus courts que la longueur définie seront supprimés. max_len (int, facultatif) Avec l"aide de ce paramètre, nous pouvons définir la longueur maximale d"un jeton. Les jetons plus longs que la longueur définie seront supprimés. La sortie de cette fonction serait les jetons extraits du document d"entrée. Gensim - Vector & Model Ici, nous allons apprendre les concepts de base de Gensim, avec un accent principal sur le vecteur et le modèle. Qu"est-ce que Vector? Et si nous voulons déduire la structure latente dans notre corpus? Pour cela, nous devons représenter les documents de manière à pouvoir les manipuler mathématiquement. Un type de représentation populaire consiste à représenter chaque document de corpus comme un vecteur de caractéristiques. C"est pourquoi nous pouvons dire que le vecteur est une représentation mathématique pratique d"un document. Pour vous donner un exemple, représentons une seule caractéristique, de notre corpus utilisé ci-dessus, comme une paire QA - Q - Combien de fois le mot Bonjour apparaît-il dans le document? A - Zéro (0). Q - Combien de paragraphes y a-t-il dans le document? A - Deux (2) La question est généralement représentée par son identifiant entier, donc la représentation de ce document est une série de paires comme (1, 0.0), (2, 2.0). Une telle représentation vectorielle est connue sous le nom de vecteur dense . Pourquoi dense , car il comprend une réponse explicite à toutes les questions écrites ci-dessus. La représentation peut être un simple comme (0, 2), si on sait tout t il questionne à l"avance. Une telle séquence de réponses (bien sûr si les questions sont connues à l"avance) est le vecteur de notre document. Un autre type de représentation populaire est le bag-of -word (BoW) modèle. Dans cette approche, chaque document est essentiellement représenté par un vecteur contenant le nombre de fréquences de chaque mot du dictionnaire. Pour vous donner un exemple, supposons que nous ayons un dictionnaire qui contient les mots ["Hello", "Comment ça va"]. Un document composé de la chaîne «Comment allez-vous comment» serait alors représenté par le vecteur [0, 2, 1, 1]. Ici, les entrées du vecteur sont dans l"ordre des occurrences de «Bonjour», «Comment», «êtes» et «vous». Vecteur par rapport au document Depuis le au-dessus de l"explication du vecteur, la distinction entre un document et un vecteur est presque comprise. Mais, pour clarifier les choses, document est du texte et vecteur est une représentation mathématiquement pratique de ce texte. Malheureusement, parfois, beaucoup de gens utilisent ces termes de manière interchangeable. Par exemple, supposons que nous ayons un document arbitraire A alors au lieu de dire «le vecteur qui correspond au document A», ils disaient «le vecteur A »ou« le document A ». Cela conduit à une grande ambiguïté. Une autre chose importante à noter ici est que deux documents différents peuvent avoir la même représentation vectorielle. Conversion de corpus en liste de vecteurs Avant de prendre un exemple d"implémentation de conversion de corpus en la liste des vecteurs, nous devons associer chaque mot du corpus à un identifiant entier unique. Pour cela, nous allons étendre l"exemple pris dans le chapitre ci-dessus. Exemple de gensim import corpora dictionary = corpora.Dictionary (processor_corpus) print (dictionnaire) Sortie Dictionnaire (25 jetons uniques: [ "ordinateur ", "opinion ", "réponse " " , "survey ", "system "] ...) Cela montre que dans notre corpus il y a 25 différences ent tokens dans ce gensim.corpora.Dictionary. Exemple d"implémentation Nous pouvons utiliser le dictionnaire pour transformer des documents tokenisés en ces vecteurs à 5 diems comme suit - pprint.pprint (dictionary.token2id) Sortie { " binaire ": 11, " ordinateur ": 0, " erreur ": 7, " génération ": 12, " graphique ": 16, " intersection ": 17, " iv ": 19, " mesure ": 8, " mineurs ": 20, " opinion ": 1, " ordre ": 21, " chemins ": 18, " perçu ": 9, "quasi ": 22, "random ": 13, "relation ": 10, "response ": 2, "survey ": 3, "system ": 4, "heure ": 5, "arbres ": 14, "unordered ": 15, "utilisateur ": 6, "puits ": 23, "largeurs ": 24} Et de la même manière, nous pouvons créer la représentation sac de mots pour un document comme suit - BoW_corpus = [dictionary.doc2bow (text) for text in processor_corpus] pprint.pprint (BoW_corpus) Sortie [[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)], [(11, 1) , (12, 1), (13, 1), (14, 1), (15, 1)], [(14, 1), (16, 1), (17, 1), (18, 1) ], [(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1) ]] Qu"est-ce que le modèle? Une fois que nous avons vectorisé le corpus, que faire ensuite? Maintenant, nous pouvons le transformer à l"aide de modèles. Le modèle peut faire référence à un algorithme utilisé pour transformer une représentation de document en une autre. Comme nous l"avons vu, les documents, dans Gensim, sont représentés comme des vecteurs, par conséquent, nous pouvons, bien que le modèle soit une transformation entre deux vecteurs les espaces. Il y a toujours une phase de formation où les modèles apprennent les détails de ces transformations. Le modèle lit le corpus d"entraînement pendant la phase d"entraînement. Initialisation d"un modèle Initialisons le modèle tf-idf . Ce modèle transforme les vecteurs de la représentation BoW (Bag of Words) en un autre espace vectoriel où les comptages de fréquence sont pondérés en fonction de la rareté relative de chaque mot du corpus. Exemple d"implémentation Dans l"exemple suivant, nous allons initialiser le tf-idf modèle. Nous allons l"entraîner sur notre corpus puis transformer la chaîne «tree graph». Exemple à partir de gensim import models tfidf = models.TfidfModel ( BoW_corpus) words = "graphe d"arbres ". Lower (). Split () print (tfidf [dictionary.doc2bow (words)]) Sortie [(3, 0.4869354917707381), (4, 0.8734379353188121)] Maintenant, une fois que nous avons créé le modèle, nous pouvons transformer l"ensemble du corpus via tfidf et l"indexer, et interroger la similitude de notre requête document (nous donnons le document de requête "tree system") contre chaque document du corpus - Exemple de gensim import similarities index = similarities .SparseMatrixSimilarity (tfidf [BoW_corpus], num_features = 5) query_document = "système d"arbres ". Split () query_bow = dictionary.doc2bow (query_document) simils = index [tfidf [query_bow]] print (list (enumerate (simils)) ) Sortie [( 0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)] D"après la sortie ci-dessus, le document 4 et le document 5 ont un score de similarité d"environ 49%. De plus, nous pouvons également trier cette sortie pour plus de lisibilité comme suit - Exemple pour doc_number, score trié (enumerate (sims), key = lambda x: x [1], reverse = True): print (doc_number, score) Sortie 2 1.0 3 0.4869355 4 0.4869355 0 0.0 1 0.0 Gensim - Création d"un dictionnaire Dans le dernier chapitre où nous avons discuté du vecteur et du modèle, vous avez une idée sur le dictionnaire. Ici, nous allons discuter un peu plus en détail de l"objet Dictionary . Qu"est-ce que Dictionary? Avant de plonger dans le c un concept de dictionnaire, comprenons quelques concepts simples de PNL - Jeton - Un jeton signifie un "mot". Document - Un document fait référence à une phrase ou à un paragraphe. Corpus - Il se réfère à une collection de documents comme un sac de mots (BoW). Pour tous les documents, un corpus contient toujours l"identifiant de chaque mot avec son nombre de fréquences dans le document. Passons au concept de dictionnaire dans Gensim. Pour travailler sur des documents texte, Gensim nécessite également que les mots, c"est-à-dire les jetons, soient convertis en leurs identifiants uniques. Pour y parvenir, il nous offre la possibilité de créer un objet Dictionary , qui associe chaque mot à son identifiant entier unique. Pour ce faire, il convertit le texte d"entrée en liste de mots, puis le transmet à l"objet corpora.Dictionary () . Besoin d"un dictionnaire Maintenant la question se pose de savoir quel est réellement le besoin d"un objet dictionnaire et où il peut être utilisé? Dans Gensim, l"objet dictionnaire est utilisé pour créer un corpus de sac de mots (BoW) qui est également utilisé comme entrée pour la modélisation de sujets et d"autres modèles. Formes d"entrées de texte Il existe trois formes différentes de texte d"entrée que nous pouvons fournir à Gensim - Comme les phrases stockées dans l"objet de liste natif de Python (connu sous le nom de str en Python 3) En un seul fichier texte (peut être petit ou grand) Plusieurs fichiers texte Création d"un dictionnaire à l"aide de Gensim Comme indiqué, dans Gensim, le dictionnaire contient le mappage de tous les mots, ou jetons à leur identifiant entier unique. Nous pouvons créer un dictionnaire à partir d"une liste de phrases, d"un ou plusieurs fichiers texte (fichier texte contenant plusieurs lignes de texte). Alors, commençons par créer un dictionnaire en utilisant une liste de phrases. À partir d"une liste de phrases Dans l"exemple suivant, nous allons créer un dictionnaire à partir d"une liste de phrases. Quand nous avons la liste de phrases ou vous pouvez dire plusieurs phrases, nous devons convertir chaque phrase en une liste de mots et la compréhension est l"un des moyens les plus courants de le faire. Exemple de mise en œuvre Premièrement, importer les packages requis et nécessaires comme suit - importer des gensim à partir de gensim importer des corpus de pprint import pprint Ensuite, faites la liste de compréhension à partir de la liste de phrases / document pour l"utiliser en créant le dictionnaire - doc = [ "CNTK anciennement connu sous le nom de Computational Network Toolkit ", "est un logiciel gratuit et facile à utiliser boîte à outils open source de qualité commerciale ", " qui nous permet d"entraîner des algorithmes d"apprentissage en profondeur pour apprendre comme le cerveau humain. "] Ensuite, nous devons text_tokens = [[texte pour texte dans doc.split ()] pour doc dans doc] Maintenant, avec le l"aide du suivant, nous pouvons créer le dictionnaire - dict_LoS = corpora.Dictionary (text_tokens) Maintenant, obtenons plus d"informations comme le nombre de jetons dans le dictionnaire - print (dict_LoS) Sortie Dictionnaire (27 jetons uniques: [ "CNTK ", "Computational ", "Network ", "Toolkit ", "as ​​"] ...) Nous pouvons également voir le mappage mot en entier unique comme suit - print (dict_LoS.token2id) Sortie { "CNTK ": 0, "Computational ": 1, "Network ": 2, "Toolkit ": 3, "as ​​": 4, "formerly ": 5 , "known ": 6, "a ": 7, "commercial-grade ": 8, "easy-to-use ": 9, "free ": 10, "est ": 11, " open-source ": 12, " t oolkit ": 13, " algorithmes ": 14, " brain. ": 15, " deep ": 16, " enable ": 17, " human ": 18, " learn ": 19, " learning ": 20, " like ": 21, " that ": 22, " the ": 23, " to ": 24, " train " : 25, "nous " : 26} Exemple d"implémentation complet import gensim à partir de gensim import corp à partir de pprint import pprint doc = [ "CNTK anciennement connu sous le nom de Computational Network Toolkit ", " est une boîte à outils gratuite et open-source de qualité commerciale ", " qui nous permet de former des algorithmes d"apprentissage en profondeur pour apprendre comme le cerveau humain. "] text_tokens = [[text for text dans doc.split ()] pour doc dans doc] dict_LoS = corpora.Dictionary (text_tokens) print (dict_LoS.token2id) À partir d"un fichier texte unique Dans l"exemple suivant, nous allons créer un dictionnaire à partir d"un seul fichier texte. De la même manière, nous pouvons également créer un dictionnaire à partir de plusieurs fichiers texte (ie répertoire de fichiers). Pour cela, nous avons enregistré le document, utilisé dans l"exemple précédent, dans le fichier texte nommé doc.txt . Gensim lira le fichier ligne par ligne et traitera une ligne à la fois en utilisant simple_preprocess . De cette façon, il n"est pas nécessaire de charger le fichier complet en mémoire en une seule fois. Exemple d"implémentation Tout d"abord, importez les packages requis et nécessaires comme suit - importer des groupes électrogènes à partir de groupes électrogènes importer des corpus à partir de pprint importer pprint à partir de gensim.utils importer simple_preprocess à partir de smart_open importer smart_open import os La prochaine ligne de codes créera le dictionnaire gensim par en utilisant le fichier texte unique nommé doc.txt - dict_STF = corpora.Dictionary (simple_preprocess (line, deacc = True) pour la ligne ouverte ("doc.txt", encoding = "utf-8")) Maintenant, obtenons plus d"informations comme le nombre de jetons dans le dictionnaire - print (dict_STF) Sortie Dictionnaire (27 jetons uniques: [ "CNTK ", "Computational ", "Network ", "Toolkit ", " as "] ...) Nous pouvons également voir le mappage mot en entier unique comme fo llows - print (dict_STF.token2id) Sortie { "CNTK ": 0, "Computational ": 1, "Network ": 2, " Toolkit ": 3, " as ": 4, " formerly ": 5, " known ": 6, " a ": 7, " qualité commerciale ": 8, " facile à utiliser ": 9, " gratuit ": 10, " is ": 11, " open-source ": 12, " toolkit ": 13 , "algorithmes ": 14, "brain. ": 15, "deep ": 16, "enable ": 17, "human ": 18, "learn ": 19, "learning ": 20, "like ": 21, "that ": 22, "the ": 23, "to ": 24, "train ": 25, " us ": 26} Exemple d"implémentation complet import des gensim depuis les gensim importer des corpus depuis pprint importer pprint depuis gensim.utils importer simple_preprocess depuis smart_open import smart_open import os dict_STF = corpora.Dictionary (simple_preprocess (line, deacc = True) pour la ligne dans open ("doc.txt", encoding = "utf-8")) dict_STF = corpora.Dictionary (text_tokens) print (dict_STF.token2id ) À partir de plusieurs fichiers texte Créons maintenant dictionar y à partir de plusieurs fichiers, c"est-à-dire plus d"un fichier texte enregistré dans le même répertoire. Pour cet exemple, nous avons créé trois fichiers texte différents à savoir first.txt, second.txt et third.txt contenant les trois lignes du fichier texte (doc.txt), nous avons utilisé pour l"exemple précédent. Tous ces trois fichiers texte sont enregistrés dans un répertoire nommé ABC. Exemple d"implémentation Pour implémenter cela, nous devons définir une class avec un méthode qui peut parcourir les trois fichiers texte (First, Second et Third.txt) dans le répertoire (ABC) et générer la liste traitée des jetons de mots. Définissons la class nommée Read_files ayant une méthode nommée __ itération __ () comme suit - class Read_files (object): def __init __ (self, nom_répertoire): elf.directoryname = nom_répertoire def __iter __ (self): for fname dans os.listdir (self.directoryname): pour la ligne ouverte (os.path.join (self.directoryname, fname), encoding = "latin ") : yield simple_preprocess (line) Ensuite, nous devons fournir le chemin du répertoire comme suit - path = "ABC " #fournir le chemin selon votre système informatique où vous avez enregistré le répertoire . Les étapes suivantes sont similaires à celles des exemples précédents. La prochaine ligne de codes créera le répertoire Gensim en utilisant le répertoire contenant trois fichiers texte - dict_MUL = corpora.Dictionary (Read_files (path)) Sortie Dictionary (27 jetons uniques: [ "CNTK ", "Computational ", "Network ", "Toolkit ", "as "] ...) Maintenant, nous pouvons également voir le mappage mot-entier unique comme suit - print (dict_MUL.token2id) Sortie { "CNTK ": 0, "Computational ": 1, "Network ": 2, "Toolkit ": 3, " as ": 4, " anciennement ": 5, " known ": 6, " a ": 7, " commercial-grade ": 8, " easy -à-utiliser ": 9, " gratuit ": 10, " is ": 11, " open-source ": 12, " toolkit ": 13, " algorithms ": 14 , "brain. ": 15, "deep ": 16, "enable ": 17, "human ": 18, "learn ": 19, "learning ": 20, "comme ": 21, "that ": 22, "the ": 23, "to ": 24, "train ": 25, "us ": 26} Sauvegarde et chargement d"un Gensim Di ctionary Gensim supporte sa propre méthode native save () pour enregistrer le dictionnaire sur le disque et la méthode load () pour charger le dictionnaire à partir du disque. Par exemple, nous pouvons enregistrer le dictionnaire à l"aide du suivant - Gensim.corpora.dictionary.save (filename) #fournissez le chemin où vous souhaitez enregistrer le dictionnaire . De même, nous pouvons charger le dictionnaire enregistré en utilisant la méthode load (). Le suivant peut le faire - Gensim.corpora.dictionary.load (filename) #fournir le chemin où vous avez enregistré le dictionnaire. Gensim - Creat un corpus de sac de mots (BoW) Nous avons compris comment créer un dictionnaire à partir d"une liste de documents et de fichiers texte (à partir d"un comme de plusieurs). Maintenant, dans cette section, nous allons créer un corpus de sac de mots (BoW). Pour travailler avec Gensim, c"est l"un des objets les plus importants avec lesquels nous devons nous familiariser. Fondamentalement, c"est le corpus qui contient le mot id et sa fréquence dans chaque document. Créer un corpus BoW Comme discuté, dans Gensim, le corpus contient le mot id et son fréquence dans chaque document. Nous pouvons créer un corpus BoW à partir d"une simple liste de documents et de fichiers texte. Ce que nous devons faire est de transmettre la liste de mots tokenisés à l"objet nommé Dictionary.doc2bow () . Commençons donc par créer un corpus BoW en utilisant une simple liste de documents. À partir d"une simple liste de phrases Dans l"exemple suivant, nous allons créer un corpus BoW à partir d"une liste simple contenant trois phrases. Premièrement, nous devons importer tous les paquets nécessaires comme suit - import gensim import pprint depuis gensim import corpus de gensim. utils import simple_preprocess Maintenant, fournissez la liste contenant les phrases. Nous avons trois phrases dans notre liste - doc_list = [ "Bonjour, comment allez-vous? ", "Comment allez-vous? ", "Hey que faites-vous? oui vous Que faites-vous? "] Ensuite, faites la tokenisation des phrases comme suit - doc_tokenized = [ simple_preprocess (doc) pour doc dans doc_list] Créez un objet de corpora.Dictionary () comme suit - dictionary = corpora.Dictionary () Passez maintenant ces phrases tokenisées à l"objet dictionary.doc2bow () comme suit - BoW_corpus = [dictionary.doc2bow (doc, allow_update = True) pour doc dans doc_tokenized] Enfin, nous pouvons imprimer Sac de corpus de mots - print (BoW_corpus) Sortie [[(0, 1), (1, 1), (2, 1), (3, 1)], [(2, 1), (3, 1), (4, 2)], [(0, 2), (3, 3), (5, 2 ), (6, 1), (7, 2), (8, 1)]] La sortie ci-dessus montre que le mot avec id = 0 apparaît une fois dans le premier document (car nous avons (0,1) dans la sortie) et ainsi de suite. La sortie ci-dessus est en quelque sorte impossible à lire pour les humains. Nous pouvons également convertir ces identifiants en mots, mais pour cela, nous avons besoin de notre dictionnaire pour effectuer la conversion comme suit - id_words = [[(dictionary [id], count) pour id, compte en ligne] pour la ligne dans BoW_corpus] print (id_words) Sortie [[( "are ", 1), ( "bonjour ", 1), ( "comment ", 1), ( "vous ", 1)], [( "comment ", 1), ( "vous ", 1 ), ( "do ", 2)], [( "are ", 2), ( "you ", 3), ( "doing ", 2), ( "hey " , 1), ( "what ", 2), ( "yes ", 1)]] Maintenant, la sortie ci-dessus est en quelque sorte lisible par l"homme. Implémentation complète Exemple import gensim import pprint depuis gensim import corpus de gensim.utils import simple_preprocess doc_list = [ "Bonjour, comment allez-vous? ", "Comment faites-vous ? ", " Hé, qu"est-ce que tu fais? Oui toi Que fais-tu? "] Doc_tokenized = [simple_preprocess (doc) pour doc dans doc_list] dictionary = corpora.Dictionary () BoW_corpus = [dictionary.doc2bow (doc, allow_upda te = True) for doc in doc_tokenized] print (BoW_corpus) id_words = [[(dictionary [id], count) for id, count in line] for line in BoW_corpus] print (id_words) Depuis un Fichier texte Dans l"exemple suivant, nous allons créer un corpus BoW à partir d"un fichier texte. Pour cela, nous avons enregistré le document, utilisé dans l"exemple précédent, dans le fichier texte nommé doc.txt.. Gensim lira le fichier ligne par ligne et traitera une ligne à la fois en utilisant simple_preprocess . De cette façon, il n’est pas nécessaire de charger le fichier complet en mémoire en une seule fois. Implem Exemple d"entation D"abord, importez les packages requis et nécessaires comme suit - import des gensim depuis les gensim importer des corpus depuis pprint import pprint depuis les gensim.utils import simple_preprocess from smart_open import smart_open import os Ensuite, la ligne de code suivante fera lire les documents de doc.txt et les tokeniser - doc_tokenized = [simple_preprocess (line, deacc = True) pour la ligne en open ("doc.txt", encoding = "utf-8")] dictionary = corpora.Dictionary () Nous devons maintenant les transmettre mots tokenisés dans l"objet dictionary.doc2bow () (comme dans l"exemple précédent) BoW_corpus = [dictionary.doc2bow (doc, allow_update = True) pour doc dans doc_tokenized] print (BoW_corpus) Sortie [[(9, 1), (10, 1), (11 , 1), (12, 1), (13, 1), (14, 1), (15, 1)], [(15, 1), (16, 1), (17, 1), (18 , 1), (19 , 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)], [(23, 2), (25, 1), (26 , 1), (27, 1), (28, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (34, 1 ), (35, 1), (36, 1)], [(3, 1), (18, 1), (37, 1), (38, 1), (39, 1), (40, 1 ), (41, 1), (42, 1), (43, 1)], [(18, 1), (27, 1), (31, 2), (32, 1), (38, 1 ), (41, 1), (43, 1), (44, 1), (45, 1), (46, 1), (47, 1), (48, 1), (49, 1), (50, 1), (51, 1), (52, 1)]] Le fichier doc.txt a le contenu suivant - CNTK anciennement connu sous le nom de Computational Network Toolkit est une boîte à outils gratuite et open-source de qualité commerciale qui nous permet de former des algorithmes d"apprentissage en profondeur pour apprendre comme le cerveau humain. Vous pouvez trouver son tutoriel gratuit sur , fournissez également les meilleurs didacticiels techniques sur des technologies telles que l"apprentissage automatique en profondeur de l"IA. Exemple de mise en œuvre complète import des gensim depuis l"importation de gensim corpus de pprint importer pprint de gensim.utils impor t simple_preprocess de smart_open import smart_open import os doc_tokenized = [simple_preprocess (line, deacc = True) pour la ligne ouverte ("doc.txt", encoding = "utf-8")] dictionary = corpora.Dictionary () BoW_corpus = [dictionary .doc2bow (doc, allow_update = True) pour doc dans doc_tokenized] print (BoW_corpus) Sauvegarde et chargement d"un corpus Gensim Nous pouvons sauvegarder le corpus à l"aide du suivant - corpora.MmCorpus.serialize ("/ Users / Desktop / BoW_corpus.mm", bow_corpus) #fournir le chemin et le nom du corpus. Le nom du corpus est BoW_corpus et nous l"avons sauvegardé au format Matrix Market. De même, nous pouvons charger le corpus sauvegardé en utilisant le suivant - corpus_load = corpora.MmCorpus ("/ Users / Desktop / BoW_corpus.mm") pour la ligne dans corpus_load: print (line) Gensim - Transformations Ce chapitre vous aidera à découvrir les différentes transformations de Gensim. Commençons par comprendre la transformation des documents. Transformer des documents Transformer des documents signifie représenter le document de manière à ce que le document puisse être manipulé mathématiquement. En plus de déduire la structure latente du corpus, la transformation des documents servira également les objectifs suivants - Elle découvre la relation entre les mots. Il fait ressortir la structure cachée du corpus. Il décrit les documents d"une manière nouvelle et plus sémantique. Cela rend la représentation des documents plus compacte. Cela améliore l"efficacité car une nouvelle représentation consomme moins de ressources. Cela améliore l"efficacité car dans la nouvelle représentation, les tendances des données marginales sont ignorées. Le bruit est également réduit dans la nouvelle représentation de document. Voyons les étapes d"implémentation pour transformer les documents à partir d"un espace vectoriel representati à un autre. Étapes de mise en œuvre Pour transformer des documents, nous devons suivre les étapes suivantes - Étape 1: Création du corpus La toute première étape fondamentale consiste à créer le corpus à partir des documents. Nous avons déjà créé le corpus dans les exemples précédents. Créons-en un autre avec quelques améliorations (en supprimant les mots courants et les mots qui n"apparaissent qu"une seule fois) - import gensim import pprint from collections import defaultdict from gensim import corpus Maintenant, fournissez les documents pour créer le corpus - t_corpus = [ "CNTK anciennement connu sous le nom de Computational Network Toolkit ", "est une publicité open source gratuite et facile à utiliser- boîte à outils de qualité ", " qui nous permet d"entraîner des algorithmes d"apprentissage en profondeur pour apprendre comme le cerveau humain. ", " Vous pouvez trouver son tutoriel gratuit sur ", " Tutorialspoint.com fournit également les meilleurs tutoriels techniques sur des technologies comme l"apprentissage automatique en profondeur de l"IA gratuitement "] Ensuite, nous devons faire des tokenises et avec cela, nous supprimerons également les mots courants - stoplist = set ( "pour un des et vers dans ". split ( "")) processor_corpus = [[mot pour mot dans document.lower (). split () si mot pas dans la liste d"arrêt ] pour document in t_corpus] Le suivant supprimera les mots qui apparaissent uniquement - frequency = defaultdict (int) pour le texte dans processing_corpus: pour token in text: frequency [token] + = 1 processing_corpus = [[token for token in text if frequency [token]> 1] for text in processor_corpus] pprint.pprint (processor_corpus) Sortie [[ "toolkit "], [ "free ", "toolkit "], [ "deep ", "learning ", "like "], [" free ", " on ", " "], [" ", " on ", " like ", " deep ", " learning ", " learning ", " free "]] Passez-le maintenant à l"objet corpora.dictionary () à g et les objets uniques de notre corpus - dictionary = corpora.Dictionary (processor_corpus) print (dictionary) Output Dictionnaire (7 jetons uniques: [ "toolkit ", "free ", "deep ", "learning ", "like "] ...) Ensuite, la ligne de codes suivante créera le modèle Bag of Word pour notre corpus - BoW_corpus = [dictionary.doc2bow (text) for text in processor_corpus] pprint.pprint (BoW_corpus) Sortie [[(0, 1)], [(0, 1), (1 , 1)], [(2, 1), (3, 1), (4, 1)], [(1, 1), (5, 1), (6, 1)], [(1, 1) ), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]] Étape 2: Créer une transformation Les transformations sont des objets Python standards. Nous pouvons initialiser ces transformations, c"est-à-dire les objets Python, en utilisant un corpus entraîné. Ici, nous allons utiliser le modèle tf-idf pour créer une transformation de notre corpus formé ie BoW_corpus. Premièrement, nous devons importer les modèles package de gensim. à partir de modèles d"importation de gensim Maintenant, nous devons initialiser le modèle comme suit - tfidf = models.TfidfModel (BoW_corpus) Étape 3: Transformer les vecteurs Maintenant, dans cette dernière étape, les vecteurs seront convertis de l"ancienne représentation en nouvelle représentation. Comme nous avons initialisé le modèle tfidf à l"étape ci-dessus, le tfidf sera désormais traité comme un objet en lecture seule. Ici, en utilisant cet objet tfidf, nous convertirons notre vecteur de la représentation du sac de mots (ancienne représentation) en poids réels Tfidf (nouvelle représentation). doc_BoW = [ (1,1), (3,1)] print (tfidf [doc_BoW] Sortie [(1, 0.4869354917707381), (3 , 0.8734379353188121)] Nous avons appliqué la transformation sur deux valeurs de corpus, mais nous pouvons également l"appliquer à l"ensemble du co rpus comme suit - corpus_tfidf = tfidf [BoW_corpus] pour doc dans corpus_tfidf: print (doc) Sortie [(0, 1.0)] [(0, 0.8734379353188121), (1, 0.4869354917707381)] [(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896, [4, 0.5773502691896, [4, 0.5773502691896, 0,3667400603126873), (5, 0,657838022678017), (6, 0,657838022678017)] [(1, 0,19338287240886842), (2, 0,34687949360312714), (3, 0,6937589872062543), (4, 0,33468794993 )] Exemple d"implémentation complet import gensim import pprint depuis les collections import defaultdict depuis gensim import corpora t_corpus = [ "CNTK anciennement appelé Computational Network Toolkit ", " est une boîte à outils de qualité commerciale open source gratuite et facile à utiliser ", " qui nous permet de former des algorithmes d"apprentissage en profondeur pour apprendre comme le cerveau humain. ", " Vous pouvez trouver son tutoriel gratuit sur tutorialspo int.com ", " Tutorialspoint.com fournit également les meilleurs didacticiels techniques sur des technologies telles que l"apprentissage automatique en profondeur de l"IA gratuitement "] stoplist = set ( "pour un des et vers in ". split ( " ")) processor_corpus = [[mot pour mot dans document.lower (). split () si mot pas dans la liste d"arrêt] pour document dans t_corpus] frequency = defaultdict (int) pour texte dans processor_corpus: pour jeton dans le texte: fréquence [jeton ] + = 1 processor_corpus = [[token for token in text if frequency [token]> 1] for text in processor_corpus] pprint.pprint (processor_corpus) dictionary = corpora.Dictionary (processor_corpus) print (dictionary) BoW_corpus = [dictionary.doc2bow (texte) pour le texte dans processor_corpus] pprint.pprint (BoW_corpus) à partir de modèles d"importation de gensim tfidf = models.TfidfModel (BoW_corpus) doc_BoW = [(1,1), (3,1)] print (tfidf [doc_BoW]) corpus_tfidf = tfidf [BoW_corpus] pour doc dans corpus_tfidf: print (doc) Diverses transformations dans Gensim En utilisant Gensim, nous pouvons implémenter Tf-Idf (Term Frequency-Inverse Document Frequency) Lors de l"initialisation, cet algorithme de modèle tf-idf attend un corpus d"apprentissage ayant des valeurs entières (telles comme modèle Bag-of-Words). Ensuite, au moment de la transformation, il prend une représentation vectorielle et renvoie une autre représentation vectorielle. Le vecteur de sortie aura la même dimensionnalité mais la valeur des caractéristiques rares (au moment de l"apprentissage) Sera augmenté. Il convertit essentiellement les vecteurs à valeurs entières en vecteurs à valeurs réelles. Voici la syntaxe de la transformation Tf-idf - Model = models.TfidfModel (corpus, normalize = True) LSI (Latent Semantic Indexing) L"algorithme de modèle LSI peut transformer un document à partir d"un modèle vectoriel à valeur entière (tel que le modèle Bag-of-Words) ou d"un espace pondéré Tf-Idf en espace latent. Le vecteur de sortie sera de dimensionnalité inférieure. Voici la syntaxe de la transformation LSI - Model = models.LsiModel (tfidf_corpus, id2word = dictionary, num_topics = 300) LDA (Dirichlet latent Allocation) L"algorithme de modèle LDA est un autre algorithme qui transforme le document de l"espace modèle Bag-of-Words en un espace thématique. Le vecteur de sortie sera de dimensionnalité inférieure. Voici la syntaxe de la transformation LSI - Model = models.LdaModel (corpus, id2word = dictionary, num_topics = 100) Projections aléatoires (RP ) RP, une approche très efficace, vise à réduire la dimensionnalité de l"espace vectoriel. Cette approche est essentiellement une approximation des distances Tf-Idf entre les documents. Il le fait en ajoutant un peu d"aléatoire. Model = models.RpModel (tfidf_corpus, num_topics = 500) Processus de Dirichlet Hiérarchique (HDP) HDP est une méthode bayésienne non paramétrique qui est un nouvel ajout à Gensim. Nous devrions avoir t o faites attention lors de son utilisation. Model = models.HdpModel (corpus, id2word = dictionary Gensim - Création d"une matrice TF-IDF Ici, nous allons apprendre à créer une matrice de fréquence de document inversée (TF-IDF) avec l"aide de Gensim. Qu"est-ce que TF-IDF? Il est le modèle Term Frequency-Inverse Document Frequency, qui est également un modèle de sac de mots. Il est différent du corpus normal car il réduit les jetons, c"est-à-dire les mots apparaissant fréquemment dans les documents. Lors de l"initialisation, cet algorithme de modèle tf-idf attend un corpus d"apprentissage ayant des valeurs entières (comme le modèle Sac de mots). Ensuite, au moment de la transformation, il prend une représentation vectorielle et renvoie une autre représentation vectorielle. Le vecteur de sortie aura le même dimensionnalité mais la valeur des caractéristiques rares (au moment de l"apprentissage) sera augmentée. Il convertit essentiellement les vecteurs à valeur entière en vecteurs à valeur réelle. H ow It Is Computed? Le modèle TF-IDF calcule tfidf en suivant deux étapes simples - Étape 1: Multiplication des composants locaux et globaux In cette première étape, le modèle multipliera un composant local tel que TF (Term Frequency) par un composant global tel que IDF (Inverse Document Frequency). Étape 2: Normaliser le résultat Une fois la multiplication terminée, à l"étape suivante, le modèle TFIDF normalisera le résultat à la longueur de l"unité. En conséquence de ces deux étapes ci-dessus, les mots fréquemment produits dans les documents seront sous-pondérés. Comment obtenir des poids TF-IDF? Ici, nous allons implémenter un exemple pour voir comment nous pouvons obtenir des poids TF-IDF. Fondamentalement, pour obtenir les pondérations TF-IDF, nous devons d"abord former le corpus, puis appliquer ce corpus dans le modèle tfidf. Former le corpus Comme indiqué ci-dessus pour obtenir le TF-IDF dont nous avons d"abord besoin pour former notre corpus. Tout d"abord, nous devons importer tous les packages nécessaires comme suit - import gensim import pprint depuis gensim importer des corpus de gensim.utils import simple_preprocess Maintenant, fournissez la liste contenant les phrases. Nous avons trois phrases dans notre liste - doc_list = [ "Bonjour, comment allez-vous? ", "Comment allez-vous? ", "Hey que faites-vous? oui vous Que faites-vous? "] Ensuite, faites la tokenisation des phrases comme suit - doc_tokenized = [ simple_preprocess (doc) pour doc dans doc_list] Créez un objet de corpora.Dictionary () comme suit - dictionary = corpora.Dictionary () Passez maintenant ces phrases tokenisées à l"objet dictionary.doc2bow () comme suit - BoW_corpus = [dictionary.doc2bow (doc, allow_update = True) pour doc dans doc_tokenized] Ensuite, nous obtiendrons les identifiants de mot et leurs fréquences dans nos documents. for doc in BoW_corpus: print ([[dictionary [id], freq] for id, freq in doc]) Output [[ "are ", 1], [ "hello ", 1], [ "how ", 1], [ "you ", 1]] [[ "how ", 1], [ "you ", 1], [ "do ", 2]] [[ "are ", 2], [" vous ", 3], [" faire ", 2], [" hey ", 1], [" what ", 2], [" yes ", 1]] De cette façon, nous avons formé notre corpus (corpus Bag-of-Word). Ensuite, nous devons appliquer ce corpus entraîné dans le modèle tfidf models.TfidfModel () . Importez d"abord le package numpay - import numpy as np Appliquez maintenant notre corpus formé (BoW_corpus) entre les crochets de models.TfidfModel() tfidf = models.TfidfModel (BoW_corpus, smartirs = "ntc ") Ensuite, nous obtiendrons les identifiants de mot et leurs fréquences dans notre corpus modélisé tfidf - pour doc dans tfidf [BoW_corpus]: impression ([[dictionnaire [id], np. around (freq, decomal = 2)] pour id, freq dans doc]) Sortie [[ "are ", 0.33] , [ "bonjour ", 0.89], [ "comment ", 0.33]] [[ "how ", 0.18], [ "do ", 0.98]] [[ "are ", 0.23], [ "faire ", 0.62], [ "hey ", 0.31], [ "what ", 0.62], [ "yes ", 0.31]] [[ "are " , 1], [ "bonjour ", 1], [ "comment ", 1], [ "vous ", 1]] [[ "comment ", 1], [ "vous ", 1], [" do ", 2]] [[" are ", 2], [" you ", 3], [" doing ", 2], [" hey ", 1], [" what ", 2], [" yes ", 1]] [[" are ", 0.33], [" hello ", 0.89], [" comment ", 0,33]] [[" comment ", 0,18], [" faire ", 0,98]] [[" sont ", 0,23], [" faire ", 0,62], [ "hey ", 0.31], [ "what ", 0.62], [ "yes ", 0.31]] À partir des sorties ci-dessus, nous voyons la différence dans les fréquences des mots dans nos documents. Exemple d’implémentation complet import gensim import pprint depuis gensim import corp à partir gensim.utils import simple_preprocess doc_list = [ "Bonjour , comment vas-tu? ", " Comment allez-vous? ", " Hé quoi tu es entrain de faire? oui vous Que faites-vous? "] doc_tokenized = [simple_preprocess (doc) pour doc dans doc_list] dictionary = corpora.Dictionary () BoW_corpus = [dictionary.doc2bow (doc, allow_update = True) pour doc dans doc_tokenized] pour doc dans BoW_corpus: print ([[dictionary [id], freq] for id, freq in doc]) import numpy as np tfidf = models.TfidfModel (BoW_corpus, smartirs = "ntc ") pour doc dans tfidf [BoW_corpus]: print ([[dictionary [id], np.around (freq, decomal = 2)] pour id, freq in doc]) Différence de poids des mots Comme indiqué ci-dessus, les mots qui apparaîtront le plus fréquemment dans le document auront les poids les plus petits. Comprenons la différence de poids des mots à partir des deux résultats ci-dessus. Le mot "sont" apparaît dans deux documents et a été pondéré De même, le mot "vous" apparaissant dans tous les documents et complètement supprimé. Gensim - Modélisation de sujets Ce chapitre traite de la modélisation de sujets avec salutations à Gensim. Pour annoter nos d ata et comprendre la structure des phrases, l"une des meilleures méthodes consiste à utiliser des algorithmes linguistiques informatiques. Sans aucun doute, avec l"aide de ces algorithmes linguistiques informatiques, nous pouvons comprendre quelques détails plus fins sur nos données, mais, Peut-on savoir quel type de mots apparaît plus souvent que d"autres dans notre corpus? Pouvons-nous regrouper nos données? Pouvons-nous être des thèmes sous-jacents dans nos données ? Nous pourrions réaliser tout cela avec l"aide de la modélisation de sujets. Examinons donc en profondeur le concept des modèles de sujets. Que sont les modèles de sujets? Un modèle de sujet peut être défini comme le modèle probabiliste contenant des informations sur les sujets de notre texte. Mais ici, deux questions importantes se posent qui sont les suivantes - Premièrement, qu"est-ce qu"un sujet exactement? Le sujet, comme son nom l"indique, est des idées sous-jacentes ou les thèmes représentés dans notre texte. Pour vous donner un exemple, le corpus contenant articles de journaux aurait les sujets liés à la finance, la météo, la politique, les sports, l’actualité de et ainsi de suite. Deuxièmement, quelle est l’importance des modèles de sujets dans le traitement de texte? Comme nous le savons, dans Afin d"identifier la similitude dans le texte, nous pouvons faire des techniques de recherche d"informations et de recherche en utilisant des mots. Mais, avec l"aide de modèles de sujets, nous pouvons maintenant rechercher et organiser nos fichiers texte en utilisant des sujets plutôt que des mots. En ce sens, nous pouvons dire que les sujets sont la distribution probabiliste des mots. C"est pourquoi, en utilisant des modèles de sujets, nous pouvons décrire nos documents comme des distributions probabilistes de sujets. Objectifs des modèles de sujets Comme indiqué ci-dessus, la modélisation de sujets se concentre sur le sous-jacent idées et thèmes. Ses principaux objectifs sont les suivants - Les modèles de thèmes peuvent être utilisés pour la synthèse de texte. Ils peuvent être utilisés pour organiser les documents. Par exemple, nous pouvons utiliser la modélisation de sujets pour regrouper des articles d"actualité dans un n section organisée / interconnectée telle que l"organisation de tous les articles de presse liés au cricket. Ils peuvent améliorer les résultats de recherche. Comment? Pour une requête de recherche, nous pouvons utiliser des modèles de sujets pour révéler le document contenant un mélange de mots-clés différents, mais qui concernent la même idée. Le concept de recommandations est très utile pour le marketing . Il est utilisé par Algorithmes de modélisation de sujet dans Gensim Sans aucun doute, Gensim est la boîte à outils de modélisation de sujet la plus populaire. Sa disponibilité gratuite et être en Python le rendent plus populaire. Dans cette section, nous discuterons de certains algorithmes de modélisation de sujets les plus populaires. Ici, nous nous concentrerons sur «quoi» plutôt que sur «comment» car Gensim les résume très bien pour nous. Allocation de Dirichlet Latent (LDA) L"allocation de Dirichlet Latent (LDA) est la technique la plus courante et la plus populaire actuellement utilisée pour la modélisation de sujets. C"est celui que les chercheurs de Facebook ont ​​utilisé dans leur article de recherche publié en 2013. Il a été proposé pour la première fois par David Blei, Andrew Ng et Michael Jordan en 2003. Ils ont proposé LDA dans leur article intitulé simplement Allocation de Dirichlet Latent . Caractéristiques de LDA En savoir plus sur cette merveilleuse technique à travers ses caractéristiques - Technique de modélisation probabiliste de thèmes LDA est une technique de modélisation probabiliste de thèmes. Comme nous l"avons mentionné ci-dessus, dans la modélisation de sujets, nous supposons que dans toute collection de documents interdépendants (il peut s"agir d"articles universitaires, d"articles de journaux, de publications Facebook, de Tweets, de courriers électroniques, etc.), il existe des combinaisons de sujets inclus dans chaque document. . Le principal objectif de la modélisation de sujets probabilistes est de découvrir la structure de sujets cachés pour la collection de documents interdépendants . Les trois éléments suivants sont généralement inclus dans une structure de sujet - Sujets Distribution statistique des sujets parmi les documents Mots dans un document comprenant le sujet Travailler de manière non supervisée LDA fonctionne de manière non supervisée. C"est parce que LDA utilise des probabilités conditionnelles pour découvrir la structure de rubrique cachée. Cela suppose que les sujets sont inégalement répartis dans la collection de documents interdépendants. Très facile à créer dans Gensim Dans Gensim, c"est très facile pour créer un modèle LDA. nous avons juste besoin de spécifier le corpus, le mappage du dictionnaire et le nombre de sujets que nous aimerions utiliser dans notre modèle. Model = models.LdaModel (corpus, id2word = dictionary, num_topics = 100) Peut être confronté à un problème insoluble sur le plan informatique Le calcul de la probabilité de chaque structure de sujet possible est un défi de calcul auquel LDA est confronté. C’est un défi car il doit calculer la probabilité de chaque mot observé sous chaque structure de sujet possible. Si nous avons un grand nombre de sujets et de mots, LDA peut faire face à un problème insoluble du point de vue du calcul. Latent Semantic Indexing (LSI) Les algorithmes de modélisation de sujets qui ont été implémentés pour la première fois dans Gensim avec L"allocation de dirichlet latente (LDA) est une indexation sémantique latente (LSI) . Elle est également appelée Analyse sémantique latente (LSA) . Elle a été brevetée en 1988 par Scott Deerwester, Susan Dumais, George Furnas, Richard Harshman, Thomas Landaur, Karen Lochbaum et Lynn Streeter. Dans cette section, nous allons configurer notre modèle LSI. Cela peut être fait de la même manière que pour la configuration du modèle LDA. il faut importer le modèle LSI depuis gensim.models. Rôle de LSI En fait, LSI est une technique NLP, en particulier dans la sémantique distributionnelle. Il analyse la relation entre un ensemble de documents et les termes ces documents co ntain. Si nous parlons de son fonctionnement, alors il construit une matrice qui contient le nombre de mots par document à partir d"un gros morceau de texte. Une fois construit, pour réduire le nombre de lignes, le modèle LSI utilise une technique mathématique appelée singulier décomposition des valeurs (SVD). En plus de réduire le nombre de lignes, il préserve également la structure de similitude entre les colonnes. Dans la matrice, les lignes représentent des mots uniques et les colonnes représentent chaque document. Il fonctionne sur la base d"une hypothèse de distribution, c"est-à-dire qu"il suppose que les mots dont le sens est proche apparaîtront dans le même type de texte. Model = models.LsiModel (corpus, id2word = dictionnaire, num_topics = 100) Processus de Dirichlet Hiérarchique (HDP) Les modèles de sujets tels que LDA et LSI aident à résumer et à organiser de grandes archives de textes qu"il n"est pas possible d"analyser à la main . Outre LDA et LSI, un autre modèle de sujet puissant dans Gensim est HDP (Hierarchical Dirichlet Process). Il s’agit essentiellement d’un modèle à composition mixte pour l’analyse non supervisée de données groupées. Contrairement à LDA (son équivalent fini), HDP déduit le nombre de sujets à partir des données. Model = models.HdpModel (corpus, id2word = dictionary Gensim - Création d"un modèle de sujet LDA Ce chapitre vous aidera à apprendre à créer un modèle de sujet d"allocation de Dirichlet latent (LDA) dans Gensim. Extraction automatique d"informations sur des sujets à partir d"un grand volume de textes dans l"une des principales applications de la PNL (traitement du langage naturel). Un grand volume de textes peut provenir de critiques d"hôtels, de tweets, de publications Facebook, de flux provenant de tout autre canal de médias sociaux, de critiques de films, de reportages, de commentaires d"utilisateurs, mails, etc. À l"ère numérique, savoir de quoi parlent les gens / clients, comprendre leurs opinions et leurs problèmes peut être très précieux pour les entreprises, les campagnes politiques et les administrateurs. possible de lire manuellement ces grands volumes de texte puis extraire les informations des sujets? Non, ce n"est pas le cas. Il nécessite un algorithme automatique capable de lire ce grand volume de documents texte et d"en extraire automatiquement les informations / sujets dont il a été question. Rôle de LDA L"approche de LDA en matière de modélisation des pour classr le texte d"un document dans un sujet particulier. Modélisés comme des distributions Dirichlet, LDA construit - Un sujet par modèle de document et Mots par modèle de sujet Après avoir fourni l"algorithme de modèle de sujet LDA, afin d"obtenir une bonne composition de la distribution des mots-clés de sujet, il réorganise - Les distributions de sujets dans le document et Répartition des mots-clés dans les rubriques Lors du traitement, certaines des hypothèses formulées par LDA sont - Chaque document est modélisé comme des distributions multi-nominales de sujets. Chaque sujet est modélisé comme des distributions multi-nominales de mots. Nous devrions avoir à choisir la bonne corpus de données, car LDA suppose que chaque morceau de texte contient les mots associés. LDA suppose également que les documents sont produits à partir d"un mélange de rubriques. Implémentation avec Gensim Ici, nous allons utiliser LDA (Latent Dirichlet Allocation) pour extraire le topi naturellement discuté cs à partir de l"ensemble de données. Chargement de l"ensemble de données L"ensemble de données que nous allons utiliser est l"ensemble de données de «20 groupes de discussion» contenant des milliers d"articles de différentes sections d"un reportage. Il est disponible dans les ensembles de données Sklearn . Nous pouvons facilement télécharger à l"aide du Python suivant - depuis sklearn.datasets import fetch_20newsgroups newsgroups_train = fetch_20newsgroups (subset = "train ") Regardons quelques exemples de nouvelles à l"aide du suivant - newsgroups_train.data [: 4] [" De: lerxst@wam.umd.edu (où est mon truc) nSubject: QUELLE voiture est-ce!? nNntp-Posting-Host: rac3.wam.umd.edu nOrganisation: Université du Maryland, College Park nLignes: 15 n n Je me demandais si quelqu"un pouvait m"éclairer sur cette voiture que j"ai vue nl"autre jour. C"était une voiture de sport à 2 portes, qui semblait être de la fin des années 60 / presque 70. Cela s"appelait un Bricklin. Les portes étaient vraiment petites. De plus, nle pare-chocs avant était séparé du reste de la carrosserie. C"est n tout ce que je sais. Si quelqu"un peut me dire le nom du modèle, les spécifications du moteur, les années nde production, le lieu de fabrication de cette voiture, son histoire ou toute autre information que vous navoir sur cette voiture à l"allure géniale, veuillez envoyer un e-mail. n nMerci, n- IL n ---- présenté par votre quartier Lerxst ---- n n n n n ", " De: guykuo@carson.u .washington.edu (Guy Kuo) nObjet: Sondage d"horloge SI - Appel final nRésumé: Appel final pour les rapports d"horloge SI nMots clés: SI, accélération, horloge, mise à niveau nID de l"article: shelley.1qvfo9INNc3s nOrganisation: Université de Washington nLignes: 11 nNNTP-Posting-Host: carson.u.washington.edu n nUn bon nombre d"âmes courageuses qui ont amélioré leur oscillateur d"horloge SI ont npartagé leurs expériences pour cela sondage. Veuillez envoyer un bref message détaillant nvos expériences avec la procédure. Vitesse maximale atteinte, vitesse nominale du processeur, najout de cartes et d"adaptateurs, dissipateurs de chaleur, heure d"utilisation par jour, disquette nfonctionnalité avec 800 et 1,4 m de disquettes sont particulièrement demandées. n nJe résumerai dans les deux prochains jours, veuillez donc ajouter à la base de nconnaissances du réseau si vous avez effectué la mise à jour de l’horloge et que vous n’avez pas répondu à cette npoll. Merci. n nGuy Kuo <; guykuo@u.washington.p> n ", "De: twillis@ec.ecn.purdue.edu (Thomas E Willis) nSubjet: questions PB. .. nOrganisation: Purdue University Engineering Computer Network nDistribution: États-Unis nLignes: 36 n nbien les gars, mon mac plus a finalement abandonné le fantôme ce week-end après nle début de la vie comme 512k way back in 1985. sooo, je suis dans le marke pour une nnouvelle machine un peu plus tôt que je ne l’avais prévu ... n ni ) quelqu"un peut répondre: n n * est-ce que quelqu"un sait quand la prochaine série de powerbook nintroductions est prévue? j " , je me demandais si quelqu"un avait nplus d"infos ... n n * quelqu"un a-t-il entendu des rumeurs sur les baisses de prix de la ligne powerbook comme les nones que le duo vient de subir récemment ? n n * quelle "est l"impression de l"écran sur le 180? je pourrais probablement balancer na 180 si j’ai le disque de 80 Mo plutôt que le 120, mais je n’ai pas vraiment la moindre idée de l’amélioration de l’écran (oui, il est superbe dans le nstore, mais est-ce que tout "wow " ou est-ce vraiment si bon?). puis-je solliciter ndes opinions de personnes qui utilisent quotidiennement les 160 et 180 si cela vaut la peine de nprendre la taille du disque et l"argent nécessaire pour obtenir l"affichage actif? (Je me rends compte que c"est une vraie question subjective, mais je n"ai joué qu"avec les nmachines dans un magasin d"informatique rapidement et j"ai pensé que les opinions de quelqu"un nqui utilise réellement la machine quotidiennement pourraient s"avérer utiles) . n n * Quelle est la performance des Hellcats? ;) n nMerci d"avance pour toute information - si vous pouviez envoyer un e-mail, je publierai un nsumé (le temps de lecture des actualités est limité avec des finales juste autour du ncorner .. .: () n - nTom Willis twillis@ecn.purdue.edu Purdue Electrical Engineering n ---------------- -------------------------------------------------- --------- n "Les condamnations sont des ennemis plus dangereux de la vérité que les mensonges. " - FW nNietzsche n ", " De: jgreen @ amber (Joe Green) nSubjet: Re: Weitek P9000? nOrganisation: Harris Computer Systems Division nLignes: 14 nDistribution: monde nNNTP-Posting-Host: amber.ssd.csd.harris.com nX-Newsreader: TIN [ ve rsion 1.1 PL9] n nRobert JC Kyanko (rob@rjck.UUCP) a écrit: p> abraxis@iastate.edu écrit dans l"article 734340159@class1.iastate.p>: p>> Quelqu"un connaît la puce graphique Weitek P9000? p> En ce qui concerne les éléments de bas niveau, elle est plutôt jolie. Il "a cette p> commande de remplissage quadrilatère qui ne nécessite que les quatre points. n nAvez-vous l’adresse / le numéro de téléphone de Weitek? Je "aimerais obtenir des informations nsur cette puce. n n - nJoe Green t t t tHarris Corporation njgreen@csd.harris. com t t tDivision des systèmes informatiques n "La seule chose qui me fait vraiment peur, c"est une personne sans sens de l"humour. " n t t t t t t-- Jonathan Winters n "] Prérequis Nous avons besoin de Stopwords de NLTK et d"un modèle anglais de Scapy. Les deux peuvent être téléchargés comme suit - import nltk; nltk.download ( "stopwords ") nlp = spacy.load ( "en_core_web_md ", disable = [ "parser ", "ner "]) Importation des packages nécessaires Afin de construire le modèle LDA, nous devons importer le package nécessaire suivant - import re import numpy as np import pandas as pd from pprint import pprint import gensim importer gensim.corpora sous forme de corpus depuis gensim.utils importer simple_preprocess depuis gensim.models importer CoherenceModel importer spacy importer pyLDAvis importer pyLDAvis.gensim importer matplotlib.pyplot comme plt Préparer des mots vides Maintenant, nous devons importer les mots d"arrêt et les utiliser - from nltk.corpus import stopwords stop_words = stopwords.words ( "anglais ") stop_words.extend ([ " from ", " subject ", " re ", " edu ", " use "]) Nettoyez le texte Maintenant, avec à l"aide du simple_preprocess () de Gensim, nous devons segmenter chaque phrase en une liste de mots. Nous devons également supprimer les ponctuations et les caractères inutiles. Pour ce faire, nous allons créer une fonction nommée sent_to_words () - def sent_to_words (phrases): pour la phrase dans les phrases: yield (gensim.utils.simple_preprocess (str (phrase), deacc = True)) data_words = list (sent_to_words (données)) Construire des modèles Bigram & Trigram Comme nous le savons, les bigrammes sont deux mots qui apparaissent fréquemment ensemble dans le document et les trigrammes sont trois mots qui apparaissent fréquemment ensemble dans le document. Avec l"aide de Gensim Phrases modèle, nous pouvons le faire - bigram = gensim.models.Phrases (data_words, min_count = 5, threshold = 100) trigram = gensim. models.Phrases (bigram [data_words], threshold = 100) bigram_mod = gensim.models.phrases.Phraser (bigram) trigram_mod = gensim.models.phrases.Phraser (trigram) Filtrer les mots vides Ensuite, nous devons filtrer les mots vides. Parallèlement à cela, nous allons également créer des fonctions pour créer des bigrammes, des trigrammes et pour la lemmatisation - def remove_stopwords ( textes): re turn [[mot pour mot dans simple_preprocess (str (doc)) si mot pas dans stop_words] pour doc dans les textes] def make_bigrams (textes): return [bigram_mod [doc] pour doc dans les textes] def make_trigrams (textes): return [ trigram_mod [bigram_mod [doc]] pour doc dans les textes] def lemmatization (textes, allowed_postags = [ "NOUN ", "ADJ ", "VERB ", "ADV "]): textes_out = pour les textes envoyés: doc = nlp ( ". join (sent)) text_out.append ([token.lemma_ pour token dans doc si token.pos_ in allowed_postags]) return textes_out Building Dictionary & Corpus for Topic Model Nous devons maintenant construire le dictionnaire et le corpus. Nous l"avons également fait dans les exemples précédents - id2word = corpora.Dictionary (data_lemmatized) text = data_lemmatized corpus = [id2word.doc2bow (text) for text in text] Construction d"un modèle de sujet LDA Nous avons déjà implémenté tout ce qui est nécessaire pour entraîner le modèle LDA. Il est maintenant temps de créer le modèle de sujet LDA. Pour notre exemple d"implémentation, cela peut être fait à l"aide de la ligne de codes suivante - lda_model = gensim.models.ldamodel.LdaModel (corpus = corpus, id2word = id2word, num_topics = 20, random_state = 100, update_every = 1, chunksize = 100, passes = 10, alpha = "auto ", per_word_topics = True) Exemple d"implémentation Voyons l"exemple d"implémentation complet pour construire un modèle de sujet LDA - import re import numpy as np import pandas as pd from pprint import pprint import gensim import gensim.corpora as corp from gensim.utils import simple_preprocess from gensim.models import CoherenceModel import spacy import pyLDAvis import pyLDAvis.gensim import matplotlib.pyplot as plt from nltk.corpus import stopwords stop_words = stopwords.words ( "anglais ") stop_words.extend ([ "from ", " subject ", " re ", " edu ", " use "]) from sklearn.datasets import fetch_20newsgroups newsgroups_train = fetch_20newsgroups (subset = " train ") data = newsgroups_ train.data data = [re.sub ( " S * @ S * s? ", "", sent) pour les données envoyées] data = [re.sub ( " s + ", " ", envoyé) pour les données envoyées] data = [re.sub ( "" ", ", envoyé) pour les données envoyées] print (data_words [: 4]) #it imprimera les données après avoir préparé les mots vides bigram = gensim.models.Phrases (data_words, min_count = 5, threshold = 100) trigram = gensim.models.Phrases (bigram [data_words], threshold = 100) bigram_mod = gensim.models.phrases.Phraser (bigramme) trigram_mod = gensim.models.phrases.Phraser (trigramme) def remove_stopwords (textes): return [[mot pour mot dans simple_preprocess (str (doc)) si mot pas dans stop_words] pour doc dans les textes] def make_bigrams (textes): return [bigram_mod [doc] pour doc dans les textes] def make_trigrams (textes): [trigram_mod [bigram_mod [doc]] pour doc dans les textes] def lemmatisation (textes, allowed_postags = [ "NOUN ", " ADJ ", " VERB ", " ADV "]): text_out = pour les textes envoyés: doc = nlp ( ". Join (envoyé)) text_out.append ( [token.lemma_ pour token dans doc si token.pos_ dans allowed_postags]) r eturn textes_out data_words_nostops = remove_stopwords (data_words) data_words_bigrams = make_bigrams (data_words_nostops) nlp = spacy.load ( "en_core_web_md ", disable = [ "parser ", "ner "]) data_lemigmatizedsem = lemotas_données [ "NOUN ", "ADJ ", "VERB ", "ADV "]) print (data_lemmatized [: 4]) #it imprimera les données lemmatisées. id2word = corpora.Dictionary (data_lemmatized) textes = data_lemmatized corpus = [id2word.doc2bow (texte) pour le texte dans les textes] print (corpus [: 4]) # il affichera le corpus que nous avons créé ci-dessus. [[(id2word [id], freq) pour id, freq dans cp] pour cp dans le corpus [: 4]] # il affichera les mots avec leurs fréquences. lda_model = gensim.models.ldamodel.LdaModel (corpus = corpus, id2word = id2word, num_topics = 20, random_state = 100, update_every = 1, chunksize = 100, passes = 10, alpha = "auto ", per_word_topics = True) Nous pouvons maintenant utiliser le modèle LDA créé ci-dessus pour obtenir les sujets, pour calculer la Perplexité du modèle. Gensim - Utilisation du modèle de sujet LDA Dans ce chapitre, nous comprendrons comment utiliser le modèle de sujet d"allocation de dirichlet latent (LDA). Affichage des sujets dans le modèle LDA Le modèle LDA (lda_model) que nous avons créé ci-dessus peut être utilisé pour afficher le sujets des documents. Cela peut être fait avec l"aide du suivant - pprint (lda_model.print_topics ()) doc_lda = lda_model [corpus] Output [(0, "0.036 * "go " + 0.027 * "get " + 0.021 * "time " + 0.017 * "back " + 0,015 * "bien " + "" 0,014 * "beaucoup " + 0,014 * "être " + 0,013 * "voiture " + 0,013 * "bien " + 0,013 * "année " "), (1, " 0,078 * " écran "+ 0,067 * " vidéo "+ 0,052 * " caractère "+ 0,046 * " normal "+ "" 0,045 * "souris " + 0,034 * "gestionnaire " + 0,034 * "maladie " + 0,031 * "processeur " + "" 0,028 * "excuse " + 0,028 * "choix " " ), (2, "0,776 * "ax " + 0,079 * "_ " + 0,011 * "garçon " + 0,008 * "ticket " + 0,006 * "rouge " + " "0,004 * "conservateur " + 0,004 * "culte " + 0,004 * "incroyable " + 0,003 * "coureur "+ "" 0,003 * " environ " "), (3, " 0,086 * " saison "+ 0,078 * " fan "+ 0,072 * " réalité "+ 0,065 * " commerce "+ "" 0,045 * " concept "+ 0,040 * " stylo "+ 0,028 * " coup "+ 0,025 * " améliorer "+ "" 0,025 * " cap "+ 0,021 * " pingouin " "), (4, " 0,027 * " groupe "+ 0,023 * " problème "+ 0,016 * " cas "+ 0,016 * " cause "+ "" 0,014 * "état " + 0,012 * "entier " + 0,012 * "support " + 0,011 * "gouvernement " + "" 0,010 * "année " + 0,010 * "taux " "), (5, " 0,133 * "preuves " + 0,047 * "croire " + 0,044 * "religion " + 0,042 * "croyance " + "" 0,041 * "sens " + 0,041 * "discussion " + 0,034 * "athée " + 0,030 * "conclusion " + "" 0,029 * "expliquer " + 0,029 * "réclamation " "), (6, " 0,083 * " espace "+ 0,059 * " science "+ 0,031 * " lancement "+ 0,030 * " terre "+ "" 0,026 * " route "+ 0,024 * " orbite "+ 0,024 * " scientifique "+ 0,021 * " mission "+ "" 0,018 * " avion "+ 0,017 * " satellite " ") , (7, "0,065 * "fichier " + 0,064 * "programme " + 0,048 * "carte " + 0,041 * "fenêtre " + " "0,038 * "pilote " + 0,037 * "logiciel " + 0,034 * "ru n "+ 0,029 * " machine "+ "" 0,029 * " entrée "+ 0,028 * " version " "), (8, " 0,078 * " publier "+ 0,059 * "montage " + 0,050 * "turc " + 0,043 * "arménien " + "" 0,027 * "occidental " + 0,026 * "russe " + 0,025 * "localiser " + 0,024 * "continue " + "" 0,024 * "électrique " + 0,022 * "terrorisme " "), (9, " 0,023 * "personnes " + 0,023 * "enfant "+ 0,021 * " tuer "+ 0,020 * " homme "+ 0,019 * " mort " "" + 0,015 * " mourir "+ 0,015 * " vivre "+ 0,014 * " attaque "+ 0,013 * " âge "+ "" 0,011 * " église " "), (10, " 0,092 * " cpu "+ 0,085 * " noir "+ 0,071 * "contrôleur " + 0,039 * "blanc " + "" 0,028 * "eau " + 0,027 * "froid " + 0,025 * "solide " + 0,024 * "froid " + 0,024 * "chaleur " "" + 0,023 * "nucléaire " "), (11, " 0,071 * "moniteur " + 0,044 * "boîte " + 0,042 * "option "+ 0,041 * " générer "+ "" 0,038 * " vote "+ 0,032 * " batterie "+ 0,029 * " vague "+ 0,026 * " tradition "+ "" 0,026 * "assez " + 0,025 * "tâche " "), (12, " 0,048 * "envoyer " + 0,045 * "mail " + 0,036 * "liste " + 0,033 * "inclure " + "" 0,032 * "prix " + 0,031 * "adresse " + 0,027 * "email " + 0,026 * "recevoir " + "" 0,024 * "livre " + 0,024 * "vendre " "), (13, " 0,515 * "lecteur " + 0,052 * "laboratoire " + 0,042 * "aveugle " + 0,020 * "investissement " + "" 0,011 * "créature " + 0,010 * "boucle "+ 0,005 * " dialogue "+ 0,000 * " esclave "+ "" 0,000 * " cavalier "+ 0,000 * " secteur " "), (14, " 0,153 * " patient "+ 0,066 * " traitement "+ 0,062 * " imprimante "+ 0,059 * " médecin "+ "" 0,036 * " médical "+ 0,031 * " énergie "+ 0,029 * "étude " + 0,029 * "sonde " + "" 0,024 * "mph " + 0,020 * "médecin " "), (15, " 0,068 * "loi " + 0,055 * "arme " + 0,039 * "gouvernement " + 0,036 * "droite " + "" 0,029 * "état " + 0,026 * "drogue " + 0,022 * "crime "+ 0,019 * " personne "+ "" 0,019 * " citoyen "+ 0,019 * " arme " "), (16, " 0,107 * " équipe "+ 0,102 * " jeu "+ 0,078 * " jouer "+ 0,055 * " win "+ 0,052 * " joueur "+ "" 0,051 * " année "+ 0,030 * " score "+ 0,025 * "objectif " + 0,023 * "aile " + 0,023 * "exécuter " "), (17, " 0,031 * "dire " + 0,026 * "penser " + 0,022 * " personnes "+ 0,020 * " faire "+ 0,017 * " voir "+ "" 0,016 * "savoir " + 0,013 * "venir " + 0,013 * "même " + 0,013 * "chose " + 0,013 * "donner " "), (18, "0,039 * "système " + 0,034 * "utiliser " + 0,023 * "clé " + 0,016 * "bit " + 0,016 * "aussi " + " "0,015 * " informations "+ 0,014 * " source "+ 0,013 * " puce "+ 0,013 * " disponible "+ "" 0,010 * " fournir " "), (19, " 0,085 * "ligne " + 0,073 * "écriture " + 0,053 * "article " + 0,046 * "organisation " + "" 0,034 * "hôte " + 0,023 * "être " + 0.023 * "know " + 0.017 * "thank " + 0.016 * "want " + "" 0.014 * "help " ")] Perplexité du modèle de calcul Le modèle LDA (lda_model) que nous avons créé ci-dessus peut être utilisé pour calculer la perplexité du modèle, c"est-à-dire la qualité du modèle. Plus le score est bas, meilleur sera le modèle. Cela peut être fait à l"aide du suivant - print ( " nPerplexity: ", lda_model.log_perplexity (corpus)) Sortie Perplexité: -12,338664984332151 Calcul du score de cohérence Th Le modèle LDA (lda_model) que nous avons créé ci-dessus peut être utilisé pour calculer le score de cohérence du modèle, c"est-à-dire la moyenne / médiane des scores de similarité de mots par paires des mots du sujet. Cela peut être fait avec l"aide du suivant - cohérence_model_lda = CoherenceModel (model = lda_model, textes = data_lemmatized, dictionary = id2word, cohérence = "c_v ") cohérence_lda = cohérence_model_lda.get_coherence () print ( " nCoherence Score: ", cohérence_lda) Sortie Coherence Score: 0.510264381411751 Visualisation des thèmes-mots-clés Le modèle LDA (lda_model) que nous avons créé ci-dessus peut être utilisé pour examiner les rubriques produites et les mots-clés associés. Il peut être visualisé en utilisant le package pyLDAvis comme suit - pyLDAvis.enable_notebook () vis = pyLDAvis.gensim.prepare (lda_model, corpus, id2word) vis Sortie D"après la sortie ci-dessus, les bulles sur le côté gauche représentent un sujet et plus la bulle est grande, plus ce sujet est répandu. Le modèle de sujet sera bon si le modèle de sujet a de grandes bulles non superposées dispersées dans le graphique. Gensim - Création d"un modèle de maillet LDA Ce chapitre explique ce qu"est un latent Modèle de mallet d"allocation de Dirichlet (LDA) et comment le créer dans Gensim. Dans la section précédente, nous avons implémenté le modèle LDA et récupérons les sujets à partir de documents de l"ensemble de données 20Newsgroup. C"était la version intégrée de Gensim de l"algorithme LDA. Il existe également une version Mallet de Gensim, qui offre une meilleure qualité des sujets. Ici, nous allons appliquer le LDA de Mallet sur l"exemple précédent que nous avons déjà implémenté. Qu"est-ce que le modèle LDA Mallet? Mallet, une boîte à outils open source, a été écrit par Andrew McCullum . C"est fondamentalement un Package basé sur Java qui est utilisé pour la NLP, la classification de documents, la mise en cluster, la modélisation de sujets et de nombreuses autres applications d"apprentissage automatique au texte. Il nous fournit la boîte à outils de modélisation de sujet Mallet qui contient des implémentations efficaces et basées sur l"échantillonnage de LDA ainsi que de LDA hiérarchique. Mallet2.0 est la version actuelle de MALLET, la boîte à outils de modélisation de sujet java. Avant de commencer à l"utiliser avec Gensim pour LDA, nous devons télécharger le paquet mallet-2.0.8.zip sur notre système et le décompresser. Une fois installé et décompressé, définissez la variable d"environnement% MALLET_HOME% sur le point vers le répertoire MALLET, soit manuellement, soit par le code que nous fournirons, lors de l"implémentation de la LDA avec Mallet ensuite. Gensim Wrapper Python fournit un wrapper Gensim pour l"allocation de dirichlets latents (LDA). La syntaxe de ce wrapper est gensim.models.wrappers.LdaMallet . Ce module, échantillonnage de gibbs réduit de MALLET, permet l"estimation du modèle LDA à partir d"un corpus d"entraînement et l"inférence de la distribution des sujets sur de nouveaux documents non vus également. Exemple d"implémentation Nous allons utiliser LDA Mallet sur le modèle LDA précédemment construit et vérifiera la différence de performances en calculant le score de Coherence. Fournir le chemin vers le fichier Mallet Avant d"appliquer le modèle Mallet LDA sur notre corpus construit dans l"exemple précédent , nous devons mettre à jour les variables d"environnement et fournir également le chemin du fichier Mallet. Cela peut être fait avec l"aide du code suivant - import os de gensim.models.wrappers import LdaMallet os.environ.update ({ "MALLET_HOME ": r "C: /mallet-2.0.8/ "}) # Vous devez mettre à jour ce chemin en fonction du chemin du répertoire Mallet sur votre système. mallet_path = r "C: /mallet-2.0.8/bin/mallet " # Vous devez mettre à jour ce chemin selon le chemin du répertoire Mallet sur votre système. Une fois que nous avons fourni le chemin du fichier Mallet, nous pouvons maintenant l"utiliser sur le corpus. Cela peut être fait à l"aide de la fonction ldamallet.show_topics () comme suit - ldamallet = gensim.models.wrappers.LdaMallet (mallet_path, corpus = corpus, num_topics = 20, id2word = id2word) pprint (ldamallet.show_topics (formatted = Faux)) Sortie [(4, [( "gun ", 0.024546225966016102), ( "law ", 0.02181426826996709) , ( "état ", 0.017633545129043606), ( "people ", 0.017612848479831116), ( "case ", 0.011341763768445888), ( "crime ", 0.010596684396796159), ( "arme ", 0.00985160502514643) , ( "personne ", 0,008671896020034356), ( "arme à feu ", 0,00838214293105946), ( "police ", 0,008257963035784506)]), (9, [( "fabriquer ", 0,02147966482730431), ( " people ", 0.021377478029838543), (" work ", 0.018557122419783363), (" money ", 0.016676885346413244), (" year ", 0.015982015123646026), (" job "", 0.012221540976905783), ( pay ", 0.010239117106069897), (" time ", 0.008910688739014919), (" school ", 0.0079092581238504), (" support ", 0.007357449417535254)]), (14, [(" power "", 0,0184283 98507941996), ( "line ", 0.013784244460364121), ( "high ", 0.01183271164249895), ( "work ", 0.011560979224821522), ( "ground ", 0.010770484918850819), ( "current ", 0.010745781971789235), ( "wire ", 0.008399002000938712), ( "low ", 0.008053160742076529), ( "water ", 0.006966231071366814), ( "run ", 0.006892122230182061)]), (0, [( "people ", 0.025218349201353372), ( "kill ", 0.01500904870564167), ( "child ", 0.013612400660948935), ( "armenian ", 0.010307655991816822), ( "woman " ", 0.010287984892595798) "start ", 0.01003226060272248), ( "day ", 0.00967818081674404), ( "occur ", 0.009383114328428673), ( "Leave ", 0.009383114328428673), ( "fire ", 0.009009363443229208)] , (1, [( "file ", 0.030686386604212003), ( "program ", 0.02227713642901929), ( "window ", 0.01945561169918489), ( "set " ", 0.015914874783314277), (" ligne ", 0.013831003577619592), (" display ", 0.013794120901412606), (" application ", 0.012576992586582082), (" entry ", 0.009275993066056873), (" change ", 0.008722752922952 09), ( "color ", 0.008612104894331132)]), (12, [( "line ", 0.07153810971508515), ( "buy ", 0.02975597944523662), ( "organization " ", 0.026877236406682988), ( "host ", 0.025451316957679788), ( "price ", 0.025182275552207485), ( "sell ", 0.02461728860071565), ( "mail ", 0.02192687454599263), ( "good " ", 0.018967419085797303), ( "vente ", 0.017998870026097017), ( "send ", 0.013694207538540181)]), (11, [( "thing ", 0.04901329901329901), ( "good " ", 0.0376018876018876), (" make ", 0.03393393393393394), (" time ", 0.03326898326898327), (" bad ", 0.02664092664092664), (" occur ", 0.017696267696267698), (" hear ", 0.015615615615615615), (" hear "", 0.015615615615615615), ( ", 0.015465465465465466), (" retour ", 0.015143715143715144), (" lot ", 0.01495066495066495)]), (18, [(" espace ", 0.020626317374284855), (" lancement "", 0.0096571600636 , ( "system ", 0.008560244332602057), ( "project ", 0.008173097603991913), ( "time ", 0.008108573149223556), ( "cost ", 0.007764442723792318), ( "year ", 0.0076784101174345075) , ("Terre ", 0,007484836753129436), (" base ", 0,0067535595990880545), (" large ", 0,006689035144319697)]), (5, [(" gouvernement ", 0,01918437232469453), (" people "", 0,01461203206475212) , ( "state ", 0.011207097828624796), ( "country ", 0.010214802708381975), ( "israeli ", 0.010039691804809714), ( "war ", 0.009436532025838587), ( "force " ", 0.00858043427504086) , ( "attaque ", 0,008424780138532182), ( "terre ", 0,0076659662230523775), ( "monde ", 0,0075103120865437)]), (2, [( "voiture ", 0.041091191194044470564), ( " bike ", 0.015598981291017729), (" ride ", 0.011019688510138114), (" drive ", 0.010627877363110981), (" engine ", 0.009403467528651191), (" speed "", 0.0080811049074 "34616), ( turn ", 0.007738270153785875), (" back ", 0.007738270153785875), (" front ", 0.0074688990204721), (" big ", 0.007370947203447938)])] Évaluation des performances Nous pouvons maintenant également évaluer ses performances en calculant le score de cohérence comme suit - ldamallet = gensim .models.wrappers.LdaMallet (mallet_path, corpus = corpus, num_topics = 20, id2word = id2word) pprint (ldamallet.show_topics (formatted = False)) Sortie Coherence Score: 0.5842762900901401 Gensim - Documents & Modèle LDA Ce chapitre traite des documents et du modèle LDA dans Gensim. Recherche du nombre optimal of Topics for LDA Nous pouvons trouver le nombre optimal de sujets pour LDA en créant de nombreux modèles LDA avec différentes valeurs de sujets. Parmi ces LDA, nous pouvons en choisir un ayant la valeur de cohérence la plus élevée. La fonction suivante nommée cohérence_values_computation () entraînera plusieurs modèles de LDA. Il fournira également les modèles ainsi que leur score de cohérence correspondant - def cohérence_values_computation (dictionnaire, corpus, textes, limite, start = 2, step = 3): cohérence_values = model_list = pour num_topics in range (start, limit, step): model = gensim.models.wrappers.LdaMallet (mallet_path, corpus = corpus, num_topics = num_topics, id2word = id2word) model_list.append (model) cohérencemodel = CoherenceModel (modèle = modèle, textes = textes, dictionnaire = dictionnaire, cohérence = "c_v ") cohérence_values.append (cohérencemodel.get_coherence ()) return model_list, cohérence_values ​​ Maintenant avec l"aide du suivant code, nous pouvons également obtenir le nombre optimal de sujets que nous pouvons afficher à l"aide d"un graphique - model_list, cohérence_values ​​= cohérence_values_computation (dictionary = id2word, corpus = corpus, textes = data_lemmatized, start = 1, limit = 50, step = 8) limit = 50; début = 1; pas = 8; x = range (début, limite, étape) plt.plot (x, valeurs_cohérence) plt.xlabel ( "Num Topics ") plt.ylabel ( "Score de cohérence ") plt.legend (( "valeurs_cohérence " ), loc = "best ") plt.show () Sortie Ensuite, nous pouvons également imprimer le valeurs de cohérence pour pour m, cv dans zip (x, cohérence_values): print ( "Num Topics = ", m, "est ayant une valeur de cohérence de ", round (cv, 4)) Sortie Num Topics = 1 a une valeur de cohérence de 0,4866 Num Topics = 9 a une valeur de cohérence de 0,5083 Num Topics = 17 a une valeur de cohérence de 0,5584 Num Topics = 25 a une valeur de cohérence de 0,5793 Num Topics = 33 a une valeur de cohérence de 0,587 Num Topics = 41 a une valeur de cohérence de 0,5842 Num Topics = 49 a une valeur de cohérence de 0,5735 Maintenant, la question se pose quel modèle devrions-nous choisir maintenant? L"une des bonnes pratiques est de choisir le modèle, qui donne la plus grande valeur de cohérence avant de flatter. C"est pourquoi, nous choisirons le modèle avec 25 sujets qui est au numéro 4 dans la liste ci-dessus. optimal_model = model_list [3] model_topics = optimal_model.show_topics ( formatted = False) pprint (optimal_model.print_topics (num_words = 10)) [(0, "0,018 * "power " + 0,011 * "high " + 0,010 * "ground " + 0,009 * "courant "+ "" 0,008 * " faible "+ 0,008 * " fil "+ 0,007 * " eau "+ 0,007 * " travail "+ 0,007 * " conception " "" + 0,007 * "lumière " "), (1, " 0,036 * "jeu " + 0,029 * "équipe " + 0,029 * "année " + 0,028 * "jouer " + 0,020 * "player " "" + 0.019 * "win " + 0.018 * "good " + 0.013 * "season " + 0.012 * "run " + 0.011 * "hit " "), (2, " 0,020 * "image " + 0,019 * "informations " + 0,017 * "include " + 0,017 * "mail " + "" 0,016 * "envoyer "+ 0,015 * " liste "+ 0,013 * " poste "+ 0,012 * " adresse "+ "" 0,012 * " internet "+ 0,012 * " système " "), (3, "0,986 * "ax " + 0,002 * "_ " + 0,001 * "tm " + 0,000 * "part " + 0,000 * "biz " + " "0,000 * "mb " + 0,000 * "mbs " + 0,000 * "pn e "+ 0,000 * " end "+ 0,000 * " di " "), (4, " 0,020 * " make "+ 0,014 * " work "+ 0,013 * " money "+ 0,013 * " année "+ 0,012 * " personnes " "" + 0,011 * " emploi "+ 0,010 * " groupe "+ 0,009 * " gouvernement "+ 0,00 8 * "support " + "" 0,008 * "question " "), (5, " 0,011 * "étude " + 0,011 * "drogue " + 0,009 * "science "+ 0,008 * " nourriture "+ "" 0,008 * " problème "+ 0,008 * " résultat "+ 0,008 * " effet "+ 0,007 * " médecin "+ "" 0,007 * "recherche " + 0,007 * "patient " "), (6, " 0,024 * "pistolet " + 0,024 * "loi " + 0,019 * "état " + 0,015 * "cas " + 0,013 * "personnes " + "" 0,010 * "crime " + 0,010 * "arme " + 0,010 * "personne " + 0,008 * "arme à feu " + "" 0,008 * "police " "), (7, " 0,012 * "mot " + 0,011 * "question " + 0,011 * "exister " + 0,011 * "vrai "+ "" 0,010 * " religion "+ 0,010 * " réclamation "+ 0,008 * " argument "+ 0,008 * " vérité "+ "" 0,008 * " vie "+ 0,008 * "foi " "), (8, " 0,077 * "heure " + 0,029 * "jour " + 0,029 * "appel " + 0,025 * "retour " + 0,021 * "travail " + "" 0,019 * "long " + 0,015 * "fin " + 0,015 * "donner " + 0,014 * "année " + 0,014 * "semaine " "), (9, " 0,048 * "chose " + 0,041 * "faire " + 0,038 * "bien " + 0,037 * "personnes " + "" 0,028 * "écrire "+ 0,019 * " mauvais "+ 0,019 * " point "+ 0,018 * " lecture "+ 0,018 * " post "+ "" 0,016 * " idée " "), (10, " 0,022 * " livre "+ 0,020 * " _ "+ 0,013 * " homme "+ 0,012 * " personnes "+ 0,011 * " écrire "+ "" 0,011 * " trouver "+ 0,010 * " histoire "+ 0,010 * " arménien "+ 0,009 * " turc "+ " "0,009 * "numéro " "), (11, "0,064 * "ligne " + 0,030 * "acheter " + 0,028 * "organisation " + 0,025 * "prix " + "" 0,025 * "vendre " + 0,023 * "bien " + 0,021 * "hôte " + 0,018 * "vente " + 0,017 * "mail " + "" 0,016 * "coût " "), (12, " 0,041 * "voiture " + 0,015 * "vélo " + 0,011 * "trajet " + 0,010 * "moteur " + 0,009 * " lecteur " "" + 0,008 * " côté "+ 0,008 * " article "+ 0,007 * " tourner "+ 0,007 * " avant "+ "" 0,007 * " vitesse " "), (13, " 0,018 * " personnes "+ 0,011 * " attaque "+ 0,011 * " état "+ 0,011 * " israélien "+ "" 0,010 * " guerre "+ 0,010 * " pays "+ 0,010 * " gouvernement "+ 0,009 * " vivre "+ "" 0,009 * " donner "+ 0,009 * " terre " ") , (14, "0,037 * "fichier " + 0,026 * "ligne " + 0,021 * "lecture " + 0,019 * "suivre " + " "0,018 * "numéro " + 0,015 * "programme " + 0,014 * "écrire " + 0,012 * "entrée " + "" 0,012 * "donner "+ 0,011 * " vérifier " "), (15, " 0,196 * " écrire "+ 0,172 * " ligne "+ 0,165 * " article "+ 0,117 * " organisation " + "" 0,086 * "hôte " + 0,030 * "réponse " + 0,010 * "université " + 0,008 * "entendre " + "" 0,007 * "post " + 0,007 * "nouvelles " "), (16, " 0,021 * "personnes " + 0,014 * "arrivent " + 0,014 * "enfant " + 0,012 * "tuer " + " "0,011 * "démarrer " + 0,011 * "en direct " + 0,010 * "feu " + 0,010 * "quitter " + 0,009 * "entendre " " "+ 0,009 * "accueil " "), (17, " 0,038 * " clé "+ 0,018 * " système "+ 0,015 * " espace "+ 0,015 * " technologie "+ "" 0,014 * "cryptage " + 0,010 * "puce " + 0,010 * "bit " + 0,009 * "lancement " + "" 0,009 * "public " + 0,009 * "gouvernement " " ), (18, "0,035 * "lecteur " + 0,031 * "système " + 0,027 * "problème " + 0,027 * "carte " + " "0,020 * "pilote " + 0,017 * "bit " + 0,017 * "travail " + 0,016 * "disque " + "" 0,014 * "moniteur " + 0,014 * "machine " "), (19 , "0,031 * "fenêtre " + 0,020 * "exécuter " + 0,018 * "couleur " + 0,018 * "programme " + " "0,017 * "application " + 0,016 * "display " + 0.015 * "set " + 0.015 * "vers ion "+ "" 0.012 * " screen "+ 0.012 * " problem " ")] Recherche de sujets dominants dans des phrases Recherche de sujets dominants dans phrases est l"une des applications pratiques les plus utiles de la modélisation de sujets. Il détermine le sujet sur lequel porte un document donné. Ici, nous trouverons le numéro de sujet qui a le pourcentage de contribution le plus élevé dans ce document particulier. Afin d"agréger les informations dans une table, nous allons créer une fonction nommée dominant_topics () - def dominant_topics (ldamodel = lda_model, corpus = corpus, textes = data): sent_topics_df = pd.DataFrame () Ensuite, nous obtiendrons les sujets principaux dans chaque document - pour i, row in enumerate (ldamodel [corpus]): row = sorted (row, key = lambda x: (x [1]), reverse = True) Ensuite, nous obtiendrons le sujet dominant , Contribution en pourcentage et mots clés pour chaque document - for j, (topic_num, prop_topic) in enumerate (row): if j == 0: # => sujet dominant wp = ldamodel.show_topic (topic_num) topic_keywords = ", ". join ([mot pour mot, prop dans wp]) sent_topics_df = sent_topics_df.append (pd.Series ([int (topic_num), round (prop_topic, 4), topic_keywords]), ignore_index = True) else: break sent_topics_df.columns = [ "Dominant_Topic ", "Perc_Contribution ", "Topic_Keywords "] Avec l"aide du code suivant, nous ajouterons le texte original à la fin de la sortie - contents = pd.Series ( textes) sent_topics_df = pd.concat ([sent_topics_df, contents], axis = 1) return (sent_topics_df) df_topic_sents_keywords = dominant_topics (ldamodel = optimal_model, corpus = corpus, textes = data) Maintenant, faites le formatage des sujets dans les phrases comme suit - df_dominant_topic = df_topic_sents_keywords.reset_index () df_dominant_topic.columns = [ "Document_No ", "Dominant_Topic ", "Topic_Perc_Contrib ", " Mots-clés ", " Tex t "] Enfin, nous pouvons montrer les sujets dominants comme suit - df_dominant_topic.head (15) Recherche du document le plus représentatif Afin de mieux comprendre le sujet, nous pouvons également trouver les documents, un sujet donné a le plus contribué. Nous pouvons déduire ce sujet en lisant ce (s) document (s) particulier (s). sent_topics_sorteddf_mallet = pd.DataFrame () sent_topics_outdf_grpd = df_topic_sents_keywords.groupby ( "Dominant_Topic ") pour i , grp dans sent_topics_outdf_grpd: sent_topics_sorteddf_mallet = pd.concat ([sent_topics_sorteddf_mallet, grp.sort_values ​​([ "Perc_Contribution "], ascending = [0]). head (1)], axis = 0) sent_topics_sort (drop) , inplace = True) sent_topics_sorteddf_mallet.columns = [ "Topic_Number ", "Contribution_Perc ", "Mots clés ", " Texte "] sent_topics_sorteddf_mallet.head () Sortie Volume et distribution des sujets Parfois, nous voulons aussi juger dans quelle mesure le sujet est discuté dans les documents. Pour cela, nous devons comprendre le volume et la répartition des sujets dans les documents. Commencez par calculer le nombre de documents pour chaque sujet comme suit - topic_counts = df_topic_sents_keywords [ "Dominant_Topic "]. value_counts () Ensuite, calculez le pourcentage de documents pour chaque sujet comme suit -; topic_contribution = round (topic_counts / topic_counts.sum (), 4) Recherchez maintenant le numéro du sujet et les mots-clés comme suit - topic_num_keywords = df_topic_sents_keywords [ [ "Dominant_Topic ", "Topic_Keywords "]] Maintenant, concaténez puis Co lumn sage comme suit - df_dominant_topics = pd.concat ([topic_num_keywords, topic_counts, topic_contribution], axis = 1) Ensuite, nous allons changer les noms de colonnes comme suit - df_dominant_topics.columns = [ "Dominant-Topic ", "Topic-Keywords ", "Num_Documents ", " Perc_Documents "] df_dominant_topics Sortie Gensim - Création d"un modèle de sujet LSI et HDP Ce chapitre traite de la création d"un modèle de sujet d"indexation sémantique latente (LSI) et de processus de Dirichlet hiérarchique (HDP) en ce qui concerne Gensim. Les algorithmes de modélisation de sujet qui ont été implémentés pour la première fois dans Gensim avec l"allocation de dirichlet latent (LDA) est Latent Semantic Indexing (LSI) . Elle est également appelée Analyse sémantique latente (LSA) . Il a été breveté en 1988 par Scott Deerwester, Susan Dumais, Ge orge Furnas, Richard Harshman, Thomas Landaur, Karen Lochbaum et Lynn Streeter. Dans cette section, nous allons configurer notre modèle LSI. Cela peut être fait de la même manière que pour la configuration du modèle LDA. Nous devons importer le modèle LSI depuis gensim.models. Rôle de LSI En fait, LSI est une technique NLP, en particulier dans la sémantique distributionnelle. Il analyse la relation entre un ensemble de documents et les termes que ces documents contiennent. Si nous parlons de son fonctionnement, alors il construit une matrice qui contient le nombre de mots par document à partir d"un gros morceau de texte. Une fois construit, pour réduire le nombre de lignes, le modèle LSI utilise une technique mathématique appelée singulier décomposition des valeurs (SVD). En plus de réduire le nombre de lignes, il préserve également la structure de similarité entre les colonnes. Dans la matrice, les lignes représentent des mots uniques et les colonnes représentent chaque document. Il fonctionne sur la base d"une hypothèse distributionnelle, c"est-à-dire qu"il suppose que les mots dont le sens est proche apparaîtront dans le même type de texte. Implémentation avec Gensim Ici, nous allons utiliser LSI (Latent Semantic Indexing) pour extraire les sujets naturellement discutés de l"ensemble de données. Chargement de l"ensemble de données L"ensemble de données que nous allons utiliser est l"ensemble de données de "20 Newsgroups " ayant des milliers d"articles de presse provenant de différentes sections d"un reportage. Il est disponible dans les ensembles de données Sklearn . Nous pouvons facilement télécharger à l"aide du Python suivant - depuis sklearn.datasets import fetch_20newsgroups newsgroups_train = fetch_20newsgroups (subset = "train ") Regardons quelques exemples de news à l"aide du suivant - newsgroups_train.data [: 4] [ "From: lerxst@wam.umd. edu (où est mon truc) nSubjet: QUELLE voiture est-ce!? nNntp-Posting-Host: rac3.wam.umd.edu nOrganisation: Université du Maryland, College Park nLignes: 15 n n Je me demandais si quelqu"un pouvait d m"éclairer sur cette voiture que j"ai vue nl"autre jour. C"était une voiture de sport à 2 portes, qui semblait être de la fin des années 60 / presque 70. Cela s"appelait un Bricklin. Les portes étaient vraiment petites. De plus, nle pare-chocs avant était séparé du reste de la carrosserie. C"est n tout ce que je sais. Si quelqu"un peut me dire le nom du modèle, les spécifications du moteur, les années nde production, le lieu de fabrication de cette voiture, son histoire ou toute autre information que vous navoir sur cette voiture à l"allure géniale, veuillez envoyer un e-mail. n nMerci, n- IL n ---- présenté par votre quartier Lerxst ---- n n n n n ", " De: guykuo@carson.u .washington.edu (Guy Kuo) nObjet: Sondage d"horloge SI - Appel final nRésumé: Appel final pour les rapports d"horloge SI nMots clés: SI, accélération, horloge, mise à niveau nID de l"article: shelley.1qvfo9INNc3s nOrganisation: Université de Washington nLignes: 11 nNNTP-Posting-Host: carson.u.washington.edu n nUn bon nombre d"âmes courageuses qui ont amélioré leur oscillateur d"horloge SI ont npartagé leurs expériences pour cela sondage. Veuillez envoyer un bref message détaillant nvos expériences avec la procédure. Vitesse maximale atteinte, vitesse nominale du processeur, najout de cartes et d"adaptateurs, dissipateurs de chaleur, heure d"utilisation par jour, disquette nfonctionnalité avec 800 et 1,4 m de disquettes sont particulièrement demandées. n nJe résumerai dans les deux prochains jours, veuillez donc ajouter à la base de nconnaissances du réseau si vous avez effectué la mise à jour de l’horloge et que vous n’avez pas répondu à cette npoll. Merci. n nGuy Kuo n ", "De: twillis@ec.ecn.purdue.edu (Thomas E Willis) nSubjet: questions PB .. . nOrganisation: Purdue University Engineering Computer Network nDistribution: États-Unis nLignes: 36 n nEh bien, mon mac plus a finalement abandonné le fantôme ce week-end après avoir n commencé la vie à 512k en 1985 . sooo, je "suis sur le marché pour une nnouvelle machine un peu plus tôt que prévu ... n ni " je cherche à prendre un powerbook 160 ou peut-être 180 et avez un tas de nde questions auxquelles (espérons-le) quelqu"un pourra répondre: n n * est-ce que quelqu"un sait quand le prochain cycle de powerbook nintroductions sont attendus? j " , je me demandais si quelqu"un avait nplus d"infos ... n n * quelqu"un a-t-il entendu des rumeurs sur les baisses de prix de la ligne powerbook comme les nones que le duo vient de subir récemment ? n n * quelle "est l"impression de l"écran sur le 180? je pourrais probablement balancer na 180 si j’ai le disque de 80 Mo plutôt que le 120, mais je n’ai pas vraiment la moindre idée de l’amélioration de l’écran (oui, il est superbe dans le nstore, mais est-ce que tout "wow " ou est-ce vraiment si bon?). puis-je solliciter ndes opinions de personnes qui utilisent quotidiennement les 160 et 180 si cela vaut la peine de nprendre la taille du disque et l"argent nécessaire pour obtenir l"affichage actif? (Je me rends compte que c"est une vraie question subjective, mais je n"ai joué qu"avec les nmachines dans un magasin d"informatique rapidement et j"ai pensé que les opinions de quelqu"un nqui utilise réellement la machine quotidiennement pourraient s"avérer utiles) . n n * Quelle est la performance des Hellcats? ;) n nMerci d"avance pour toute information - si vous pouviez envoyer un e-mail, je publierai un nsumé (le temps de lecture des actualités est limité avec des finales juste autour du ncorner .. . :() n - nTom Willis twillis@ecn.purdue.edu Purdue Electrical Engineering n ---------------- -------------------------------------------------- --------- n "Les condamnations sont des ennemis plus dangereux de la vérité que les mensonges. " - FW nNietzsche n ", " De: jgreen @ amber (Joe Green) nSubjet: Re: Weitek P9000? nOrganisation: Harris Computer Systems Division nLignes: 14 nDistribution: monde nNNTP-Posting-Host: amber.ssd.csd.harris.com nX-Newsreader: TIN [ version 1.1 PL9] n nRobert JC Kyanko (rob@rjck.UUCP) a écrit: p> abraxis@iastate.edu écrit dans l"article 734340159@class1.iastate.p>: p>> Quelqu"un connaît la puce graphique Weitek P9000? p> En ce qui concerne les éléments de bas niveau g oes, ça a l"air plutôt sympa. Il "a cette p> commande de remplissage quadrilatère qui ne nécessite que les quatre points. n nAvez-vous l’adresse / le numéro de téléphone de Weitek? Je "aimerais obtenir des informations nsur cette puce. n n - nJoe Green t t t tHarris Corporation njgreen@csd.harris. com t t tDivision des systèmes informatiques n "La seule chose qui me fait vraiment peur, c"est une personne sans sens de l"humour. " n t t t t t t-- Jonathan Winters n "] Prérequis Nous avons besoin de Stopwords de NLTK et d"un modèle anglais de Scapy. Les deux peuvent être téléchargés comme suit - import nltk; nltk.download ( "stopwords ") nlp = spacy.load ( "en_core_web_md ", disable = [ "parser ", "ner "]) Importation des packages nécessaires Afin de construire le modèle LSI, nous devons importer le package nécessaire suivant - import re import numpy as np import pandas as pd from pprint import pprint import gensim importer gensim.corpora en tant que corpus depuis gensim.utils importer simple_preprocess depuis gensim.models importer CoherenceModel importer spacy importer matplotlib.pyplot en tant que plt Préparer les mots vides Nous devons maintenant importer les mots vides et utilisez-les - from nltk.corpus import stopwords stop_words = stopwords.words ( "english ") stop_words.extend ([ "from ", "subject ", " re ", " edu ", " use "]) Nettoyez le texte Maintenant, avec l"aide de Gensim simple_preprocess () nous devons tokeniser chaque phrase en une liste de mots. Nous devons également supprimer les ponctuations et les caractères inutiles. Pour ce faire, nous allons créer une fonction nommée sent_to_words () - def sent_to_words (phrases): pour la phrase dans les phrases: yield (gensim.utils.simple_preprocess (str (phrase), deacc = True)) data_words = list (sent_to_words (données)) Construction de modèles Bigram & Trigram Comme nous savons que les bigrammes sont deux mots qui sont se produisant fréquemment ensemble dans le document et le trigramme sont trois mots qui apparaissent fréquemment ensemble dans le document. Avec l"aide du modèle Phrases de Gensim, nous pouvons le faire - bigram = gensim.models.Phrases (data_words, min_count = 5, threshold = 100) trigram = gensim. models.Phrases (bigram [data_words], threshold = 100) bigram_mod = gensim.models.phrases.Phraser (bigram) trigram_mod = gensim.models.phrases.Phraser (trigram) Filtrer les mots vides Ensuite, nous devons filtrer les mots vides. Parallèlement à cela, nous créerons également des fonctions pour créer des bigrammes, des trigrammes et pour la lemmatisation - def remove_stopwords (textes): return [[mot pour mot dans simple_preprocess (str ( doc)) si le mot n"est pas dans stop_words] pour doc dans les textes] def make_bigrams (textes): return [bigram_mod [doc] pour doc dans les textes] def make_trigrams (textes): return [trigram_mod [bigram_mod [doc]] pour doc dans les textes ] def lemmatisation (textes, allowed_postags = [ "NOUN ", "ADJ ", "VERB ", "ADV "]): textes_out = pour les textes envoyés: doc = nlp ( " ". join (sent)) text_out.append ([token.lemma_ for token in doc if token.pos_ in allowed_postags]) return textes_out Construction d"un dictionnaire et d"un corpus pour le modèle de sujet Nous devons maintenant construire le dictionnaire et le corpus. Nous l"avons également fait dans les exemples précédents - id2word = corpora.Dictionary (data_lemmatized) text = data_lemmatized corpus = [id2word.doc2bow (text) for text in text] Construction d"un modèle de sujet LSI Nous avons déjà implémenté tout ce qui est nécessaire pour entraîner le modèle LSI. Il est maintenant temps de créer le modèle de sujet LSI. Pour notre exemple d"implémentation, cela peut être fait à l"aide de la ligne de codes suivante - lsi_model = gensim.models.lsimodel.LsiModel (corpus = corpus, id2word = id2word , num_topics = 20, chunksize = 100) Exemple d"implémentation Voyons l"examen d"implémentation complet pour construire un modèle de sujet LDA - import re import numpy as np import pandas as pd from pprint import pprint import gensim import gensim.corpora as corp from gensim.utils import simple_preprocess depuis gensim.models import CoherenceModel importation spacy import matplotlib.pyplot as plt depuis nltk.corpus import stopwords stop_words = stopwords.words ( "anglais ") stop_words.extend ([ "from ", "subject ", "re ", "edu ", "use "]) de sklearn.datasets import fetch_20newsgroups newsgroups_train = fetch_20newsgroups (subset = "train ") data = newsgroups_train.data data = [re.sub ( " S * @ S * s? ", " ", Envoyé) pour les données envoyées] data = [re.sub (" s + ", " ", envoyé) pour les données envoyées] data = [re.sub ( " "", ", envoyé) pour les données envoyées] print (data_words [: 4]) # il imprimera les données après avoir préparé pour stopwords bigram = gensim.models.Phrases (data_words, min_count = 5, threshold = 100) trigram = gensim.models.Phrases (bigram [data_words], threshold = 100) bigram_mo d = gensim.models.phrases.Phraser (bigramme) trigram_mod = gensim.models.phrases.Phraser (trigramme) def remove_stopwords (textes): return [[mot pour mot dans simple_preprocess (str (doc)) si mot pas dans stop_words] pour doc dans les textes] def make_bigrams (textes): return [bigram_mod [doc] pour doc dans les textes] def make_trigrams (textes): return [trigram_mod [bigram_mod [doc]] pour doc dans les textes] def lemmatisation (textes, allowed_postags = [ "NOUN ", "ADJ ", "VERB ", "ADV "]): textes_out = pour les textes envoyés: doc = nlp ( ". Join (envoyé)) textes_out .append ([token.lemma_ for token in doc if token.pos_ in allowed_postags]) return textes_out data_words_nostops = remove_stopwords (data_words) data_words_bigrams = make_bigrams (data_words_nostops) nlp = spacy.load , parser ", " ner "]) data_lemmatized = lemmatization (data_words_bigrams, allowed_postags = [" NOUN ", " ADJ ", " VERB ", " ADV "]) print (data_lemmatized [: 4]) #it imprimera les données lemmatisées. id2word = corpora.Dictionary (data_lemmat ized) textes = data_lemmatized corpus = [id2word.doc2bow (text) pour le texte dans les textes] print (corpus [: 4]) #it affichera le corpus que nous avons créé ci-dessus. [[(id2word [id], freq) pour id, freq dans cp] pour cp dans le corpus [: 4]] # il affichera les mots avec leurs fréquences. lsi_model = gensim.models.lsimodel.LsiModel (corpus = corpus, id2word = id2word, num_topics = 20, chunksize = 100) Nous pouvons maintenant utiliser le modèle LSI créé ci-dessus pour obtenir les sujets. Affichage des sujets dans le modèle LSI Le modèle LSI (lsi_model) que nous avons créé ci-dessus peut être utilisé pour afficher les sujets des documents. Cela peut être fait à l"aide du suivant - pprint (lsi_model.print_topics ()) doc_lsi = lsi_model [corpus] Output [(0, "1.000 * "ax " + 0.001 * "_ " + 0.000 * "tm " + 0.000 * "part " + 0,000 * "pne " + "" 0,000 * "biz " + 0,000 * "mbs " + 0,000 * "end " + 0,000 * "fax " + 0,000 * "mb " "), (1, " 0,239 * " dire "+ 0,222 * " fichier "+ 0,189 * " aller "+ 0,171 * " savoir "+ 0,169 * " personnes " + "" 0,147 * "faire " + 0,140 * "utiliser " + 0,135 * "aussi " + 0,133 * "voir " + 0,123 * "penser " ")] Processus de Dirichlet Hiérarchique (HPD) Les modèles de sujets tels que LDA et LSI aident à résumer et à organiser de grandes archives de textes qu"il n"est pas possible d"analyser à la main. Outre LDA et LSI, un autre modèle de sujet puissant dans Gensim est HDP (Hierarchical Dirichlet Process). Il s’agit essentiellement d’un modèle à composition mixte pour l’analyse non supervisée de données groupées. Contrairement à LDA (son homologue fini), HDP déduit le nombre de sujets à partir des données. Implémentation avec Gensim Pour implémenter HDP dans Gensim, nous devons former le corpus et le dictionnaire (comme fait dans les exemples ci-dessus lors de l"implémentation des modèles de sujets LDA et LSI) Modèle de sujet HDP que nous pouvons importer à partir de gensim.models.HdpModel. Ici aussi, nous allons implémenter le modèle de sujet HDP sur les données 20Newsgroup et les étapes sont également les mêmes. Pour notre corpus et dictionnaire (créés dans un ci-dessus des exemples pour les modèles LSI et LDA), nous pouvons importer HdpModel comme suit - Hdp_model = gensim.models.hdpmodel.HdpModel (corpus = corpus, id2word = id2word) Affichage des sujets dans le modèle LSI Le modèle HDP (Hdp_model) peut être utilisé pour afficher les sujets des documents. Cela peut être fait à l"aide du suivant - pprint (Hdp_model.print_topics ()) Output [(0, "0,009 * ligne + 0,009 * écrire + 0,006 * dire + 0,006 * article + 0,006 * savoir + " "0,006 * personnes + 0,005 * faire + 0,005 * aller + 0,005 * penser + 0,005 * être "), (1, " 0,016 * ligne + 0,011 * écrire + 0,008 * article + 0,008 * organisation + 0,006 * savoir "" + 0,006 * hôte + 0,006 * être + 0,005 * obtenir + 0,005 * utiliser + 0,005 * dire "), (2, " 0,810 * ax + 0,001 * _ + 0,000 * tm + 0,000 * partie + 0,000 * mb + 0,000 * pne + "" 0,000 * biz + 0,000 * fin + 0,000 * wwiz + 0,000 * fax "), (3, " 0,015 * ligne + 0,008 * écriture + 0,007 * organisation + 0,006 * hôte + 0,006 * savoir + "" 0,006 * article + 0,005 * utilisation + 0,005 * merci + 0,004 * obtenir + 0,004 * problème "), (4, " 0,004 * ligne + 0,003 * écrire + 0,002 * croire + 0,002 * penser + 0,002 * article + "" 0,002 * croyance + 0,002 * dire + 0,002 * voir + 0,002 * regarder + 0,002 * organisation "), (5, " 0,005 * ligne + 0,003 * écrire + 0,003 * organisation + 0,002 * article + 0,002 * tim e "" + 0,002 * hôte + 0,002 * obtenir + 0,002 * regarder + 0,002 * dire + 0,001 * nombre "), (6, " 0,003 * ligne + 0,002 * dire + 0,002 * écrire + 0,002 * aller + 0,002 * pistolet + 0,002 * obtenir + "" 0,002 * organisation + 0,002 * facture + 0,002 * article + 0,002 * état "), (7, " 0,003 * ligne + 0,002 * écrire + 0,002 * article + 0,002 * organisation + 0,001 * aucun "" + 0,001 * savoir + 0,001 * dire + 0,001 * personnes + 0,001 * hôte + 0,001 * nouveau "), (8, " 0,004 * ligne + 0,002 * écrire + 0,002 * obtenir + 0,002 * équipe + 0,002 * organisation + "" 0,002 * aller + 0,002 * penser + 0,002 * savoir + 0,002 * article + 0,001 * bien "), (9, " 0,004 * ligne + 0,002 * organisation + 0,002 * écrire + 0,001 * être + 0,001 * hôte + "" 0,001 * article + 0,001 * merci + 0,001 * utiliser + 0,001 * travailler + 0,001 * exécuter "), (10, " 0,002 * ligne + 0,001 * jeu + 0,001 * écrire + 0,001 * obtenir + 0,001 * savoir + "" 0,001 * chose + 0,001 * penser + 0,001 * article + 0,001 * aide + 0,001 * tourner "), (11, " 0,002 * ligne + 0,001 * écriture + 0,001 * jeu + 0,001 * organisation + 0,001 * dire + "" 0,001 * hôte + 0,001 * donner + 0,001 * exécuter + 0,001 * article + 0,001 * obtenir "), (12, " 0,002 * ligne + 0,001 * écrire + 0,001 * savoir + 0,001 * temps + 0,001 * article + "" 0,001 * obtenir + 0,001 * penser + 0,001 * organisation + 0,001 * scope + 0.001 * make "), (13, " 0.002 * line + 0.002 * write + 0.001 * article + 0.001 * organization + 0.001 * make "" + 0.001 * know + 0.001 * see + 0.001 * get + 0,001 * hôte + 0,001 * vraiment "), (14, " 0,002 * écrire + 0,002 * ligne + 0,002 * savoir + 0,001 * penser + 0,001 * dire + "" 0,001 * article + 0,001 * argument + 0,001 * pair + 0,001 * carte + 0,001 * être "), (15, " 0,001 * article + 0,001 * ligne + 0,001 * faire + 0,001 * écrire + 0,001 * savoir + "" 0,001 * dire + 0,001 * exister + 0,001 * obtenir + 0,001 * objectif + 0,001 * organisation "), (16, " 0,002 * ligne + 0,001 * écrire + 0,001 * article + 0,001 * assurance + 0,001 * aller + "" 0,001 * être + 0,001 * hôte + 0,001 * dire + 0,001 * organisation + 0,001 * partie "), (17, " 0,001 * ligne + 0,001 * obtenir + 0,001 * toucher + 0,001 * aller + 0,001 * écrire + 0,001 * dire + "" 0,001 * savoir + 0,001 * médicament + 0,001 * voir + 0,001 * besoin "), (18, " 0,002 * option + 0,001 * ligne + 0,001 * vol + 0,001 * puissance + 0,001 * logiciel + "" 0,001 * écriture + 0,001 * ajouter + 0,001 * personnes + 0,001 * organisation + 0,001 * module "), (19, " 0,001 * navette + 0,001 * ligne + 0,001 * rouleau + 0,001 * attitude + 0,001 * manœuvre + "" 0,001 * mission + 0,001 * également + 0,001 * orbite + 0,001 * produire + 0,001 * fréquence ")] Gensim - Développer l"incorporation de mots Le chapitre nous aidera à comprendre le développement de l"incorporation de mots dans Gensim. L"incorporation de mots, approche pour représenter des mots et un document, est une représentation vectorielle dense pour le texte où les mots ayant la même signification ont un sens similaire représentation. Voici quelques caractéristiques de l"incorporation de mots - C"est une class de technique qui représente les mots individuels comme des vecteurs à valeur réelle dans un espace vectoriel prédéfini. Cette technique est souvent regroupée dans le domaine de DL (apprentissage en profondeur) car chaque mot est mappé sur un vecteur et les valeurs vectorielles sont apprises de la même manière qu"un NN (Neural Networks). L"approche clé de la technique d"incorporation de mots est une représentation distribuée dense pour chaque mot. Différentes méthodes / algorithmes d"incorporation de mots Comme discuté ci-dessus, les méthodes / algorithmes d"incorporation de mots apprennent une représentation vectorielle à valeur réelle à partir d"un corpus de texte. Ce processus d"apprentissage peut être utilisé avec le modèle NN sur des tâches telles que la classification de documents ou est un processus non supervisé tel que les statistiques de documents. Ici, nous allons discuter de deux méthodes / algorithmes qui peuvent être utilisés pour apprendre un mot incorporé à partir de texte - Word2Vec par Google Word2Vec, développé par Tomas Mikolov, et. Al. chez Google en 2013, est une méthode statistique pour apprendre efficacement un mot incorporé à partir d"un corpus de texte. Il est en fait développé comme une réponse pour rendre la formation basée sur NN sur l"intégration de mots plus efficace. C"est devenu la norme de facto pour l"incorporation de mots. L"incorporation de mots par Word2Vec implique l"analyse des vecteurs appris ainsi que l"exploration des mathématiques vectorielles sur la représentation des mots. Voici les deux méthodes d"apprentissage différentes qui peuvent être utilisées dans le cadre de la méthode Word2Vec - Modèle CBoW (Continuous Bag of Words) Modèle de saut de gramme continu GloVe de Standford GloVe (vecteurs globaux pour la représentation de mots), est une extension de la méthode Word2Vec. Il a été développé par Pennington et al. à Stanford. L"algorithme GloVe est un mélange des deux - Statistiques globales des techniques de factorisation matricielle comme LSA (Latent Semantic Analysis) Apprentissage basé sur le contexte local dans Word2Vec. Si nous parlons de son fonctionnement, au lieu d"utiliser une fenêtre pour définir le contexte local, GloVe construit un mot explicite co - matrice d"occurrence utilisant des statistiques sur tout le corpus de texte. Développement de l"intégration de Word2Vec Ici, nous allons développer l"intégration de Word2Vec en utilisant Gensim. Afin de travailler avec un modèle Word2Vec, Gensim nous fournit la class Word2Vec qui peut être importée depuis models.word2vec . Pour sa mise en œuvre, word2vec nécessite beaucoup de texte, par exemple l"ensemble du corpus d"examen d"Amazon. Mais ici, nous appliquerons ce principe sur du texte de petite taille en mémoire. Exemple d"implémentation Nous devons d"abord importer la class Word2Vec de gensim.models comme suit - de gensim.models import Word2Vec Ensuite, nous devons définir les données d"entraînement. Plutôt que de prendre un gros fichier texte, nous utilisons quelques phrases pour implémenter ce principal. sentences = [[ "this ", "is ", " gensim ", " tutorial ", " for ", " free "], [" this ", " is ", " the ", " tutorials "" point ", " site "], [" vous ", " pouvez ", " lire ", " technique ", " tutoriels ", " pour ", " gratuit "], [" nous ", " sommes ", " implémentation ", " word2vec "], [" learn ", " full ", " gensim ", "tutorial "]] Une fois les données d"entraînement fournies, nous devons entraîner le modèle. cela peut être fait comme suit - model = Word2Vec (phrases, min_count = 1) Nous pouvons résumer le modèle comme suit -; print (model) Nous pouvons résumer le vocabulaire comme suit - words = list (model.wv.vocab) print (words) Ensuite, accédons au vecteur d"un mot. Nous le faisons pour le mot "tutoriel". print (model [ "tutorial "]) Ensuite, nous devons enregistrer le modèle - model.save ( "model.bin ") Ensuite, nous devons charger le modèle - new_model = Word2Vec.load ( "model.bin ") Enfin, imprimez le modèle enregistré comme suit - print (new_model) Exemple d"implémentation complet à partir de l"importation gensim.models Phrases Word2Vec = [[ "this ", "is ", "gensim ", "tutorial ", "for ", "free "], [ "this ", "is ", "the ", "tutorials " "point ", "website "], [ "you ", "can ", "read ", " technique ", " tutoriels ", " pour ", " gratuit "], [" nous ", " sommes ", " implémentation ", " word2vec "], [ "learn ", "full ", "gensim ", "tutorial "]] model = Word2Vec (phrases, min_count = 1) print (model) words = list (model.wv.vocab) print (mots) print (model [ "tutorial "]) model.save ( "model.bin ") new_model = Word2Vec.load ( "model.bin ") print (new_model) Sortie Word2Vec (vocab = 20, size = 100, alpha = 0.025) [ "this ", "is ", "gensim ", "tutorial ", "for ", "free ", "the ", "tutorialspoint ", "website ", "you ", "can ", " lire ", " technique ", " tutoriels ", " nous ", " sommes ", " implémenter ng ", " word2vec ", " learn ", " full "] [-2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03 -1.4255195e-03 -4.0217536e -03 4.9407515e-03 -3.5925603e-03 -1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03 3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03 -2.5336299e- 04-3.9676363e-03 -8.5054158e-04 1.6443320e-03 -4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03 9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e- 03 4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03 1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04 4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e- 03 4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03 6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03 -2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03 7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03 4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03 -3.7055744e-03 -4.1658725e -03 4.8034848e-03 4.8594419e-03 3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04 -3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03 -3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03 2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03 -3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03 1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03 3.31523 e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04 3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03 -1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e -03] Word2Vec (vocab = 20, size = 100, alpha = 0.025) Visualisation de l"intégration de mots Nous pouvons également explorer l"incorporation de mots avec la visualisation. Cela peut être fait en utilisant une méthode de projection classique (comme PCA) pour réduire les vecteurs de mots de haute dimension à des tracés 2D. Une fois réduits, nous pouvons les tracer sur un graphique. Tracer des vecteurs de mots à l"aide de PCA Tout d"abord, nous devons récupérer tous les vecteurs d"un modèle entraîné comme suit - Z = model [model.wv.vocab] Ensuite, nous devons créer un modèle PCA 2D de vecteurs de mots en utilisant la class PCA comme suit - pca = PCA (n_components = 2) result = pca.fit_transform (Z) Maintenant, nous pouvons tracer la projection résultante en utilisant le matplotlib comme suit - Pyplot.scatter (result [:, 0], result [:, 1]) On peut aussi annoter les points sur le graphique avec les mots lui-même. Tracez la projection résultante en utilisant le matplotlib comme suit - words = list (model.wv.vocab) for i, word in enumerate (words): pyplot.annotate ( word, xy = (result [i, 0], result [i, 1])) Exemple d"implémentation complet depuis les gensim.models import Word2Vec de sklearn.decomposition import PCA de matplotlib import pyplot phrases = [[ "this ", "is ", "gensim ", "tutorial ", "for ", "free " ], [ "this ", "is ", "the ", "tutorials " "point ", "website "], [ "you ", "can ", "read ", "technical ", "tutorials ", "for ", "free "], [ "we ", "are ", "implementation ", "word2vec "], [ "learn ", "full ", "gensim ", "tutorial "]] model = Word2Vec (phrases, min_count = 1) X = model [model.wv .vocab] pca = PCA (n_composants = 2) résultat = pca.fit_transform (X) pyplot.scatter (résultat [:, 0], résultat [:, 1]) mots = liste (model.wv.vocab) pour i, mot dans enumerate (mots): pyplot.annotate (mot, xy = (résultat [i, 0], résultat [i, 1])) pyplot.show () Sortie Gensim - Modèle Doc2Vec Le modèle Doc2Vec, contrairement au modèle Word2Vec, est utilisé pour créer une représentation vectorisée d"un groupe de mots pris collectivement comme une seule unité. Il ne donne pas seulement la moyenne simple des mots de la phrase. Création de vecteurs de document à l"aide de Doc2Vec Ici, pour créer des vecteurs de document à l"aide de Doc2Vec, nous utiliserons un ensemble de données text8 qui peut être téléchargé depuis gensim.downloader. Téléchargement de l"ensemble de données Nous pouvons télécharger l"ensemble de données text8 en utilisant les commandes suivantes - import gensim import gensim.downloader as api dataset = api.load ( "text8 ") data = [d pour d dans le jeu de données] Cela prendra un certain temps pour télécharger le jeu de données text8. Former le Doc2Vec Pour entraîner le modèle, nous avons besoin du document balisé qui peut être créé en utilisant models.doc2vec.TaggedDcument ( ) comme suit - def tagged_document (list_of_list_of_words): pour i, list_of_words dans enumerate (list_of_list_of_words): yield gensim.models.doc2vec.TaggedDocument (list_of_words, [i]) data_for_training = list (tagged_document (data)) Nous peut imprimer l"ensemble de données formé comme suit - print (data_for_training [: 1]) Sortie [TaggedDocument (words = [ "anarchism ", "originated ", " comme ", " a ", " term ", " of ", " abuse ", " first ", " used ", " against ", " early ", " working ", " class ", " radicaux ", " y compris ", " the ", " diggers ", " of ", " the ", "english ", "revolution ", "and ", "the ", "sans ", "culottes ", "of ", "the ", " français ", " révolution ", " while ", " the ", " term ", " is ", " still ", " used ", " in ", " a ", " péjoratif ", " way ", " to ", " describe ", " any ", " act ", " that ", "utilisé ", "violent ", "signifie ", "to ", "destroy ", "the ", "organisation ", "of ", " société ", " il ", " a ", " aussi ", " été ", " pris ", " up ", " as ", " a ", " positif ", " étiquette ", " par ", " soi ", " défini ", " anarchistes ", " le ", " mot ", "anarchisme ", "est ", "dérivé ", "de ", "le ", "grec ", "sans ", "archons ", " règle ", " chef ", " roi ", " anarchisme ", " as ", " a ", " politique ", " philosophie ", " est ", " la ", " croyance ", " que ", " les règles ", " sont ", " inutiles ", " et ", " devraient ", "être" , "aboli ", "bien que ", "là ", "soient ", "différents ", "interprétations ", "de ", "quoi ", "this ", "signifie ", "anarchism ", "also ", "fait ", "to ", "related ", "social ", "mouvements ", " que ", " défenseur ", " le ", " élimination ", " de ", " autoritaire ", " institutions ", " particulièrement " , "the ", "state ", "the ", "word ", "anarchy ", "as ​​", "most ", "anarchists ", "use ", "it ", "does ", "not ", "imply ", "chaos ", "nihilism ", "or ", "anomie ", " mais ", " plutôt ", " a ", " harmonieux ", " anti ", " autoritaire ", " société ", " in " , "lieu ", "de ", "quoi ", "sont ", "considéré ", "comme ", "autoritaire ", "politique ", "structures ", "et ", "coercitives ", "économiques ", "institutions ", "anarchistes ", "avocat ", "social ", "relations ", " basé ", " sur ", " volontaire ", " association ", " de ", " autonome ", " individus ", " mutuel " , "aid ", "and ", "self ", "governance ", "while ", "anarchism ", "is " , "la plupart ", "facilement ", "défini ", "par ", "quoi ", "il ", "est ", "contre ", "anarchistes ", "aussi ", "offre ", "positif ", "visions ", "de ", "quoi ", "ils ", "croient ", " à ", " être ", " a ", " vraiment ", " libre ", " société ", " cependant ", " idées " , "about ", "how ", "an ", "anarchist ", "society ", "might ", "work ", "varier ", "considérablement ", "spécialement ", "avec ", "respect ", "à ", "économie ", "là ", "est ", "aussi ", " désaccord ", " à propos de ", " comment ", " a ", " libre ", " société ", " pourrait ", " être " , "apporté ", "à propos de ", "origines ", "et ", "prédécesseurs ", "kropotkin ", "et ", "autres ", "argumenter ", "que ", "avant ", "enregistré ", "histoire ", "humain ", "société ", "était ", "organisé ", " sur ", " anarchiste ", " principes ", " la plupart ", " anthropologues ", " suivez ", " kropotkin ", " et " , "engels ", "in ", "croyant ", "que ", "chasseur ", "rassembleur ", "bandes ", "étaient ", "égalitaire ", "et ", "manquaient ", "d ivision ", " de ", " travail ", " accumulé ", " richesse ", " ou ", " décrété ", " loi ", " et ", " avait ", " égal ", " accès ", " à ", " ressources ", " william ", " godwin ", " anarchistes ", "y compris ", "le ", "le ", "anarchie ", "organisation ", "et ", "rothbard ", "find ", " anarchiste ", " attitudes ", " in ", " taoïsme ", " from ", " antique ", " china ", " kropotkin ", " found ", " similaire ", " idées ", " in ", " stoïque ", " zeno ", " of ", " citium ", " selon ", "à ", "kropotkin ", "zeno ", "répudié ", "le ", "toute-puissance ", "de ", "le ", " état ", " son ", " intervention ", " et ", " réglementation ", " et ", " proclamé ", " la ", " souveraineté ", " de ", " le ", " moral ", " loi ", " de ", " le ", " individu ", " le ", "anabaptistes ", "of ", "one ", "six ", "th ", "century ", "europe ", "are ", " parfois ", " considéré ", " à ", " être ", " religieux ", " précurseurs ", " de ", " moderne ", " anarchisme ", "Bertrand Russell ", " in ", " his ", " history ", " of ", " western ", " philosophie ", " écrit ", " that " , "les ", "anabaptistes ", "répudié ", "tous ", "loi ", "depuis ", "ils ", "tenu ", "que ", "le ", "bon ", "homme ", "sera ", "sera ", "guidé ", "à ", "chaque ", " moment ", " par ", " le ", " saint ", " esprit ", " de ", " ce ", " prémisse " , "ils ", "arrivent ", "à ", "communisme ", "le ", "creuseurs ", "ou ", "vrai ", "niveleurs ", "étaient ", "an ", "early ", "communistic ", "movement ", (tronqué…) Initialiser le modèle Une fois formés, nous devons maintenant initialiser le modèle. cela peut être fait comme suit - model = gensim.models.doc2vec.Doc2Vec (vector_size = 40, min_count = 2, epochs = 30) Maintenant, construisez le vocabulaire comme suit - model.build_vocab (data_for_training) Maintenant, entraînons le modèle Doc2Vec comme suit - model.train (data_for_training, total_examples = model.corpus_count, epochs = model.epochs) Analyse de la sortie Enfin, nous peut analyser la sortie en utilisant model.infer_vector () comme suit - print (model.infer_vector ([ "violent ", "means ", " to ", " destroy ", " the ", " organization "])) Exemple de mise en œuvre complète import gensim import gensim.downloader as api dataset = api.load ( "text8 ") data = [d for d dans dataset] def tagged_document (list_of_list_of_words): for i, list_of_words in enumerate (list_of_list_of_words): yield gensim.models.doc2vec.TaggedDocument (list_of_words, [i]) data_for_training = list (tagged_document (data)) print (data_for_training [: 1]) model = gensim.models.doc2vec.Doc2Vec (vector_size = 40, min_count = 2, epochsize = 30) model.build_vocab (data_training) model.train (data_training, total_examples = model.corpus_count, epochs = model.epochs) print (model.infer_vector ([ "violent ", "means ", "to " , "destroy ", "the ", "organization "])) Sortie [-0.2556166 0.4829361 0.17081228 0.10879577 0.12525807 0.10077011 -0,21383236 0,19294572 0,11864349 -0,03227958 -0,02207291 -0,7108424 0,07165232 0,24221905 -0,2924459 -0,03543589 0,21840079 0,05455418 -0,1274817 -0,28968817 -0,29146606 0,32885507 0,14689675 0,09340707 -0,06913587 -0,35173815 -0,3803535 -0,04030455 -0,10004586 0,22192696 0,2384828 -0,29779273 0,19236489 -0,25727913 0,09140676 0,01265439 0,08077634 - 0,06902497 -0,07175519 -0,22583418 -0,21653089 0,00347822 -0,34096122 -0,06176808 0,22885063 -0,37295452 -0,08222228 -0,03148199 -0,06487323 0,11387568]