2017-08-02 9 views
0

J'utilise le modèle de DocosVec pour générer mes vecteurs de caractéristiques. Voici le code que je utilise (je l'ai expliqué ce que mon problème est dans le code):Le modèle Gensim Doc2Vec ne génère qu'un nombre limité de vecteurs

cores = multiprocessing.cpu_count() 

# creating a list of tagged documents 
training_docs = [] 

# all_docs: a list of 53 strings which are my documents and are very long (not just a couple of sentences) 
for index, doc in enumerate(all_docs): 
    # 'doc' is in unicode format and I have already preprocessed it 
    training_docs.append(TaggedDocument(doc.split(), str(index+1))) 

# at this point, I have 53 strings in my 'training_docs' list 

model = Doc2Vec(training_docs, size=400, window=8, min_count=1, workers=cores) 

# now that I print the vectors, I only have 10 vectors while I should have 53 vectors for the 53 documents that I have in my training_docs list. 
print(len(model.docvecs)) 
# output: 10 

Je me demande si je fais une erreur ou s'il y a un autre paramètre que je mis?

MISE À JOUR: Je joue avec les balises paramètre dans TaggedDocument, et quand je l'ai changé à un mélange de texte et des chiffres comme: Doc1, Doc2, ... Je vois un nombre différent pour le nombre de vecteurs générés, mais je n'ai toujours pas le même nombre de vecteurs de caractéristiques que prévu.

Répondre

1

Regardez les balises réelles qu'il a découvert dans votre corps:

print(model.docvecs.offset2doctag) 

Voyez-vous un modèle?

La propriété tags de chaque document doit être une liste d'étiquettes , pas une seule étiquette. Si vous fournissez une simple chaîne de nombres entiers, elle la verra comme une liste de chiffres et n'apprendra donc que les étiquettes '0', '1', ..., '9'.

Vous pouvez remplacer str(index+1) par [str(index+1)] et obtenir le comportement attendu. Mais, puisque vos ID de document ne sont que des nombres entiers ascendants, vous pouvez également utiliser des entiers Python simples comme doctags. Cela permettra d'économiser de la mémoire, acheter en évitant la création d'une dict de recherche de string-tag à array-slot (int). Pour ce faire, remplacez le str(index+1) par [index]. (Cela démarre les doc-ID de 0 - ce qui est un peu plus Pythonic, et évite également de gaspiller une position 0 inutilisée dans le tableau brut qui contient les vecteurs formés.)