2016-07-30 73 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

相关问题