2017-10-04 4 views
1

Je suis en train d'obtenir la fonction de doc2vec travailler en python 3. -je avoir le code suivant:application de la fonction similaire dans Gensim.Doc2Vec

tekstdata = [[ index, str(row["StatementOfTargetFiguresAndPoliciesForTheUnderrepresentedGender"])] for index, row in data.iterrows()] 
def prep (x): 
    low = x.lower() 
    return word_tokenize(low) 

def cleanMuch(data, clean): 
    output = [] 
    for x, y in data: 
     z = clean(y) 
     output.append([str(x), z]) 
    return output 

tekstdata = cleanMuch(tekstdata, prep) 

def tagdocs(docs): 
    output = []  
    for x,y in docs: 
     output.append(gensim.models.doc2vec.TaggedDocument(y, x)) 
    return output 
    tekstdata = tagdocs(tekstdata) 

    print(tekstdata[100]) 

vectorModel = gensim.models.doc2vec.Doc2Vec(tekstdata, size = 100, window = 4,min_count = 3, iter = 2) 


ranks = [] 
second_ranks = [] 
for x, y in tekstdata: 
print (x) 
print (y) 
inferred_vector = vectorModel.infer_vector(y) 
sims = vectorModel.docvecs.most_similar([inferred_vector], topn=1001, restrict_vocab = None) 
rank = [docid for docid, sim in sims].index(y) 
ranks.append(rank) 

Tout fonctionne pour autant que je peux comprendre jusqu'à ce que le rang fonction. L'erreur que je reçois est qu'il n'y a pas de zéro dans ma liste, par exemple. les documents que je suis en train de mettre en n'a pas 10 dans la liste:

File "C:/Users/Niels Helsø/Documents/github/Speciale/Test/Data prep.py", line 59, in <module> 
rank = [docid for docid, sim in sims].index(y) 

ValueError: '10' is not in list 

Il me semble que c'est la fonction similaire qui ne fonctionne pas. le modèle s'entraîne sur mes données (1000 documents) et construit un vocab qui est étiqueté. La documentation que j'ai principalement utilisé est le suivant: Gensim dokumentation Torturial

J'espère que quelqu'un peut aider. Si des informations supplémentaires sont nécessaires s'il vous plaît faites le moi savoir. mieux Niels

Répondre

0

Si vous obtenez ValueError: '10' is not in list, vous pouvez compter sur le fait que '10' est pas dans la liste. Avez-vous regardé la liste, pour voir ce qu'il y a, et si cela correspond à ce que vous attendiez?

Il n'est pas clair à partir de vos extraits de code que tagdocs() est jamais appelé, et donc pas clair quelle forme est tekstdata lorsqu'il est fourni à Doc2Vec. L'intention est un peu compliquée, et il n'y a rien pour afficher ce que les données apparaissent sous sa forme brute et originale.

Mais peut-être le tags que vous fournissez à TaggedDocument ne sont pas la liste de balises requise, mais plutôt une chaîne simple, qui sera interprétée comme une liste de caractères. Par conséquent, même si vous fournissez un tags de '10', il sera considéré comme ['1', '0'] - et len(vectorModel.doctags) sera juste 10 (pour les 10 chaînes à un seul chiffre).

commentaires séparés sur votre configuration:

  • 1000 documents est assez petit pour Doc2Vec, où les résultats les plus publiés utilisent des dizaines de milliers à des millions de documents
  • un iter de 10-20 est plus fréquent dans Doc2Vec travail (et même des valeurs plus grandes pourraient être utiles avec des jeux de données plus petits)
  • infer_vector() fonctionne souvent mieux avec des valeurs non-par défaut dans ses paramètres facultatifs, en particulier un steps qui est beaucoup plus grand (20-200) ou unde départcela ressemble plus à la valeur par défaut de formation en vrac (0.025)
+1

Merci gojomo. Vous avez travaillé. Meilleur –