我使用Gensim
Word2Vec
来训练数据库中的单词集。
我的PostgreSQL
数据库中有大约400,000个短语(每个短语很短。总计700MB)。
这是我使用Django ORM
训练这些数据的方法:
post_vector_list = []
for post in Post.objects.all():
post_vector = my_tokenizer(post.category.name)
post_vector.extend(my_tokenizer(post.title))
post_vector.extend(my_tokenizer(post.contents))
post_vector_list.append(post_vector)
word2vec_model = gensim.models.Word2Vec(post_vector_list, window=10, min_count=2, size=300)
但这项工作花了很多时间,感觉效率不高。
特别是,创建post_vector_list
部分需要花费大量的时间和空间..
我想提高培训速度,但不知道该怎么做。
想要得到你的意见。感谢。
答案 0 :(得分:1)
你可以使用python生成器而不是将所有数据加载到列表中。 Gensim也使用python生成器。代码看起来像这样
class Post_Vectors(object):
def __init__(self, Post):
self.Post = Post
def __iter__(self):
for post in Post.objects.all():
post_vector = my_tokenizer(post.category.name)
post_vector.extend(my_tokenizer(post.title))
post_vector.extend(my_tokenizer(post.contents))
yield post_vector
post_vectors = Post_Vectors(Post)
word2vec_model = gensim.models.Word2Vec(post_vectors, window=10, min_count=2, size=300, workers=??)
对于gensim加速,如果您有多核CPU,则可以使用workers
参数。 (默认情况下为3)
答案 1 :(得分:1)
要优化此类代码,您需要收集有关时间花费的详细信息。
大部分时间都在准备post_vector_list
吗?
如果是这样,您需要确保my_tokenizer
(其代码未显示)尽可能高效。您可能希望尽量减少在大型列表上执行的extend()
和append()
的数量。您甚至可能需要查看数据库的配置或选项,以加快在Post.objects.all()
内启动的数据库到对象的映射。
大部分时间花在Word2Vec()
的电话上吗?
如果是这样,其他步骤可能会有所帮助:
workers=4
或workers=8
可选参数来使用更多线程min_count
,这会加速训练(并且因为只有少数几个例子的单词的向量通常不是很好,所以不会损失很多,甚至可以提高质量幸存的话语)window
,因为对于较大的窗口,培训需要更长的时间size
,因为对于较大尺寸的向量,训练需要更长的时间sample
参数使用更具侵略性(更小)的值,该参数随机跳过更多最频繁的单词。默认值为1e-04
,但1e-05
或1e-06
的值(尤其是较大的语料库)可提供额外的加速,甚至经常改善最终向量(通过在单词上花费相对较少的培训时间)使用过量的例子)iter
参数使用低于默认值(5)的值。 (除非语料库非常大,否则我不建议这样做 - 所以它在整个过程中都有许多冗余的,同样好的例子。)