2016-01-04 66 views
1

我正在使用SciKit學習對大數據集(+ - 34.000文件)執行一些分析。現在我在想。 HashingVectorizer旨在減少內存使用量。是否有可能首先將一堆文件轉換爲HashingVectorizer對象(使用pickle.dump),然後將所有這些文件一起加載並將它們轉換爲TfIdf特性?這些功能可以通過HashingVectorizer進行計算,因爲存儲了計數並且可以推導出文檔的數量。我現在有以下幾點:scikit-learn-Tfidf on HashingVectorizer

for text in texts: 
    vectorizer = HashingVectorizer(norm=None, non_negative=True) 
    features = vectorizer.fit_transform([text]) 
    with open(path, 'wb') as handle: 
     pickle.dump(features, handle) 

然後,加載文件很簡單:

data = [] 
for path in paths: 
    with open(path, 'rb') as handle: 
     data.append(pickle.load(handle)) 
tfidf = TfidfVectorizer() 
tfidf.fit_transform(data) 

但是,魔術不會發生。我怎樣才能讓魔法發生?

回答

0

我對你的循環

for text in texts: 
    vectorizer = HashingVectorizer(norm=None, non_negative=True) 
    features = vectorizer.fit_transform([text]) 

每次時間很擔心再適合您vectoriser,也許會忘記它的詞彙,因此,在每個向量中的條目將不對應相同的話(不知道這個我猜這取決於他們如何做哈希);爲什麼不適合它的整個語料庫,即

features = vectorizer.fit_transform(texts) 

對於你的實際問題,這聽起來像你只是想一定要規範你data矩陣由以色列國防軍的列;你應該可以直接在數組上做這件事(我已經轉換爲numpy數組,因爲我無法計算出scipy數組上的索引是如何工作的)。

import numpy as np 
X = np.array(features.todense()) 
DF = (X != 0).sum(axis=0) 
X_TFIDF = X[:,DF != 0]/DF[DF != 0] 
+0

功能散列的想法是您不存儲詞彙表。矢量化器應該是無狀態的。 –

1

看來問題是你試圖向量化你的文字兩次,因爲你使用具有2^20列中的散列vectoriser面具DF != 0是必要的。一旦建立了計數矩陣,您應該可以使用sklearn.feature_extraction.text.TfidfTransformer而不是TfidfVectorizer將計數轉換爲tf-idf功能。

另外,看起來您保存的數據是一個稀疏矩陣。您應該使用scipy.sparse.vstack()來堆積加載的矩陣,而不是將矩陣列表傳遞到TfidfTransformer