gpt4 book ai didi

python - 在多个工作人员的支持下,在 gensim 中批量训练 word2vec

转载 作者:行者123 更新时间:2023-12-01 06:55:37 26 4
gpt4 key购买 nike

上下文

关于如何使用 gensim 和流数据训练 Word2Vec 存在几个问题。无论如何,这些问题并没有解决流不能使用多个工作线程的问题,因为没有数组可以在线程之间分割。

因此我想创建一个为 gensim 提供此类功能的生成器。我的结果如下:

from gensim.models import Word2Vec as w2v

#The data is stored in a python-list and unsplitted.
#It's too much data to store it splitted, so I have to do the split while streaming.
data = ['this is document one', 'this is document two', ...]

#Now the generator-class
import threading

class dataGenerator:
"""
Generator for batch-tokenization.
"""

def __init__(self, data: list, batch_size:int = 40):
"""Initialize generator and pass data."""

self.data = data
self.batch_size = batch_size
self.lock = threading.Lock()


def __len__(self):
"""Get total number of batches."""
return int(np.ceil(len(self.data) / float(self.batch_size)))


def __iter__(self) -> list([]):
"""
Iterator-wrapper for generator-functionality (since generators cannot be used directly).
Allows for data-streaming.
"""
for idx in range(len(self)):
yield self[idx]


def __getitem__(self, idx):

#Make multithreading thread-safe
with self.lock:

# Returns current batch by slicing data.
return [arr.split(" ") for arr in self.data[idx * self.batch_size : (idx + 1) * self.batch_size]]


#And now do the training
model = w2v(
sentences=dataGenerator(data),
size=300,
window=5,
min_count=1,
workers=4
)

这会导致错误

TypeError: unhashable type: 'list'

由于如果我只生成一个拆分文档,dataGenerator(data) 就可以工作,因此我假设 gensims word2vec 将生成器包装在一个额外的列表中。在这种情况下,__iter__ 看起来像:

def __iter__(self) -> list:
"""
Iterator-wrapper for generator-functionality (since generators cannot be used directly.
Allows for data-streaming.
"""
for text in self.data:
yield text.split(" ")

因此,我的批处理也会被包装,导致类似于 [[['this', '...'], ['this', '...']], [[... ], [...]]] (=> 列表的列表的列表),gensim 无法处理。




我的问题:

我可以“流”传递批处理以使用多个工作人员吗?我怎样才能相应地更改我的代码?

最佳答案

看来我太不耐烦了。我运行了上面写的流函数,它只处理一个文档而不是一批:

def __iter__(self) -> list:
"""
Iterator-wrapper for generator-functionality (since generators cannot be used directly.
Allows for data-streaming.
"""
for text in self.data:
yield text.split(" ")

启动w2v功能后,大约需要十分钟时间,直到所有核心都正常工作。

构建词汇表似乎不支持多个核心,因此仅使用一个核心来完成此任务。据推测,由于语料库的大小,花了这么长时间。 gensim 构建词汇后,所有核心都用于训练。

因此,如果您也遇到这个问题,也许一些耐心会有所帮助:)

关于python - 在多个工作人员的支持下,在 gensim 中批量训练 word2vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58822292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com