python - min_count - word2vec gensim
¿Cómo usar Gensim doc2vec con vectores de palabras pre-entrenados? (4)
Bueno, recientemente estoy usando Doc2Vec también. Y estaba pensando en usar el resultado de LDA como vector de palabras y corregir esos vectores de palabras para obtener un vector de documento. El resultado no es muy interesante. Tal vez es solo que mi conjunto de datos no es tan bueno. El código está abajo. Doc2Vec guarda vectores de palabras y vectores de documentos juntos en el diccionario doc2vecmodel.syn0. Puedes cambiar directamente los valores vectoriales. El único problema puede ser que necesita averiguar qué posición en syn0 representa qué palabra o documento. Los vectores se almacenan en orden aleatorio en el diccionario syn0.
import logging
logging.basicConfig(format=''%(asctime)s : %(levelname)s : %(message)s'', level=logging.INFO)
from gensim import corpora, models, similarities
import gensim
from sklearn import svm, metrics
import numpy
#Read in texts into div_texts(for LDA and Doc2Vec)
div_texts = []
f = open("clean_ad_nonad.txt")
lines = f.readlines()
f.close()
for line in lines:
div_texts.append(line.strip().split(" "))
#Set up dictionary and MMcorpus
dictionary = corpora.Dictionary(div_texts)
dictionary.save("ad_nonad_lda_deeplearning.dict")
#dictionary = corpora.Dictionary.load("ad_nonad_lda_deeplearning.dict")
print dictionary.token2id["junk"]
corpus = [dictionary.doc2bow(text) for text in div_texts]
corpora.MmCorpus.serialize("ad_nonad_lda_deeplearning.mm", corpus)
#LDA training
id2token = {}
token2id = dictionary.token2id
for onemap in dictionary.token2id:
id2token[token2id[onemap]] = onemap
#ldamodel = models.LdaModel(corpus, num_topics = 100, passes = 1000, id2word = id2token)
#ldamodel.save("ldamodel1000pass.lda")
#ldamodel = models.LdaModel(corpus, num_topics = 100, id2word = id2token)
ldamodel = models.LdaModel.load("ldamodel1000pass.lda")
ldatopics = ldamodel.show_topics(num_topics = 100, num_words = len(dictionary), formatted = False)
print ldatopics[10][1]
print ldatopics[10][1][1]
ldawordindex = {}
for i in range(len(dictionary)):
ldawordindex[ldatopics[0][i][1]] = i
#Doc2Vec initialize
sentences = []
for i in range(len(div_texts)):
string = "SENT_" + str(i)
sentence = models.doc2vec.LabeledSentence(div_texts[i], labels = [string])
sentences.append(sentence)
doc2vecmodel = models.Doc2Vec(sentences, size = 100, window = 5, min_count = 0, dm = 1)
print "Initial word vector for word junk:"
print doc2vecmodel["junk"]
#Replace the word vector with word vectors from LDA
print len(doc2vecmodel.syn0)
index2wordcollection = doc2vecmodel.index2word
print index2wordcollection
for i in range(len(doc2vecmodel.syn0)):
if index2wordcollection[i].startswith("SENT_"):
continue
wordindex = ldawordindex[index2wordcollection[i]]
wordvectorfromlda = [ldatopics[j][wordindex][0] for j in range(100)]
doc2vecmodel.syn0[i] = wordvectorfromlda
#print doc2vecmodel.index2word[26841]
#doc2vecmodel.syn0[0] = [0 for i in range(100)]
print "Changed word vector for word junk:"
print doc2vecmodel["junk"]
#Train Doc2Vec
doc2vecmodel.train_words = False
print "Initial doc vector for 1st document"
print doc2vecmodel["SENT_0"]
for i in range(50):
print "Round: " + str(i)
doc2vecmodel.train(sentences)
print "Trained doc vector for 1st document"
print doc2vecmodel["SENT_0"]
#Using SVM to do classification
resultlist = []
for i in range(4143):
string = "SENT_" + str(i)
resultlist.append(doc2vecmodel[string])
svm_x_train = []
for i in range(1000):
svm_x_train.append(resultlist[i])
for i in range(2210,3210):
svm_x_train.append(resultlist[i])
print len(svm_x_train)
svm_x_test = []
for i in range(1000,2210):
svm_x_test.append(resultlist[i])
for i in range(3210,4143):
svm_x_test.append(resultlist[i])
print len(svm_x_test)
svm_y_train = numpy.array([0 for i in range(2000)])
for i in range(1000,2000):
svm_y_train[i] = 1
print svm_y_train
svm_y_test = numpy.array([0 for i in range(2143)])
for i in range(1210,2143):
svm_y_test[i] = 1
print svm_y_test
svc = svm.SVC(kernel=''linear'')
svc.fit(svm_x_train, svm_y_train)
expected = svm_y_test
predicted = svc.predict(svm_x_test)
print("Classification report for classifier %s:/n%s/n"
% (svc, metrics.classification_report(expected, predicted)))
print("Confusion matrix:/n%s" % metrics.confusion_matrix(expected, predicted))
print doc2vecmodel["junk"]
Hace poco me encontré con la adición de doc2vec a Gensim. ¿Cómo puedo usar vectores de palabras pre-entrenados (p. Ej., Encontrados en el sitio web original de word2vec) con doc2vec?
¿O es que doc2vec obtiene los vectores de palabras de las mismas oraciones que usa para la capacitación de vectores de párrafos?
Gracias.
Radim acaba de publicar un tutorial sobre las características doc2vec de gensim (ayer, creo, ¡tu pregunta es oportuna!).
Gensim admite la carga de vectores pre-entrenados desde la implementación de C , como se describe en la documentación de la API de gensim models.word2vec .
Esta versión bifurcada de gensim permite cargar vectores de palabras pre-entrenados para entrenar doc2vec. Here tienes un ejemplo sobre cómo usarlo. Los vectores de palabras deben estar en el formato de texto de la herramienta C-word2vec: una línea por vector de palabras donde primero aparece una cadena que representa la palabra y luego los valores flotantes separados por espacios, uno para cada dimensión de la incrustación.
Este trabajo pertenece a un paper en el que afirman que el uso de incrustaciones de palabras pre-entrenadas realmente ayuda a construir los vectores de documentos. Sin embargo, estoy obteniendo casi los mismos resultados, no importa si cargué las incrustaciones previamente entrenadas o no.
Edición: en realidad hay una diferencia notable en mis experimentos. Cuando cargué las incrustaciones pre entrenadas, entrené a doc2vec para que la mitad de las iteraciones obtuvieran casi los mismos resultados (entrenar durante más tiempo que eso produjo peores resultados en mi tarea).
Tenga en cuenta que el modo de entrenamiento "DBOW" ( dm=0
) no requiere ni crea vectores de palabras como parte del entrenamiento. Simplemente aprende vectores de documentos que son buenos para predecir cada palabra a su vez (como el modo de entrenamiento skip-gram de word2vec).
(Antes de gensim 0.12.0, estaba el parámetro train_words
mencionado en otro comentario, en el que algunos documentos sugeridos co-entrenarán palabras. Sin embargo, no creo que esto haya funcionado realmente. A partir de gensim 0.12.0, existe el parámetro dbow_words
, que funciona para omitir palabras de entrenamiento de gramo simultáneamente con docs-vectores DBOW. Tenga en cuenta que esto hace que la capacitación sea más prolongada, por un factor relacionado con la window
. Por lo tanto, si no necesita vectores de palabras, todavía puede dejar esto apagado. )
En el método de entrenamiento "DM" ( dm=1
), los vectores de palabras se entrenan de manera inherente durante el proceso junto con los vectores de documentos, y es probable que también afecten la calidad de los vectores de documentos. Teóricamente es posible preinicializar los vectores de palabras de datos anteriores. Pero no conozco ninguna razón teórica o experimental sólida para confiar en que esto mejoraría los doc-vectores.
Un experimento fragmentario que hice a lo largo de estas líneas sugirió que el entrenamiento doc-vector tuvo un inicio más rápido, mejores cualidades predictivas después de los primeros pasos, pero esta ventaja se desvaneció con más pases. Si mantiene los vectores de palabras constantes o los permite que sigan ajustándose con la nueva capacitación, es probable que también sea una consideración importante ... pero qué opción es mejor puede depender de sus objetivos, el conjunto de datos y la calidad / relevancia de los preexistentes. vectores de palabras.
(Podría repetir mi experimento con el método intersect_word2vec_format()
disponible en gensim 0.12.0, y probar diferentes niveles para hacer que los vectores precargados sean resistentes al entrenamiento nuevo a través de los valores syn0_lockf
. Pero recuerde que esto es un territorio experimental: el básico Los resultados de doc2vec no dependen de, o incluso mejoran necesariamente con, vectores de palabras reutilizados.)