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

43
demandé sur bee2502 2015-07-09 17:57:45

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.

33
répondu l.augustyniak 2015-10-28 23:21:45

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 alphamin_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
31
répondu Lenka Vraná 2017-10-19 15:37:08
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

24
répondu bee2502 2015-07-09 18:19:46