我想知道是否可以在批处理模式下训练spark word2vec。或者换句话说,如果可以更新已经训练过的spark word2vec模型的词汇表。 我的申请是: 我的段落位于多个文件中,当我使用gensim我可以做
class MySentences(object):
def __init__(self, file_list, folder):
self.file_list = file_list
self.folder = folder
def __iter__(self):
for file in self.file_list:
if 'walk_' in file:
print file
with open(self.folder + file, 'r') as f:
for line in f:
yield line.split()
model = Word2Vec(MySentences(files, fileFolder), size=32, window=5, min_count=5, workers=15)
我甚至可以做到
for epoch in range(10):
model.train(MySentences(files, fileFolder))
我想知道如何在spark word2vec中做类似的事情。
在spark中,我发现我只能使用多个文件进行RDD联合:
from pyspark.mllib.feature import Word2Vec
from pyspark.sql import SQLContext
inp1 = sc.textFile("file1").map(lambda row: row.split('\t'))
inp2 = sc.textFile("file2").map(lambda row: row.split('\t'))
inp = sc.union([inp1,inp2])
word2vec = Word2Vec().setVectorSize(4).setMinCount(1)
model = word2vec.fit(inp)
否则,如果我使用inp1训练模型,然后是inp2,那么来自inp1的单词就会消失。
如果我不能在批处理模式下进行培训,我怎样才能在将来使用新段落更新经过培训的模型?
答案 0 :(得分:0)
我认为你可以:
for idx in range(1, 100, 1):
model = word2vec.fit(data.sample(False, 0.01))
model.save(sc, path)
在此示例中,不确定示例函数是否始终采用看不见的数据。