繁体   English   中英

我如何优化我在庞大数据集上的嵌入转换?

[英]How can i optimize my Embedding transformation on a huge dataset?

我使用来自gensim package 的 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 model (而不是说Word2Vec ),它永远不会出现未知单词的KeyError ,因为它总是会从它在训练期间学到的字符 n-gram(单词片段)合成一个向量. 您可能应该完全放弃get_vect() function - 仅依赖于正常的[] -access。

此外,Gensim 的KeyedVector模型已经支持在由多个键的列表索引时返回多个结果。 而且, numpy np.sum()在这些 arrays 上的运行速度可能比纯 Python sum()快一点。 因此,如果将sum_vectors()替换为:

def sum_vectors(phrase, model):
    return np.sum(model.wv[phrase], axis=0)

要进一步优化,您可能需要分析大量使用循环中的代码,或者甚至重新考虑这是否是您想要追求的文本矢量化形式。 (不过,更好的方法通常需要比这个简单的总和/平均值更多的计算。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM