Pandas 数据帧到 doc2vec.LabeledSentence

Pandas dataframe to 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  

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

我想使用这个数据框来创建一个 Doc2vec 语料库。所以,我需要使用 LabeledSentence 函数来创建一个字典:
{标签:user_id,单词: 每个 user_id}

订购的所有产品 ID

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

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

你有没有想过将我的数据框转换为 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()

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

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

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

如果我们假设您有一个包含 liste_user_id 中所有唯一 user_id 的列表,以及一个(新的,未显示的)函数,它获取 [= =11=] 调用了 words_for_user(),在内存中为 Doc2Vec 创建文档可以像这样简单:

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

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