将 gensim 与 pyarrow 可迭代一起使用

问题描述 投票:0回答:1

考虑这段代码

import pyarrow.parquet as pq
from gensim.models import Word2Vec

parquet_file = pq.ParquetFile('/mybigparquet.pq')
for i in parquet_file.iter_batches(batch_size=100):
    print("training on batch")
    batch =  i.to_pandas()
  
    model = Word2Vec(sentences= batch.tokens, vector_size=100, window=5, workers=40, min_count = 10,epochs = 10)

如您所见,我正在尝试使用一个非常大的 parquet 文件来训练

word2vec
模型,该文件不完全适合我的 RAM。我知道
gensim
可以对可迭代对象(不是生成器,因为数据需要在 word2vec 中扫描两次)进行操作,并且我知道
pyarrow
允许我从文件生成批次(甚至一行)。

但是,此代码无法正常工作。我想我需要将我的

pyarrow
循环编写为适当的生成器,但我不知道该怎么做。

你觉得怎么样? 谢谢!

python gensim pyarrow
1个回答
0
投票

您在循环的每次迭代中都会创建一个新模型,因此最多,您最终只能得到上次迭代中的一个

model
– 可能不是您想要的。

相反,您需要为

Word2Vec
提供它想要的可重复迭代的 Python 序列,其中每个项目都是字符串单词标记的 Python 列表。

除非

pyarrow
/etc 中存在某些内容,否则这可能意味着您自己的类,它实现了 Python“可迭代”接口,因此每次向其请求 iterator 时,它都会开始新的迭代。这是一篇关于可迭代如何工作的合理文章部分。您可能会使用生成器模式来实现此目的,如同一篇文章后面中提到的。

(本质上:您的

__iter__()
特殊函数将开始迭代,并循环批次,始终使用
yield
返回下一个项目。如果您的类专门用作 Gensim
Word2Vec
语料库,则每个项目生成的应该是带有字符串标记的 Python
list
。)

如果您确实只使用名为“令牌”的一列,则无需通过 Pandas 进行转换

DataFrame
- 这只是额外的转换/存储开销。只需确保以正确的方式处理感兴趣的一列 - 如果每个条目已经是 Python 字符串列表,那就没问题,但如果它是字符串,则可能必须分解为令牌列表。

如果做得正确,您只需将整个语料库的可迭代对象传递到

Word2Vec
类一次 - 然后它会在训练所需的多次传递中读取它,因为它需要通过请求重复迭代来读取它。 (它不知道数据来自哪里,也不知道迭代器是如何实现的。它只知道它有一个可以从中请求迭代器的对象,并且该迭代器为它提供了每个正确类型的项目之一
next()
,直到到达一次迭代结束。)

© www.soinside.com 2019 - 2024. All rights reserved.