Gensim - Vecteur et modèle

Ici, nous allons découvrir les concepts de base de Gensim, avec un accent principal sur le vecteur et le modèle.

Qu'est-ce que le vecteur?

Et si nous voulons déduire la structure latente de 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 fonctionnalité, de notre corpus utilisé ci-dessus, comme une paire QA -

Q - Combien de fois le mot Hello apparaissent 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 dedensevecteur. Pourquoidense, car il comprend une réponse explicite à toutes les questions écrites ci-dessus.

La représentation peut être un simple comme (0, 2), si nous connaissons toutes les questions à l'avance. Une telle séquence de réponses (bien sûr si les questions sont connues à l'avance) est lavector pour 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 décompte de fréquence de chaque mot du dictionnaire.

Pour vous donner un exemple, supposons que nous ayons un dictionnaire contenant les mots ['Hello', 'How', 'are', 'you']. 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 «Hello», «How», «are» et «you».

Vecteur contre document

D'après l'explication ci-dessus du vecteur, la distinction entre un document et un vecteur est presque comprise. Mais, pour être plus clair,document est du texte et vectorest une représentation mathématiquement pratique de ce texte. Malheureusement, il arrive que de nombreuses personnes 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 liste de 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

from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

Production

Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)

Cela montre que dans notre corpus il y a 25 jetons différents dans ce gensim.corpora.Dictionary.

Exemple d'implémentation

Nous pouvons utiliser le dictionnaire pour transformer des documents tokenisés en ces vecteurs 5-diemsional comme suit -

pprint.pprint(dictionary.token2id)

Production

{
   'binary': 11,
   'computer': 0,
   'error': 7,
   'generation': 12,
   'graph': 16,
   'intersection': 17,
   'iv': 19,
   'measurement': 8,
   'minors': 20,
   'opinion': 1,
   'ordering': 21,
   'paths': 18,
   'perceived': 9,
   'quasi': 22,
   'random': 13,
   'relation': 10,
   'response': 2,
   'survey': 3,
   'system': 4,
   'time': 5,
   'trees': 14,
   'unordered': 15,
   'user': 6,
   'well': 23,
   'widths': 24
}

Et de même, nous pouvons créer la représentation en sac de mots pour un document comme suit -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

Production

[
   [(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, nous pouvons donc, bien que modéliser comme une transformation entre deux espaces vectoriels. 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 de formation pendant la phase de formation.

Initialiser un modèle

Initialisons tf-idfmodèle. 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-idfmodèle. Nous allons l'entraîner sur notre corpus puis transformer la chaîne «arbre graph».

Exemple

from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])

Production

[(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 document de requête (nous donnons le document de requête `` système d'arbres '') avec chaque document du corpus -

Exemple

from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))

Production

[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]

D'après les résultats ci-dessus, le document 4 et le document 5 ont un score de similitude d'environ 49%.

De plus, nous pouvons également trier cette sortie pour plus de lisibilité comme suit -

Exemple

for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
   print(doc_number, score)

Production

2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0