2017-01-12 2 views
-3

Selon ce tutoriel github: gensim/docs/notebooks/doc2vec-lee.ipynb Je suis censé obtenir environ 96% de précision.gensim/docs/notebooks/doc2vec-lee.ipynb les résultats ne sont pas répétables

Voici le code utilisant le gensim 0.13.4 sur jupyter 4.3.1 tout d'Anaconda Navigator.

import gensim 
import os 
import collections 
import smart_open 
import random 


# Set file names for train data 
test_data_dir='{}'.format(os.sep).join \ 
([gensim.__path__[0],'test','test_data']) 
lee_train_file = test_data_dir + os.sep + 'lee_background.cor' 

def read_corpus(fname, tokens_only=False): 
    with smart_open.smart_open(fname, encoding="iso-8859-1") as f: 
     for i, line in enumerate(f): 
      if tokens_only: 
       yield gensim.utils.simple_preprocess(line) 
      else: 
       # For training data, add tags 
       yield gensim.models.doc2vec.TaggedDocument \ 
         (gensim.utils.simple_preprocess(line), [i]) 
train_corpus = list(read_corpus(lee_train_file)) 
model = gensim.models.doc2vec.Doc2Vec(size=50, min_count=2, iter=10) 
model.build_vocab(train_corpus) 
model.train(train_corpus) 

ranks = [] 
second_ranks = [] 
for doc_id in range(len(train_corpus)): 
    inferred_vector = model.infer_vector(train_corpus[doc_id].words) 
    sims = model.docvecs.most_similar([inferred_vector] \ 
      , topn=len(model.docvecs)) 
    rank = [docid for docid, sim in sims].index(doc_id) 
    ranks.append(rank) 
    second_ranks.append(sims[1]) 
collections.Counter(ranks) 

Dans le tutoriel pour l'évaluation du modèle:

Leur sortie est:

Counter({0: 292, 1: 8}) 

Je reçois

Counter({0: 31, 
    1: 24, 
    2: 16, 
    3: 19, 
    4: 16, 
    5: 8, 
    6: 8, 
    7: 10, 
    8: 7, 
    9: 10, 
    10: 12, 
    11: 12, 
    12: 5, 
    13: 9, 
     ... 

Pourquoi je ne reçois pas quoi que ce soit près de leur précision?

+0

Bienvenue sur SO! Votre question manque de formatage de base et il n'est pas clair ce que vous demandez. Essayez d'éditer la question et montrez les étapes que vous prenez pour résoudre le problème. Évitez également de faire référence à des liens externes, à moins que cela ne soit absolument nécessaire. S'il vous plaît lire: http://stackoverflow.com/help/how-to-ask – bman

Répondre

0

Merci de l'avoir remarqué. La précision et les documents similaires varient beaucoup sur un si petit corpus en raison d'une initialisation aléatoire et de différentes bibliothèques numériques d'OS. J'ai supprimé la référence à l'exactitude dans le tutoriel.

Il faut un corpus important et des dizaines d'heures de formation pour obtenir des résultats doc2vec reproductibles.

également answered sur la liste de diffusion Gensim

0

J'apprécie la réponse de @Lev Konst ci-dessus. Comme il l'a également mentionné, il est répondu sur la liste de diffusion Gensim.

modèle

= gensim.models.doc2vec.Doc2Vec (size = 55, min_count = 2, iter = 60, hs = 1, négatif = 0) produit:

Wall time: 12.5 s 
Counter({0: 292, 1: 8}) 
Wall time: 12 s 
Counter({0: 291, 1: 9}) 
Wall time: 16.4 s 
Counter({0: 290, 1: 10}) 
Wall time: 20.6 s 
Counter({0: 295, 1: 5}) 
Wall time: 21.3 s 
Counter({0: 292, 1: 8}) 
Wall time: 20.6 s 
Counter({0: 292, 1: 8}) 
Wall time: 16.7 s 
Counter({0: 296, 1: 4}) 
Wall time: 15.4 s 
Counter({0: 292, 1: 8}) 
Wall time: 15.3 s 
Counter({0: 295, 1: 5}) 
Wall time: 14.8 s 
Counter({0: 292, 1: 8}) 

Il semblerait que soit augmenter les itérations et/ou ajouter hs = 1, soit négatif = 0 donnera des résultats plus proches de ceux du cahier.

Le hs = 1, négatif = 0 semble donner de meilleurs résultats en moyenne. Si on augmente simplement les itérations, alors sur certaines courses il y aura des rangs autres que 0 ou 1.

Cependant, comme on peut le voir avec hs = 1, negative = 0, les classements sont tous dans les deux premiers rangs.

Cependant, j'ai été informé sur la liste des groupes google de gensim qu'avec un ensemble de données de cette taille moins que la précision optimale et plus de variation sont à prévoir.

googlegroups discussion

merci john