【问题标题】:Pandas dataframe to doc2vec.LabeledSentencePandas 数据框到 doc2vec.LabeledSentence
【发布时间】:2017-10-24 13:45:25
【问题描述】:

我有这个数据框:

    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),所以我应该避免使用循环来创建我的标记句子。

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

您是否有任何想法将我的数据框转换为 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()

【问题讨论】:

    标签: python pandas dataframe word2vec doc2vec


    【解决方案1】:

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

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

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

    如果我们假设您拥有liste_user_id 中所有唯一user_ids 的列表,以及一个(新的,未显示的)函数,该函数用于获取user_id 的单词列表,称为words_for_user() ,在内存中为 Doc2Vec 创建文档可能很简单:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 2014-07-28
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多