【问题标题】:How can i optimize my Embedding transformation on a huge dataset?如何在庞大的数据集上优化嵌入转换?
【发布时间】:2020-11-13 08:35:56
【问题描述】:

我使用 gensim 包中的 FastText,并使用下面的代码将我的文本转换为密集的 a 表示,但是当我有一个庞大的数据集时需要很多次。 你能帮我加速吗?

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)

【问题讨论】:

  • 您提供的 sn-p 不是 MRE,因此很难说出如何提高性能。

标签: python python-3.x numpy gensim fasttext


【解决方案1】:

请注意,文本的这种摘要向量——所有词向量的平均值(或总和)——相当粗糙。在某些情况下,它可以作为基线正常工作——例如短文本中的模糊信息检索,或作为分类器输入。

在某些情况下,如果 KeyError 经常被命中,那么异常处理可能会很昂贵 - 而检查一个键是否是 in 集合可能是有意义的。但是,您可能不希望对任何缺失的单词使用原点向量(全为零) - 与跳过这些单词相比,它可能没有任何好处。

因此,您可以通过更改代码以忽略丢失的单词来获得一些加速,而不是在异常处理程序中添加全零向量。

而且:如果你真的使用FastText 模型(而不是说Word2Vec),它永远不会 KeyError 用于一个未知词,因为它总是会合成一个从训练期间学习的字符 n-gram(单词片段)中提取向量。您可能应该完全放弃您的 get_vect() 功能 - 仅依赖正常的 []-access。

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2016-04-19
    • 2022-01-11
    • 1970-01-01
    • 2012-09-23
    • 2020-06-05
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多