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
请注意,在最新版本的gensimTaggedDocument
中,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
应该是标签列表,而不是单个标签–即使在许多常见情况下,每个文档只有一个标签。(如果提供单个字符串标记,它会将标记
视为字符列表,而这不是您想要的。)