2015-07-09 13 views
37

Come ottenere i vettori di documenti di due documenti di testo utilizzando Doc2vec? Sono nuovo, quindi sarebbe utile se qualcuno mi indicasse nella giusta direzione/aiutami con qualche tutorialDoc2vec: come ottenere i vettori di documenti

Sto usando la libreria 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) 

ottengo AttributeError: 'list' oggetto non ha attributo 'parole' ogni volta che ho eseguito questo

risposta

23
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) 

Ho avuto AttributeError: 'list' oggetto non ha attributo 'parole', perché il i documenti di input per Doc2vec() non erano nel formato LabeledSentence corretto. Spero che questo esempio sottostante ti aiuti a capire il formato.

documents = LabeledSentence(words=[u'some', u'words', u'here'], labels=[u'SENT_1']) 

Maggiori dettagli sono qui: http://rare-technologies.com/doc2vec-tutorial/ Tuttavia, ho risolto il problema prendendo i dati di input da file usando TaggedLineDocument().
Formato file: un documento = una riga = un oggetto TaggedDocument. Le parole devono essere già preelaborate e separate da spazi bianchi, i tag vengono creati automaticamente dal numero di riga del documento.

sentences=doc2vec.TaggedLineDocument(file_path) 
model = doc2vec.Doc2Vec(sentences,size = 100, window = 300, min_count = 10, workers=4) 

Per ottenere il documento di vettore: È possibile utilizzare docvecs. Maggiori dettagli qui: https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.TaggedDocument

docvec = model.docvecs[99] 

dove 99 è l'ID del documento di cui vogliamo vettoriale. Se le etichette sono in formato intero (per impostazione predefinita, se carichi utilizzando TaggedLineDocument()), utilizza direttamente l'ID intero come ho fatto io. Se le etichette sono in formato stringa, utilizzare "SENT_99". È simile a Word2vec

+1

solo per confermare, dopo model_dm formazione e model_dbow come mostrato nella tutorial (https: //linanqiu.github.io/2015/05/20/word2vec-sentiment /) Ricevo il vettore del documento per il primo documento di formazione usando model_dm.docvecs ['TRAIN_0']. È corretto? – Sangram

+0

sì che è corretto e potresti quindi confrontare più documenti con una funzione di distanza, ecc. –

+2

I miei documenti di formazione più di 5m, tuttavia quando uso docvec = model.docvecs [11], ha mostrato che l'11 è il nostro limite per l'asse 0 con dimensione 10. Ho controllato la dimensione del docvecs, solo 10, si supponeva che fosse più di 5m – Kun

33

Gensim è stato aggiornato. La sintassi di LabeledSentence non contiene le etichette . Ora ci sono tag - vedi la documentazione per LabeledSentence https://radimrehurek.com/gensim/models/doc2vec.html

Tuttavia, @ bee2502 aveva ragione con

docvec = model.docvecs[99] 

Sarà dovrebbe il valore del vettore di 100 ° per il modello addestrato, funziona con i numeri interi e stringhe.

28

Se si desidera addestrare il modello Doc2Vec, il set di dati deve contenere elenchi di parole (simili al formato Word2Vec) e tag (id dei documenti). Può anche contenere alcune informazioni aggiuntive (vedere https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb per ulteriori informazioni).

# 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] 

UPDATE (come addestrare in epoche): funzione Doc2Vec contiene alpha e min_alpha parametri, ma che significa che il tasso di apprendimento decade durante un'epoca alpha-min_alpha. Per addestrare diverse epoche, impostare la velocità di apprendimento manualmente, in questo modo:

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 
+0

Mi piace molto l'idea di usare 'namedtuple' qui, ma cosa mi confonde se c'è un doc2? Sembra che il 'tag' sia un' id' per la frase e non per il documento. La lista di 'docs' fa sembrare che ci possa essere più di un documento. –

+0

In doc1 ci sono 2 documenti diversi (non due frasi in un documento). Non lo so, perché @ bee2502 ha chiamato questo come 'doc1'. Tuttavia, è possibile indovinare questo dalla riga 'documents1 = [doc.strip(). Split (" ") per doc in doc1]' –

+0

@ LenkaVraná Molti serbatoi per l'ottima risposta :) Dobbiamo addestrare il nostro modello doc2vec a diversi epoche ? Se è così, come possiamo fare nell'esempio sopra? –

Problemi correlati