我有一个大约1000万个句子的列表,每个句子最多包含70个单词。在
我对每个单词运行gensim word2vec,然后计算每个句子的简单平均值。问题是我使用min_count=1000,所以很多单词不在vocab中。在
为了解决这个问题,我将vocab数组(包含大约10000个单词)与每个句子相交,如果这个交集中至少还有一个元素,它将返回它的简单平均值,否则,它将返回一个零向量。在
问题是,当我在整个数据集上运行平均值时,计算每个平均值都要花费很长的时间,即使是拆分为多个线程,我希望得到一个运行速度更快的更好的解决方案。在
我在ec2r4.4xlarge实例上运行这个。在
我已经尝试过切换到doc2vec,这要快得多,但是结果不如word2vec的简单平均值。在word2vec_aug_32x = Word2Vec(sentences=sentences,
min_count=1000,
size=32,
window=2,
workers=16,
sg=0)
vocab_arr = np.array(list(word2vec_aug_32x.wv.vocab.keys()))
def get_embedded_average(sentence):
sentence = np.intersect1d(sentence, vocab_arr)
if sentence.shape[0] > 0:
return np.mean(word2vec_aug_32x[sentence], axis=0).tolist()
else:
return np.zeros(32).tolist()
pool = multiprocessing.Pool(processes=16)
w2v_averages = np.asarray(pool.map(get_embedded_average, np.asarray(sentences)))
pool.close()
如果你有什么不同的算法或技术的建议,有相同的目的,句子嵌入,并能解决我的问题,我很乐意阅读。在