環境
ストリーミングデータWord2Vec
を使用gensim
してトレーニングする方法については、いくつかの質問があります。とにかく、これらの質問は、スレッド間で分割する配列がないため、ストリーミングで複数のワーカーを使用できないという問題を扱っていません。
したがって、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:ハッシュ不可能なタイプ: 'リスト'
dataGenerator(data)
分割されたドキュメントを1つだけ生成すれば機能するので、gensimsword2vec
はジェネレーターを追加のリストにラップしていると思います。この場合、次の__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で処理できない(=>リストのリストのリスト)のようなものになります。
私の質問:
複数のワーカーを使用するためにバッチを「ストリーミング」パスすることはできますか?それに応じてコードを変更するにはどうすればよいですか?
焦りすぎたようです。上記のストリーミング関数を実行しました。この関数は、バッチではなく1つのドキュメントのみを処理します。
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
-functionを開始してから、すべてのコアが正しく機能するまで約10分かかりました。
語彙の構築は複数のコアをサポートしていないようであるため、このタスクには1つだけが使用されました。おそらく、コーパスサイズのためにとても時間がかかりました。gensimが語彙を作成した後、すべてのコアがトレーニングに使用されました。
したがって、この問題でも実行している場合は、ある程度の忍耐がすでに役立つかもしれません:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加