2016-07-30 76 views
1

我需要處理超過1,000,000條文本記錄。我正在使用CountVectorizer來轉換我的數據。我有以下代碼。sklearn中的矢量化似乎非常昂貴。爲什麼?

TEXT = [data[i].values()[3] for i in range(len(data))] #these are the text records 

from sklearn.feature_extraction.text import CountVectorizer 
vectorizer = CountVectorizer(min_df=1) 
X = vectorizer.fit_transform(TEXT) 


X_list = X.toarray().tolist() 

當我運行此代碼時,事實證明MemoryError。我擁有的文字記錄大部分是短文(約100字)。矢量化似乎非常昂貴。

UPDATE

我增加了更多的約束CountVectorizer但仍然有MemoeryError。的feature_names長度爲2391

from sklearn.feature_extraction.text import CountVectorizer 
vectorizer = CountVectorizer(min_df=0.003,max_df = 3.05, lowercase = True, stop_words = 'english') 
X = vectorizer.fit_transform(TEXT) 
feature_names = vectorizer.get_feature_names() 

X_tolist = X.toarray().tolist() 

Traceback (most recent call last): 
File "nlp2.py", line 42, in <module> 
X_tolist = X.toarray().tolist() 
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 940, in toarray 
return self.tocoo(copy=False).toarray(order=order, out=out) 
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/coo.py", line 250, in toarray 
B = self._process_toarray_args(order, out) 
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/base.py", line 817, in _process_toarray_args 
return np.zeros(self.shape, dtype=self.dtype, order=order) 
MemoryError 

爲何如此,如何用它來解決?謝謝!!

+1

你可以給我們訪問到你的數據集?此外,哪一行是MemoryError?你能給我們跟蹤嗎? – bpachev

+0

感謝bpachev,我不知道如何讓你訪問數據集,因爲它是在一個安全的遠程服務器。 MemoryError只有當我執行X_list = X.toarray()時纔會出現tolist()'我被告知設置min和max_df,我只有min。 – achimneyswallow

回答

2

您的問題是X是一個稀疏矩陣,每個文檔有一行表示哪個單詞出現在該文檔中。如果您有一百萬個文檔,總共包含2391個不同的單詞(您的問題中提供了長度的feature_names),則x的密集版本中的條目總數大約爲20億,足以潛在地導致內存錯誤。

問題是這條線X_list = X.toarray().tolist()將X轉換爲密集陣列。你沒有足夠的內存,並且應該有一種方法可以去做你沒有它的事情(因爲稀疏版本的X有你需要的全部信息)。

+0

是的,事實的確如此,稀疏版本的X包含了所有的信息我需要 - 我一直在轉換,只要我需要適應一個模型,並最終意識到這是沒有必要的,以艱苦的方式學習。 – achimneyswallow

相關問題