1

我有这个数据框:

    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  

类型 user_id :字符串
类型 product_id :整数

我想使用这个数据框来创建一个 Doc2vec 语料库。所以,我需要使用 LabeledSentence 函数来创建一个 dict :
{tags : user_id, words: all product idsorder by each user_id}

但是数据框的形状是 (32434489, 3),所以我应该避免使用循环来创建我的标记句子。

我尝试使用多处理运行此功能(如下),但太长了。

您是否知道将我的数据框转换为 Doc2vec 语料库的良好格式,其中标签是 user_id,单词是 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()
4

1 回答 1

2

使用多处理可能是矫枉过正。进程的分叉最终会复制所有现有内存,并涉及将过多的通信编组结果返回到主进程。

使用循环应该没问题。3400 万行(以及少得多的唯一user_ids)并不多,具体取决于您的 RAM。

请注意,在最新版本中, gensimTaggedDocument是 Doc2Vec 示例的首选类。

如果我们假设您有一个包含所有唯一user_ids in的列表liste_user_id,以及一个(新的,未显示的)函数来获取被调用的单词列表user_idwords_for_user()那么在内存中为 Doc2Vec 创建文档可能很简单:

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

请注意,它tags应该是标签列表,而不是单个标签——即使在许多常见情况下,每个文档只有一个标签。(如果您提供单个字符串标记,它将tags被视为字符列表,这不是您想要的。)

于 2017-05-24T17:26:02.633 回答