Doc2vec: comment obtenir des vecteurs de documents
comment obtenir les vecteurs de documents de deux documents textuels en utilisant Doc2vec? Je suis nouveau à cela, il serait utile si quelqu'un pouvait me pointer dans la bonne direction/m'aider avec quelques tutoriel
j'utilise la bibliothèque gensim python.
doc1=["This is a sentence","This is another sentence"]
documents1=[doc.strip().split(" ") for doc in doc1 ]
model = doc2vec.Doc2Vec(documents1, size = 100, window = 300, min_count = 10, workers=4)
je AttributeError: l'objet' list 'n'a pas d'attribut 'words' chaque fois que j'exécute ce
3 réponses
Gensim a été mis à jour. La syntaxe de LabeledSentence ne contient pas étiquettes. Il y a maintenant les balises - voir la documentation pour la présence en laboratoire https://radimrehurek.com/gensim/models/doc2vec.html
cependant, @bee2502 avait raison avec
docvec = model.docvecs[99]
il fonctionnera si la valeur du 100ème vecteur pour le modèle entraîné, il fonctionne avec des entiers et des chaînes.
si vous voulez former le modèle Doc2Vec, votre ensemble de données doit contenir des listes de mots (similaires au format Word2Vec) et des balises (id des documents). Il peut également contenir des informations supplémentaires (voir https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb pour plus d'informations).
# Import libraries
from gensim.models import doc2vec
from collections import namedtuple
# Load data
doc1 = ["This is a sentence", "This is another sentence"]
# Transform data (you can add more data preprocessing steps)
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for i, text in enumerate(doc1):
words = text.lower().split()
tags = [i]
docs.append(analyzedDocument(words, tags))
# Train model (set min_count = 1, if you want the model to work with the provided example data set)
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4)
# Get the vectors
model.docvecs[0]
model.docvecs[1]
mise à jour (comment s'entraîner en epochs):
La fonction Doc2Vec contient alpha
et min_alpha
les paramètres, mais cela signifie que le taux d'apprentissage se décompose une époque de alpha
min_alpha
. Pour former plusieurs époques, de définir le taux d'apprentissage manuellement, comme ceci:
from gensim.models import doc2vec
import random
alpha_val = 0.025 # Initial learning rate
min_alpha_val = 1e-4 # Minimum for linear learning rate decay
passes = 15 # Number of passes of one document during training
alpha_delta = (alpha_val - min_alpha_val) / (passes - 1)
model = doc2vec.Doc2Vec( size = 100 # Model initialization
, window = 300
, min_count = 1
, workers = 4)
model.build_vocab(docs) # Building vocabulary
for epoch in range(passes):
# Shuffling gets better results
random.shuffle(docs)
# Train
model.alpha, model.min_alpha = alpha_val, alpha_val
model.train(docs)
# Logs
print('Completed pass %i at alpha %f' % (epoch + 1, alpha_val))
# Next run alpha
alpha_val -= alpha_delta
doc=["This is a sentence","This is another sentence"]
documents=[doc.strip().split(" ") for doc in doc1 ]
model = doc2vec.Doc2Vec(documents, size = 100, window = 300, min_count = 10, workers=4)
J'ai obtenu AttributeError: l'objet ' list 'n'a pas d'attribut' words ' parce que les documents d'entrée de Doc2vec() n'étaient pas dans le bon format LabeledSentence. J'espère que cet exemple ci-dessous vous aidera à comprendre le format.
documents = LabeledSentence(words=[u'some', u'words', u'here'], labels=[u'SENT_1'])
Plus de détails ici : http://rare-technologies.com/doc2vec-tutorial/
Cependant, j'ai résolu le problème en prenant les données d'entrée du fichier en utilisant TaggedLineDocument().
Format de fichier: un document = une ligne = un Objet TaggedDocument.
On s'attend à ce que les mots soient déjà pré-traités et séparés par des espaces, les balises sont construites automatiquement à partir du numéro de ligne du document.
sentences=doc2vec.TaggedLineDocument(file_path)
model = doc2vec.Doc2Vec(sentences,size = 100, window = 300, min_count = 10, workers=4)
pour obtenir le vecteur de document : Vous pouvez utiliser docvecs. Plus de détails ici : https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.TaggedDocument
docvec = model.docvecs[99]
où 99 est l'identifiant du document dont nous voulons le vecteur. Si les étiquettes sont au format entier (par défaut, si vous chargez en utilisant TaggedLineDocument ()), utilisez directement integer id comme je l'ai fait. Si les étiquettes sont au format string, utilisez "SENT_99".Ceci est similaire à Word2vec