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
视为字符列表,这不是您想要的。)
我有这个数据框:
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}
但是数据框的形状是 (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
视为字符列表,这不是您想要的。)