2017-05-24 3 views
0

J'ai ce dataframe:Pandas dataframe à doc2vec.LabeledSentence

order_id product_id user_id   
    2   33120  u202279 
    2   28985  u202279 
    2   9327  u202279 
    4   39758  u178520 
    4   21351  u178520 
    5   6348  u156122 
    5   40878  u156122 

Type de user_id: String
Type de product_id: Entier

Je voudrais utiliser ce dataframe pour créer un corpus Doc2vec. Donc, je dois utiliser la fonction LabeledSentence pour créer un dict:
{tags: user_id, mots: tous ids produits commandés par chaque user_id}

Mais la forme la trame de données est (32434489, 3), donc je devrait éviter d'utiliser une boucle pour créer mon labelSentence.

J'essaye d'exécuter cette fonction (ci-dessous) avec le multitraitement mais c'est trop long. Avez-vous une idée pour transformer mon dataframe au bon format pour un corpus Doc2vec où le tag est user_id et les mots sont la liste des produits par user_id?

def append_to_sequences(i): 
    user_id = liste_user_id.pop(0) 
    liste_produit_userID = data.ix[data["user_id"]==user_id, "product_id"].astype(str).tolist() 
    return doc2vec.LabeledSentence(words=prd_user_list, tags=user_id) 

pool = multiprocessing.Pool(processes=3) 
result = pool.map_async(append_to_sequences, np.arange(len_liste_unique_user)) 
pool.close() 
pool.join() 
sentences = result.get() 

Répondre

1

L'utilisation du multitraitement est probablement excessive. Le forking des processus peut entraîner la duplication de toute la mémoire existante et impliquer des résultats de rassemblement de communication excédentaires dans le processus maître.

L'utilisation d'une boucle devrait être OK. 34 millions de lignes (et beaucoup moins de user_id s) est peu, selon votre RAM. Notez que dans les versions récentes de gensim, TaggedDocument est la classe préférée pour les exemples Doc2Vec.

Si nous supposons que vous avez une liste de tous les user_id uniques s dans liste_user_id, et une fonction (nouvelle, non représenté) qui obtient la liste-de-mots pour un user_id appelé words_for_user(), la création des documents pour Doc2Vec en la mémoire pourrait être aussi simple que:

documents = [TaggedDocument(words=words_for_user(uid), tags=[uid]) 
      for uid in liste_user_id] 

Notez que tags devrait être une liste de balises, pas une seule étiquette - même si dans bien des cas communs chaque document a une seule étiquette. (Si vous fournissez une seule étiquette de chaîne, elle affichera tags sous la forme d'une liste de caractères, ce qui n'est pas ce que vous voulez.)