Python 将数据帧转换为doc2vec.LabeledSentence

Python 将数据帧转换为doc2vec.LabeledSentence,python,pandas,dataframe,word2vec,doc2vec,Python,Pandas,Dataframe,Word2vec,Doc2vec,我有这个数据框: order_id product_id user_id 2 33120 u202279 2 28985 u202279 2 9327 u202279 4 39758 u178520 4 21351 u178520 5

我有这个数据框:

    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  
键入用户id:String
类型产品\u id:Integer

我想用这个数据框创建一个Doc2vec语料库。因此,我需要使用LabeledSentence函数来创建dict:
{标记:用户id,单词: 每个用户订购的所有产品标识_id}

但是数据框形状的最大值是(32434489,3),所以我应该避免使用循环来创建我的LabeledEntence

我尝试使用多处理运行此函数(如下),但太长

你有没有想过将我的数据帧转换成Doc2vec语料库的良好格式,其中标记是用户id,单词是按用户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()

使用多处理可能有些过分。进程的分叉可能会复制所有现有内存,并将多余的通信编组结果返回到主进程中

使用循环应该可以。3400万行(以及更少的唯一
user\u id
s)并没有那么多,这取决于您的RAM

请注意,在最新版本的gensim
TaggedDocument
中,Doc2Vec示例的首选类

如果我们假设您在
liste\u user\u id
中有一个所有唯一
user\u id
的列表,以及一个(新的,未显示)函数,该函数获取
user\u id
的单词列表,称为
words\u for\u user()
,那么在内存中为Doc2Vec创建文档可能非常简单:

documents = [TaggedDocument(words=words_for_user(uid), tags=[uid])
             for uid in liste_user_id]
请注意,
tags
应该是标签列表,而不是单个标签–即使在许多常见情况下,每个文档只有一个标签。(如果提供单个字符串标记,它会将
标记
视为字符列表,而这不是您想要的。)