我如何优化我在庞大数据集上的嵌入转换?
How can i optimize my Embedding transformation on a huge dataset?
我使用 gensim
包中的 FastText,我使用下面的代码将我的文本转换为密集的表示形式,但是当我有一个巨大的数据集时,这需要很多次。
你能帮我加速一下吗?
def word2vec_features(self, templates, model):
if self.method == 'mean':
feats = np.vstack([sum_vectors(p, model) / len(p) for p in templates])
else:
feats = np.vstack([sum_vectors(p, model) for p in templates])
return feats
def get_vect(word, model):
try:
return model.wv[word]
except KeyError:
return np.zeros((model.size,))
def sum_vectors(phrase, model):
return sum(get_vect(w, model) for w in phrase)
请注意,这种文本的摘要向量——所有词向量的平均值(或总和)——相当粗糙。它在某些情况下可以作为基线工作——例如短文本中的模糊信息检索,或作为分类器输入。
在某些情况下,如果 KeyError
经常被命中,异常处理可能会很昂贵 - 而检查一个键是否是 in
集合可能是有意义的。而且,您可能不希望对任何缺失的词使用原始向量(全为零)——它可能比跳过这些词没有任何好处。
因此,您可以通过更改代码以忽略丢失的单词来获得一些加速,而不是在异常处理程序中添加全零向量。
而且:如果你真的使用 FastText
模型(而不是说 Word2Vec
),它将 永远不会 KeyError
对于未知单词,因为它总是会从训练期间学习的字符 n-gram(单词片段)中合成一个向量。您可能应该完全放弃 get_vect()
功能 - 仅依赖于正常的 []
-access.
此外,Gensim 的 KeyedVector
模型已经支持在由多个键的列表索引时返回多个结果。而且,numpy
np.sum()
在这些数组上的运行速度可能比纯 Python sum()
快一点。因此,如果将 sum_vectors()
替换为:
,您可能会获得小幅加速
def sum_vectors(phrase, model):
return np.sum(model.wv[phrase], axis=0)
要进一步优化,您可能需要分析大量使用循环中的代码,甚至重新考虑这是否是您想要追求的文本矢量化形式。 (不过,更好的方法通常需要比这个简单的方法更多的计算 sum/average。)
我使用 gensim
包中的 FastText,我使用下面的代码将我的文本转换为密集的表示形式,但是当我有一个巨大的数据集时,这需要很多次。
你能帮我加速一下吗?
def word2vec_features(self, templates, model):
if self.method == 'mean':
feats = np.vstack([sum_vectors(p, model) / len(p) for p in templates])
else:
feats = np.vstack([sum_vectors(p, model) for p in templates])
return feats
def get_vect(word, model):
try:
return model.wv[word]
except KeyError:
return np.zeros((model.size,))
def sum_vectors(phrase, model):
return sum(get_vect(w, model) for w in phrase)
请注意,这种文本的摘要向量——所有词向量的平均值(或总和)——相当粗糙。它在某些情况下可以作为基线工作——例如短文本中的模糊信息检索,或作为分类器输入。
在某些情况下,如果 KeyError
经常被命中,异常处理可能会很昂贵 - 而检查一个键是否是 in
集合可能是有意义的。而且,您可能不希望对任何缺失的词使用原始向量(全为零)——它可能比跳过这些词没有任何好处。
因此,您可以通过更改代码以忽略丢失的单词来获得一些加速,而不是在异常处理程序中添加全零向量。
而且:如果你真的使用 FastText
模型(而不是说 Word2Vec
),它将 永远不会 KeyError
对于未知单词,因为它总是会从训练期间学习的字符 n-gram(单词片段)中合成一个向量。您可能应该完全放弃 get_vect()
功能 - 仅依赖于正常的 []
-access.
此外,Gensim 的 KeyedVector
模型已经支持在由多个键的列表索引时返回多个结果。而且,numpy
np.sum()
在这些数组上的运行速度可能比纯 Python sum()
快一点。因此,如果将 sum_vectors()
替换为:
def sum_vectors(phrase, model):
return np.sum(model.wv[phrase], axis=0)
要进一步优化,您可能需要分析大量使用循环中的代码,甚至重新考虑这是否是您想要追求的文本矢量化形式。 (不过,更好的方法通常需要比这个简单的方法更多的计算 sum/average。)