簡體   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